Ćwiczenie 4: Struktury sterujące: sekwencja i abstrakcja

Spis treści

Zaprojektuj rozwiązania następujących zadań oraz zakoduj je w C. Wynikiem powinny być pliki z kodem, pliki Makefile oraz pliki danych testowych. Wykorzystaj procedury. Użyj testowania z narzędziem diff (z opcją y i bez niej).

1. Procedury w C

Procedury bez parametrów

void NazwaProcedury(void){
   Ciało Procedury
}

Przykład

void PrintHead(void){
   printf("          *****\n");
   printf("          *   *\n");
   printf("          *****\n");
}

int main(void){
   PrintHead();
   return 0;
}

Wcześniejsza deklaracja

void PrintHead(void);

int main(void){
   PrintHead();
   return 0;
}

void PrintHead(void){
   printf("          *****\n");
   printf("          *   *\n");
   printf("          *****\n");
}

Moduły (biblioteki)

Plik nagłówkowy (painter.h):

#ifndef PAINTER_H
#define PAINTER_H

void PrintHead(void);
void PrintArms(void);
void PrintBody(void);
void PrintLegs(void);
void PrintFeet(void);

#endif // PAINTER_H

Plik z kodem (painter.c):

#include <stdio.h>

#include "painter.h"

void PrintHead(void){
   printf("          *****\n");
   printf("          *   *\n");
   printf("          *****\n");
}

void PrintArms(void){
   printf("      *     *     *\n");
   printf("       **   *    **\n");
   printf("         ********\n");
}

void PrintBody(void){
   printf("           ***\n");
   printf("           ***\n");
   printf("           ***\n");
   printf("           ***\n");
}

void PrintLegs(void){
   printf("          *   *\n");
   printf("          *   *\n");
   printf("         *     *\n");
   printf("         *     *\n");
}

void PrintFeet(void){
   printf("       ***     ***\n");
   printf("       ***     ***\n");
   printf("       ***     ***\n");
}

Plik główny (figure.c):

#include "painter.h"

int main(void){
   PrintHead();
   PrintArms();
   PrintBody();
   PrintLegs();
   PrintFeet();
   return 0;
}

Kompilacja:

gcc -Wall -g figure.c painter.c -o figure

Przykładowy Makefile:

CC=gcc
CFLAGS=-Wall -g
SOURCES = $(wildcard  *.c)
EXECUTABLE = figure

$(EXECUTABLE): $(SOURCES) 
	$(CC) $^ -o $@

clean:
	rm -f $(EXECUTABLE) $(EXECUTABLE).exe

Przekazywanie parametru przez wartość

void PrintSquare(int number){
   printf("%d\n", number*number);
}

int main(void){
   int n = 0;
   PrintSquare(0);
   PrintSquare(n);
   PrintSquare(sqrt(n++) + 5);
   return 0;
}

Przekazywanie parametru przez wskaźnik (referencję)

void Sqr(int * number){
   *number = (*number) * (*number);
}

int main(void){
   int n = 2;
   Sqr(&n);
   printf("%u\n", n);
   return 0;
}

2. Użycie narzędzia diff do testowania

Przekierowanie wejścia z pliku

./program < test.input

Przekierowanie wyjścia do pliku

./program < test.input > output.test

Porównywanie dwóch plików

diff -y output.test test.ouptput