Laboratorium programowania zad 14

Zadanie z laboratorium programowania na Informatyce UW.

Zadanie 14 (termin wysylania rozwiazan: 14 maja 2008, godz. 23:59)

(Liczby w kolumnach)

Napisz program, ktory wczyta z wejscia ciagi liczb calkowitych zakonczone
zerami i wypisze je na wyjscie w kolumnach.

Postac danych:

Na wejsciu programu znajdzie sie N ciagow liczb calkowitych. W kazdym ciagu
bedzie K wartosci niezerowych zakonczonych zerem. Liczby ciagow (N) i
dlugosci kazdego ciagu (K) nie znamy - beda zalezaly od danych.

Program powinien sprawdzac, czy wszystkie ciagi sa tej samej dlugosci (K).
Gdyby tak nie bylo, program powinien wypisac na wyjscie slowo "blad".

Postac wyniku:

Program wypisze na wyjscie K wierszy, w kazdym po N liczb. W pierwszym
wierszu znajdzie sie pierwsza liczba kazdego ciagu, w drugim druga liczba itd.

Liczby wypisujemy w kolumnach o szerokosci 10 znakow, z wyrownaniem do prawej
krawedzi kolumny.

Np. dla danych:

1 2 3 0 10 20 30 0 100 200 300 0 1000 2000 3000 0

program powinien wypisac:

         1        10       100      1000
         2        20       200      2000
         3        30       300      3000

Wskazowka 1:

Wymagana szerokosc kolumny i wyrownanie liczby da nam wywolanie funkcji
printf z pierwszym parametrem "%10d".

Wskazowka 2:

Liczby wczytane z wejscia mozna przechowywac na liscie list (lista ciagow,
dla kazdego ciagu lista liczb).

A oto rozwiązanie:

#include 
#include 
#include 

//Bedziemy przechowywac liczby w liscie dwuwymiarowej
typedef struct liczba_el{     
      int var;           
      struct liczba_el * nastepny; 
};


struct seria_el {
      struct liczba_el * liczba;    
      struct seria_el* nastepny; 
};



int main (int argc, char *argv[])
{
	int liczba,seria,w_serii,ilosc_serii,wynik,i,j,k;
	struct liczba_el *teraz_liczba=NULL;
	struct liczba_el *tmp_liczba=NULL;
	struct seria_el *teraz_seria=NULL;
	struct seria_el *tmp_seria=NULL;
	struct seria_el *start=NULL;


	//pierwszy element pierwszej serii
	start=malloc(sizeof(start));
	start->liczba=malloc(sizeof(teraz_liczba));
	start->nastepny=NULL;
	start->liczba->nastepny=NULL;
	teraz_seria=start;
	teraz_liczba=start->liczba;
	
	wynik=scanf("%d",&liczba);

	teraz_liczba->var=liczba;			//
	wynik=scanf("%d",&liczba);
	
	seria=0;
	w_serii=1;
	ilosc_serii=1;
	

	while(wynik!=EOF)
	{
		if(liczba==0)
		{
			//koniec serii
			wynik=scanf("%d",&liczba);

				if(seria==0)
				{
					//jesli koniec pierwszej serii
					seria=w_serii;
				}
				else if(w_serii!=seria)
				{
					//w tej serii inna ilosc danych
					printf("blad");
					exit(1);
				}
				
			if(wynik!=EOF)
			{
				//jesli nie jest to ostatnia seria
				w_serii=1;
				ilosc_serii++;
				//nowa seria
				teraz_seria->nastepny=malloc(sizeof(start));
				teraz_seria=teraz_seria->nastepny;
					
				teraz_seria->liczba=malloc(sizeof(tmp_liczba));
				teraz_liczba=teraz_seria->liczba;
				teraz_liczba->nastepny=NULL;
				teraz_seria->nastepny=NULL;
				teraz_liczba->var=liczba;
			}
		}
		else
		{
			w_serii++;
			//Nowa liczba w serii.
			teraz_liczba->nastepny=malloc(sizeof(teraz_liczba));
			teraz_liczba=teraz_liczba->nastepny;
			teraz_liczba->var=liczba;		//
		}

		wynik=scanf("%d",&liczba);

	}
//Wczytane.
	
//I teraz trzeba wypisac!!
	

	for(i=0;i<seria;i++)
	{
		//ilosc wierszy - rozmiar serii.
		teraz_seria=start;
		
		for(j=0;jliczba;
			
			for(k=0;knastepny;
			}
			//Zwyczajnie wypisujemy
			printf("%10d",teraz_liczba->var);
			//i przechodzimy do nastepnej serii.
			teraz_seria=teraz_seria->nastepny;
		}
		printf("n");
	}
	
	//no dobrze, ale tez byloby milo po sobie posprzatac.
	
	teraz_seria=start;
	while(teraz_seria!=NULL)
	{
		teraz_liczba=teraz_seria->liczba;
		
		while(teraz_liczba!=NULL)
		{
			tmp_liczba=teraz_liczba;
			teraz_liczba=teraz_liczba->nastepny;
			free(tmp_liczba);
		}
	
		tmp_seria=teraz_seria;
		teraz_seria=teraz_seria->nastepny;
		free(tmp_seria);
	}

return 0;
}

Leave a Reply