Skocz do zawartości
raven_ns

Anagram W C

Rekomendowane odpowiedzi

Witam zajolem sie ostanio takim programikiem jak anagram , czyli program ma wypisac w ciagu wyrazy w odwrotnej koloejnosci niz byly wpisane, napisalem kod i wydawalo mi sie ze powinno wszystko w pozadku dzialac jednak spodkal mnie maly problem poniewaz program nie wyspisuje ostaniego znaku a jedynie jakis slaczek dziwnych znaczkow. Jezeli ktos wie godzie zrobilem blad prosze o rade , poniewaz dopiero zaczynam pisac i czasami moge miec bledny tok rozumowania,ale jak wiadomo umysl sie formuje ;)

 

#include <stdio.h>#include <stdlib.h>int main(){   		int x,z;	char org[30] ,kop[30];	x=0;	z=0;	printf("Podaj slowo z ktorego chcesz zrobic anagram\n");		scanf("%s",&org);			while (org[x]!=0){	x++; } /* od tej chwili wiemy ile wyraz ma liter tak wiec mozemy zaczac go wypisywac do nowej tabliczki*/			printf("Slowo %s ma %d znakow\n",org,x);		x=x-1; /*zmiejszamy licznik  o jeden poniewaz liczniki ida od 0 a nie od 1 */			while(x>0)		  {		  		  kop[z]=org[x];		  z++;		  x--;		  };	    printf("Slowo na poczatku wygladalo %s a jego anagram to %s\n", org ,kop);    system("PAUSE");	  return 0;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam zajolem sie ostanio takim programikiem jak anagram , czyli program ma wypisac w ciagu wyrazy w odwrotnej koloejnosci niz byly wpisane, napisalem kod i wydawalo mi sie ze powinno wszystko w pozadku dzialac jednak spodkal mnie maly problem poniewaz program nie wyspisuje ostaniego znaku a jedynie jakis slaczek dziwnych znaczkow. Jezeli ktos wie godzie zrobilem blad prosze o rade , poniewaz dopiero zaczynam pisac i czasami moge miec bledny tok rozumowania,ale jak wiadomo umysl sie formuje ;)

 

#include <stdio.h>#include <stdlib.h>int main(){   		int x,z;	char org[30] ,kop[30];	x=0;	z=0;	printf("Podaj slowo z ktorego chcesz zrobic anagram\n");		scanf("%s",&org);			while (org[x]!=0){	x++; } /* od tej chwili wiemy ile wyraz ma liter tak wiec mozemy zaczac go wypisywac do nowej tabliczki*/			printf("Slowo %s ma %d znakow\n",org,x);		x=x-1; /*zmiejszamy licznik  o jeden poniewaz liczniki ida od 0 a nie od 1 */			while(x>0)		  {		  		  kop[z]=org[x];		  z++;		  x--;		  };	    printf("Slowo na poczatku wygladalo %s a jego anagram to %s\n", org ,kop);    system("PAUSE");	  return 0;}

Tablice w C są numerowane od zeraz, więc pierwszy element znaduje się w org[0], toteż musisz zmienić warunek pętli while na:

while(x >= 0) {....}
powinno wtedy działać. Edytowane przez Ragnor

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tablice w C są numerowane od zeraz, więc pierwszy element znaduje się w org[0], toteż musisz zmienić warunek pętli while na:

while(x >= 0) {....}
powinno wtedy działać.

 

Zmienilem to w petli tak jak powiedziales ale problem wystepuje nadal (wypisuje odwrotnie caly wyraz a oprocz tego jeszcze jakies znaczki) chyba jednak nie w tym tkwi blad, mimo to dzieki za odpowiedz :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zmienilem to w petli tak jak powiedziales ale problem wystepuje nadal (wypisuje odwrotnie caly wyraz a oprocz tego jeszcze jakies znaczki) chyba jednak nie w tym tkwi blad, mimo to dzieki za odpowiedz :)

Sory zbłaźniłem się, ale już mówię w czym rzecz. Problem lezy w tym jak Ty drukujesz te stringi, aby były prawidłowo drukowane musisz wstawić znak końca stringu ('\0') w odpowiedni element tablicy znaków, tuż za ostatnim użytym elementem, inaczej będą drukowane wszystkie informacje z tablicy, które powstały tam podczas przydzielania pamięci.

int main(){	int x,z;	char org[30] ,kop[30];	x=0;	z=0;	printf("Podaj slowo z ktorego chcesz zrobic anagram\n");		x = scanf("%s",&org);	while (org[x]!=0){	x++; } /* od tej chwili wiemy ile wyraz ma liter tak wiec mozemy zaczac go wypisywac do nowej tabliczki*/   /* org[x] = '\0';  tego nie trzeba bo scanf wstawia na koniec ten znak */	printf("Slowo %s ma %d znakow\n",org,x);	x=x-1; /*zmiejszamy licznik  o jeden poniewaz liczniki ida od 0 a nie od 1 */		while(x>=0)		  {		  kop[z]=org[x];		  z++;		  x--;		  };  kop[z] ='\0';  printf("Slowo na poczatku wygladalo %s a jego anagram to %s\n", org ,kop);  system("PAUSE");  return 0;}

sprawdź teraz.

Edytowane przez Ragnor

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skoro ten program ma tylko wypisac anagram, a staramy sie byc oszczedni to mozemy zrezygnowac z drugiej tablicy. Zamiast tego poprostu wyswietlac po znaku z tablicy od ostatniego elementu. Efektem bedzie wlasnie wypisany anagram.

