Zadanie z laboratorium programowania na Informatyce UW.
Zadanie 12 (termin wysylania rozwiazan: 23 kwietnia 2008, godz. 23:59) (Kolumny jeszcze raz) Napisz program, ktory wczyta z wejscia tekst w dwoch kolumnach rozdzielonych spacja, znakiem '|' i jeszcze jedna spacja i wypisze go na wyjscie w jednej kolumnie. Dane programu beda mialy format podobny do wyniku programu numer 7 (z Pascala). Jedyna roznica bedzie dotyczyla ostatniego wiersza. Jesli jest w nim tylko tekst pierwszej kolumny (jak w przykladzie ponizej), wiersz bedzie zakonczony znakiem '|' bez nastepujacej po nim spacji. Program powinien wypisac na wyjscie najpierw zawartosc calej pierwszej kolumny danych, a nastepnie drugiej. Ma wiec odwrocic wynik dzialania programu numer 7. Mozna zalozyc, ze w kazdym wierszu danych znak '|' wystapi tylko raz i bedzie sluzyl wylacznie do oddzielania kolumn. Program nie powinien wypisywac na wyjscie spacji konczacych wiersze pierwszej kolumny, czyli tych, ktore program numer 7 dopisywal, by wyrownac znaki '|'. Np. dla danych: ala ma kota | azor to pies eli to jest kot ali | ola nie ma psa ela ma psa | program powinien wypisac: ala ma kota to jest kot ali ela ma psa azor to pies eli ola nie ma psa Uwaga: Nie wolno nakladac ograniczen na maksymalna dlugosc wiersza danych, ani na liczbe wierszy. Wskazowka: Wczytujac dane, zawartosc pierwszej kolumny kopiuj bezposrednio na wyjscie, a zawartosc drugiej wpisuj do pomocniczego pliku tekstowego. Na zakonczenie przepisz zawartosc tego pliku na wyjscie.
A oto rozwiązanie:
#include int main(void) { FILE *f; char znak; int i,wynik,spacji; //Zrobimy tak jak we wskazowce. Wiersze po | zapiszemy w pliku tymczasowym. spacji=0; f=fopen("tymczasowy","w"); wynik = scanf("%c", &znak); while(wynik!=EOF) { while ((znak!='|')&&(wynik!=EOF)) { //znaki przed | if (znak==' ') { //Spacja. Jesli nie jest spacja wyrownujaca, zostawnie wypisana przed nastepnym znakiem spacji=spacji+1; } else { i=0; while(i<spacji) { //wypiszemy zapamietane spacje. printf(" "); i++; } spacji=0; //no i znak. printf("%c",znak); } wynik = scanf("%c", &znak); } if (znak=='|') { spacji=0; wynik = scanf("%c", &znak); if (znak==' ') { //Cos tu bedzie dalej napisane. printf("n"); wynik = scanf("%c", &znak); //koncowka linii. while (znak!='n') { //do konca linii. fprintf(f,"%c",znak); wynik = scanf("%c", &znak); } fprintf(f,"n"); } } wynik = scanf("%c", &znak); }//ok, teraz polowa na wyjciu, polowa w pliku. wypisujemy plik. fclose(f); //Zapisalismy do pliku pomocniczego. teraz go przeczytamy. f=fopen("tymczasowy","r"); wynik = fscanf(f,"%c", &znak); while(wynik!=EOF) { printf("%c",znak); wynik=fscanf(f,"%c",&znak); } fclose(f); return 0; }