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;
}