Programowanie w C (index)


Programowanie w C (3) - typy i operatory

ZMIENNE

Zmienną (czy ogólniej obiekt danych) można opisać w trzech kategoriach:

Język C dostarcza pięciu modeli (klas) zmiennych:

ZADANIE 3.1 (FAHR)

W katalogu domowym utworzyć podkatalog fahr. Utworzyć w nim plik fahr.c postaci:


/* 
* fahr.c
*
* Program wg K i R z petla "for".
* Przeliczanie stopni Fahrenheita na stopnie Celsjusza.
*/

#include <stdio.h>

int main(void) 
{
const int LOWER = 0;     /* dolna granica temperatury */
const int UPPER = 300;   /* gorna granica temperatury */
const int STEP = 20;     /* rozmiar kroku */
int fahr;
float celsius;

for (fahr = LOWER; fahr <= UPPER; fahr = fahr+STEP) {
    celsius = (5.0/9.0)*(fahr-32);
    printf("%3d %6.1f\n", fahr, celsius);
}
return 0;
}

Przygotować plik Makefile, skompilować i uruchomić program.

Zastanowić się, jak można wyeliminować zmienną celsius z programu.

Poprawić program, aby wypisywał nagłowek.

Zamienić wyrażenie fahr = fahr + STEP na fahr += STEP.

Zastosować w programie pętlę while zamiast for.

ZADANIE 3.2

Napisać program przeliczający cale na centymetry (kalorie na dżule, mile na kilometry itp.) i wypisujący wynik w postaci nagłówka i dwóch kolumn danych.

ZADANIE 3.3

W katalogu domowym utworzyć podkatalog sizeof. Utworzyć w nim pliki Makefile i sizeof.c postaci:


/*
* sizeof.c
*
* Program wykorzystujacy operator sizeof(). 
*/

#include <stdio.h>

int main(void) 
{
printf("Rozmiary typow na tym komputerze w bajtach.\n");
printf("\ttyp char: \t%d\n", sizeof(char));
printf("\ttyp short: \t%d\n", sizeof(short));
printf("\ttyp int: \t%d\n", sizeof(int));
printf("\ttyp long: \t%d\n", sizeof(long));
printf("\ttyp float: \t%d\n", sizeof(float));
printf("\ttyp double: \t%d\n", sizeof(double));
printf("\ttyp long double: \t%d\n", sizeof(long double));
printf("\ttyp char *: \t%d\n", sizeof(char *));
printf("\ttyp int *: \t%d\n", sizeof(int *));
printf("\ttyp float *: \t%d\n", sizeof(float *));
printf("\ttyp double *: \t%d\n", sizeof(double *));
printf("\ttyp void *: \t%d\n", sizeof(void *));
return 0;
}

Skompilować i uruchomić program.

ZADANIE 3.4

W katalogu domowym utworzyć podkatalog decyzja. Utworzyć w nim pliki Makefile i decyzja.c postaci:


/*
* decyzja.c
*
* Program wykorzystujacy operator ()?():(). 
* Wypisywanie tablicy liczb.
*/

#include <stdio.h>

int main(void) 
{
const int N = 64;
int i;

for (i = 0; i < N; ++i)
    printf("%c%d", ((i % 8 == 0) ? '\n' : '\t'), i);
printf("\n");
return 0;
}

Skompilować i uruchomić program. Przepisać program tak, aby nie korzystać z operatora ( ? : ).

ZADANIE 3.5

W katalogu domowym utworzyć podkatalog filtr. Utworzyć w nim pliki Makefile i filtr.c postaci:


/* 
* filtr.c
*
* Przepisanie wejscia na wyjscie (K i R, str 37).
*/

#include <stdio.h>

int main(void) 
{
int c;      /* "int" a nie "char", bo ma przyjac EOF */

c = fgetc(stdin);
while (c != EOF) {
    fputc(c, stdout);
    c = fgetc(stdin);
}
return 0;
}

Skompilować i uruchomić program.

Poprawić program wykorzystując bardziej zaawansowaną postać pętli while:

