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