raven_ns Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 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;} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ragnor Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 (edytowane) 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 11 Stycznia 2006 przez Ragnor Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
raven_ns Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 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 :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ragnor Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 (edytowane) 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 11 Stycznia 2006 przez Ragnor Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
raven_ns Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 Wielkie dzieki :)) juz wszystko chodzi tak jak powinno Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Artur.M Opublikowano 11 Stycznia 2006 Zgłoś Opublikowano 11 Stycznia 2006 myślę że nie było by tego problemu jak byś na samym początku stworzył zmienną kop o jeden większą i wypełnił całą zerami Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Sam Sung Opublikowano 12 Stycznia 2006 Zgłoś Opublikowano 12 Stycznia 2006 myślę że nie było by tego problemu jak byś na samym początku stworzył zmienną kop o jeden większą i wypełnił całą zeramiByłaby to alokacja niepotrzebnej pamięci i wykonywanie niepotrzebnej operacji. Lepiej wyrabiać sobie dobre nawyki :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Artur.M Opublikowano 12 Stycznia 2006 Zgłoś Opublikowano 12 Stycznia 2006 co do pierwszego się nie zgodze bo ta pamięć i tak jest już zaalokowana. Ja bym tylko tam zamiast jakis "śmieci" wstawił zera. No ale z drugij strony można sie objeść bez tego tylko że potem są taki kwiatki ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kobe2005 Opublikowano 12 Stycznia 2006 Zgłoś Opublikowano 12 Stycznia 2006 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 :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 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ść... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 15 Stycznia 2006 Zgłoś Opublikowano 15 Stycznia 2006 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 15 Stycznia 2006 Zgłoś Opublikowano 15 Stycznia 2006 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 ^^ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ULLISSES Opublikowano 15 Stycznia 2006 Zgłoś Opublikowano 15 Stycznia 2006 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? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ragnor Opublikowano 15 Stycznia 2006 Zgłoś Opublikowano 15 Stycznia 2006 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ć ;). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 15 Stycznia 2006 Zgłoś Opublikowano 15 Stycznia 2006 (edytowane) 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 15 Stycznia 2006 przez razor1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...