while ((c = fgetc(stdin)) != EOF)
    fputc(c, stdout);

ZADANIE 3.6

W katalogu domowym utworzyć podkatalog znaki. Utworzyć w nim pliki Makefile i znaki.c postaci:


/* 
* znaki.c
*
* Zliczanie znakow ze stdin - petla "while" (K i R str. 39).
* Jezeli stdin jest puste, to wyjdzie 0 i to jest dobre.
* Syntax:  ./znaki < plik1 > plik2
*/

#include <stdio.h>

int main(void) 
{
long nc;      /* number of characters - LONG INT */

nc = 0;
while (fgetc(stdin) != EOF)
    ++nc;
/* Wypisanie liczby znakow */
printf("Liczba znakow w pliku: %ld\n", nc);
return 0;
}

Skompilować i uruchomić program.

Przepisać program zamieniając typ zmiennej nc z long na float. W funkcji printf() zastosować format %.0f.

ZADANIE 3.7

W katalogu domowym utworzyć podkatalog wiersze. Utworzyć w nim pliki Makefile i wiersze.c postaci:


/* 
* wiersze.c
*
* Zliczanie wierszy ze stdin - petla "while" (K i R str. 41).
* Syntax:  ./wiersze < plik1 > plik2
*/

#include <stdio.h>

int main(void) 
{
int c;        /* przechowuje znaki i EOF */
int nl;       /* number of lines */

nl = 0;
while ((c = fgetc(stdin)) != EOF)
    if (c == '\n')
        ++nl;
/* Wypisanie liczby wierszy */
printf("Liczba wierszy w pliku: %d\n", nl);
return 0;
}

Skompilować i uruchomić program.

Poprawić program, aby poza znakami nowego wiersza zliczał znaki odstępu i tabulacji.

ZADANIE 3.8

W katalogu domowym utworzyć podkatalog wyrazy. Utworzyć w nim pliki Makefile i wyrazy.c postaci:


/* 
* wyrazy.c
*
* Zliczanie wierszy, slow i znakow ze stdin - petla "while" (K i R str 41).
* Syntax:  ./wyrazy < plik1 > plik2
*/

#include <stdio.h>

int main(void) 
{
const int TRUE = 1;
const int FALSE = 0;
int c;                /* przechowuje znaki i EOF */
int nl, nw, nc;       /* number of lines, words, characters */
int inword;           /* czy wewnatrz slowa */

inword = FALSE;
nl = nw = nc = 0;
while ((c = fgetc(stdin)) != EOF) {
    ++nc;
    if (c == '\n')
        ++nl;
    if (c == ' ' || c == '\n' || c == '\t')
        inword = FALSE;
    else if (inword == FALSE) {
        inword = TRUE; 
        ++nw;
    }
}
/* Wypisanie liczb */
printf("Liczba wierszy, slow, znakow: %d, %d, %d. \n", nl, nw, nc); 
return 0;
}

Skompilować i uruchomić program. Podobne zadanie w systemie UNIX wykonuje polecenie wc.

ZADANIE 3.9

Napisać program spacje.c, który - przepisując wejście na wyjście - będzie zastępować jednym znakiem odstępu (spacji) każdy ciąg złożony z jednego lub kilku takich znaków. Takie zadanie wykonuje polecenie systemu UNIX:

tr -s " " < plik1 > plik2

Można rozszerzyć działanie programu tak, aby mieszany ciąg spacji i tabulacji ('\t') został zamieniony na jedną spację. Podział na wiersze nie powinien zostać naruszony.

ZADANIE 3.10

Napisać program osobno.c, który każde słowo wejściowe wypisze w osobnym wierszu. Takie zadanie wykonuje polecenie systemu UNIX:

tr -cs "a-zA-Z0-9" "[\n*]" < plik1 > plik2

Przez słowo rozumiemy ciąg "czarnych" znaków. W wykrywaniu "białych" znaków (odstępów) może pomóc funkcja isspace(), z której możemy korzystać po włączeniu pliku ctype.h.


Programowanie w C (index)