Laboratorium programowania zad 12

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

Leave a Reply