Ćwiczenie 3

Programowanie w języku ANSI C

Wejście i wyjście znakowe.



Zadanie 1

Napisać program kopiujący standardowe wejście na wyjście.

1.      Wczytać zbiór nagłówkowy standardowej biblioteki wejścia – wyjścia.

2.      Zdefiniować funkcję główną programu.

3.      Zadeklarować zmienną znakową, w której będą zapisywane wczytywane znaki.

4.      Zadeklarować pętlę, która będzie wykonywana dopóki wczytywany znak nie będzie znakiem końca pliku. W pętli powinny być wykonywane operacje wczytywania
i wypisywania znaków (funkcje getchar() i putchar()).



Zadanie 2

Zmodyfikować program z zadanie pierwszego, tak aby liczył wczytywane znaki i wiersze, a wyniki liczenia był wypisywany na ekranie.




Zadanie 3

Napisać program, który oblicza wystąpienie w wczytywanym tekście każdej z cyfr, białych znaków oraz pozostałych znaków.

1.      Wczytać zbiór nagłówkowy standardowej biblioteki wejścia – wyjścia.

2.      Zdefiniować funkcję główną programu.

3.      Zadeklarować całkowitą tablicę 10 – elementową, której poszczególne elementy będą odpowiadać wystąpieniu poszczególnych cyfr, oraz dwie zmienne całkowite, które będą licznikami białych znaków i znaków

4.      Zadeklarować zmienną znakową, w której będą zapisywane wczytywane znaki oraz całkowitą zmienną pomocniczą, która będzie licznikiem pętli for.

5.      Zainicjować wartości w tablicy oraz liczników znaków na zero.

6.      Stworzyć pętlę, która będzie wykonywana dopóki wczytywany znak nie będzie znakiem końca pliku. W pętli powinny być wykonywane operacje:

7.      Wypisać wyniki liczenia na ekranie.




Zadanie 4

Napisać program tworzący histogram wystąpienia cyfr, białych oraz pozostałych znaków we wprowadzanym tekście.



Opracowano na podstawie: B. W. Kernighan, D. M. Ritchie „Język Ansi C”, Wydawnictwa Naukowo - Techniczne, Warszawa, 2003.


 


#include <stdio.h>
#define szerokosc 50 //zdefiniowanie szerokosci histogramu (50 znakow #)

int main(void)
{
   // Deklaracja zmiennych
   char znak;
   int pozostale=0, wiersze=0, biale=0;
   int cyfry[10];
   int i;
   int suma=0;
   int histogram=0;

   // Inicjalizacja wartości tablicy
   for(i=0;i<10;i++)
     cyfry[i]=0;

   // Pętla główna programu
   znak=getchar(); // wczytanie znaku
   while (znak!=EOF) // wykonuje się do wczytania znaku końca pliku CTRL+Z
   {
     znak=getchar(); // wczytanie znaku
     putchar(znak); // wyświetlenie znaku
     if (znak=='\n') // zliczenie ilości wierszy
       wiersze++;
     else if (znak==' ' || znak=='\t') // zliczenie biełych znaków
       biale++;
     else if (znak>='0' && znak<='9') { // zliczenie cyfr
       for(i=0;i<10;i++)
       if (znak==('0'+i)) cyfry[i]++;
     } else if (znak!=EOF) // zliczenie pozostalych znaków z wyłączeniem EOF
       pozostale++;
   }

   printf("wierszy: %d, bialych znakow: %d ,pozostalych znakow %d\n",wiersze,biale,pozostale); // wyświetlenie wyników zliczania znaków
   for(i=0;i<10;i++) // wyświetlenie wyników zliczania cyfr
   printf("%d: %d \n",i,cyfry[i]);

   for(i=0;i<10;i++) // obliczenie sumy wszystkich znakow
   suma+=cyfry[i];
   suma+=biale+pozostale;

   for(i=0;i<10;i++) // wyświetlenie histogramu
   {
     histogram=cyfry[i]*szerokosc/suma; // obliczenie zawartości procentowej danej cyfry. Maksymalną ilość znaków # reprezentuje stała "szerokosc"
     printf("\n%d\t: ",i); // wyświetlenie opisu linijki
     for(histogram;histogram>0;histogram--) // wyświetlenie odpowieniej liczby znaków #
     printf("#");
   }
   histogram=biale*szerokosc/suma;
   printf("\nbiale\t: "); // wyświetlenie opisu linijki
   for(histogram;histogram>0;histogram--) // wyświetlenie odpowieniej liczby znaków #
     printf("#");
   histogram=pozostale*szerokosc/suma;
   printf("\npozost.\t: "); // wyświetlenie opisu linijki
   for(histogram;histogram>0;histogram--) // wyświetlenie odpowieniej liczby znaków #
     printf("#");


   printf("\n");
   system("PAUSE"); // oczekiwanie na wciśniecie jakiegoś klawisza
   return 0;
}