To tak jako ciekowstke napisalem :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jakja pisałem takie akademicke programy to moim pierwszym nawykiem było zapełnianie tablic znakowych zerami.. ( memset() bodajże...) Oszczedzało to potem kłopotów z naruszaniem pamięci.

 

co do alokacji zbednej pamieci (mimo ze tu taka nie występuje) to nie przesadzajcie... do takeij tablicy wykorzystacie parenaście bajtów pamieci w plecy... a macie w kompie 1GB.. miliard razy więcej... zeby ja znakami zapełnić to byście musieli klepać w kalwiaturę kilka lat nieustannie... :). Spójrzcie na javę chociazby.. tam se tworzysz obiekty jak chcesz i kiedy chcesz... nie przejmujesz się że zajmie Ci to tyle a tyle bajtów.. Pisząc zwykłe programy możecie w ogóle zapomnieć o czymś takim jak ograniczenie pamięci.... deklarujcie sobie tyle pamięci ile wam potrzeba... komputer od tego nie zbladnie... Zazwyczaj pzreciętne programy i tak nie biorą wiecej niz 5MB ramu.. i to dane uzytkownika to jest mniejszość...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

I dlatego właśnie programy w Javie są takie "szybkie" :D

 

Wracając do tematu:

Jeśli program ma tylko wypisać - nie musi zmieniać oryginalnej tablicy znaków, to nie ma sensu używać drugiej tablicy - można (jak zauważył kobe2005) wypisać tablicę od tyłu. Cały haczyk w tym, aby wiedzieć, ile znaków jest w tablicy - unikniemy wypisywania śmieci z pamięci.

 

Jeśli zaś trzeba zamienić znaki w tablicy, to można użyć drugiej tablicy, ale i wtedy nie jest ona konieczna - na jednej też idzie się wyrobić (używając pomocniczej zmiennej).

 

Co do zapełniania pamięci zerami, to nie widzę powodu takiego działania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

co do alokacji zbednej pamieci (mimo ze tu taka nie występuje) to nie przesadzajcie... do takeij tablicy wykorzystacie parenaście bajtów pamieci w plecy... a macie w kompie 1GB.. miliard razy więcej... zeby ja znakami zapełnić to byście musieli klepać w kalwiaturę kilka lat nieustannie... :). Spójrzcie na javę chociazby.. tam se tworzysz obiekty jak chcesz i kiedy chcesz... nie przejmujesz się że zajmie Ci to tyle a tyle bajtów.. Pisząc zwykłe programy możecie w ogóle zapomnieć o czymś takim jak ograniczenie pamięci.... deklarujcie sobie tyle pamięci ile wam potrzeba... komputer od tego nie zbladnie... Zazwyczaj pzreciętne programy i tak nie biorą wiecej niz 5MB ramu.. i to dane uzytkownika to jest mniejszość...

Zgadza sie, niestety wiele osób jest przewrażliwionych na punkcie alokowania pamieci itp.

 

A co do ekstremalnych sposobów robienia anagramu mozna skorzystać z właściwości jakie daje nam stos. Przykładowy kod.

 

using System;using System.Collections.Generic;using System.Text;class Program{	static void Main(string[] args)	{		Stack<char> anagram = new Stack<char>();		string napis = "Grzegorz Brzęczyszczykiewicz";		StringBuilder anagramNapisu = new StringBuilder();		foreach (char c in napis)			anagram.Push(c);		while (anagram.Count > 0)			anagramNapisu.Append(anagram.Pop());		Console.WriteLine("napis: {0}\nanagram: {1}", napis, anagramNapisu);	}}

Swoją drogą ciekawe co robił by ten Niemiec z Jak rozpętałem 2 wojne światową jakby musiał przeczytac nazwisko głównego bohatera wspak ^^

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wszystko fajnie, tylko czy to nie jest w C# dla platformy .NET?

Pytam, bo kompilator z Visual Studio 6 nie ma pojęcia, jak to ugryść. Możnaby powiedzieć "trudno", ale problem w tym, iż większość uczelni opiera się właśnie na tej werji, bo na nią mają podpisaną umowę z MS.

 

Nie mniej algorytm bardzo interesujący. Pod czym można go poprawnie skompilować prócz VS2005 (i pewnie NET)? DevC++ da radę?

Może jakieś zmiany kosmetyczne/dołączenie biblioteki uruchomią to pod VS6?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wszystko fajnie, tylko czy to nie jest w C# dla platformy .NET?

Pytam, bo kompilator z Visual Studio 6 nie ma pojęcia, jak to ugryść. Możnaby powiedzieć "trudno", ale problem w tym, iż większość uczelni opiera się właśnie na tej werji, bo na nią mają podpisaną umowę z MS.

Z tego ci się ja orientuje akurat MS wpycha na uczelniach swoje oprogramowanie za doramo, przynajmnie u mnie można dostac legalne z licencją wszelkie Windowse, Office, Visuale i co tylko dusza zapragnie. Wiadomo że MS ma w tym taki interes aby ludzi od swego oprogramowanie uzależnić ;), by gdy wkońcu przestańa dawąc sam zapłacisz aby mieć ;).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

C# 2.0 jak narazie. Oczywiście nie trzeba używać środowiska żadnego. We frameworku 2.0 jest darmowy kompilator z lini poleceń za pomocą którego mozna zrobic każdy program jaki w VS .NET takie jakby make a w sumie to jest make jakby nie patrzeć. W VC to jedynie w STL lub jakimś swoim stosem.

 

Start->Uruchom:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe c:\kod.cs

 

a program exe zostanie wypluty w tym kagalogu gdzie csc.exe

Edytowane przez razor1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...