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