Programowanie w C (index)


Programowanie w C (15) - dodatki

ZADANIE (Oualline, str. 145; wystarczy znajomość pętli)

W katalogu kratki stworzyć program do wyświetlania prostokąta składającego się pól o wymiarach 1x3 (2x5) znaków. Przykładowy prostokąt składający się 2x4 pól ma postać:

+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
|   |   |   |   | 
+---+---+---+---+

ZADANIE (Oualline str. 146)

Napisz program, który zamienia liczby na tekst. Na przykład wynikiem konwersji liczby -234 będzie tekst minus dwa trzy cztery.

ZADANIE (zamienić liczbę na napis, dodać przecinek i PLN)

Napisać funkcję, która zamieni grosze na złotówki

void grtopln(char s[], long grosze);
/* Przykladowe wyniki zamiany:
0,03 PLN   12,43 PLN   -8,07 PLN
*/

ZADANIE (poprawne wczytywanie napisów)


#include <stdio.h>
#include <string.h>
#define MAXLINE  80

int main(void) 
{
char imie[MAXLINE/2];           /* imie pracownika */
char nazwisko[MAXLINE/2];         /* nazwisko pracownika */
/* Imie i nazwisko (po polaczeniu)*/
char full[MAXLINE];

printf("Podaj imie: ");
fgets(imie, sizeof(imie), stdin);
/* obcina ostatni znak '\n' */
imie[strlen(imie)-1] = '\0';

printf("Podaj nazwisko: ");
fgets(nazwisko, sizeof(nazwisko), stdin);
/* obcina ostatni znak '\n' */
nazwisko[strlen(nazwisko)-1] = '\0';

strcpy(full, imie);
strcat(full, " ");
strcat(full, nazwisko);

printf("Imie i nazwisko brzmi: %s\n", full);
return 0;
}

Zastanowić się nad funkcją, która będzie dynamicznie rezerwować pamięć na przychodzące znaki, a po wciśnięciu Enter przez użytkownika zwróci wskaźnik do obszaru pamięci z napisem. Należy poprawnie obsłużyć możliwe błędy alokacji pamięci.

ZADANIE (przykład menu znakowego)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE   1
#define FALSE  0
#define MAXLINE 80

int main(void) 
{
int koniec = FALSE; /* zmienna sterujaca zakonczeniem programu */
char line[MAXLINE];        /* wczytany wiersz */

/* Menu pokaze sie co najmniej raz */
do {
system("clear");
printf("\n\tMENU PROGRAMU\n\n");
printf("\ta) Wyjscie z programu\n");
printf("\tb) Pomoc\n");
printf("\tc) Uaktualnienie bazy danych\n");
printf("\td) Zapytania do bazy danych\n\n");
printf("\tWybierz opcje: ");
/* Wczytanie litery podanej przez uzytkownika.
Od razu pobierany jest tez \n i strumien stdin jest czysty */
fgets(line, sizeof(line), stdin);
/* Wersja z "if" */
if (line[0] == 'a') {
    printf("Wybrano (a), czyli koniec...\n");
    koniec = TRUE; 
} else if (line[0] == 'b') {
    printf("Jeszcze nie ma pomocy...\n");
} else if (line[0] == 'c') {
    printf("Nie mozna uaktualnic bazy danych...\n");
} else if (line[0] == 'd') {
    printf("Nie mozna tworzyc zapytan do bazy danych...\n");
} else {
    printf("Nie ma takiej opcji...\n");
}
printf("Nacisnij [ Enter ] aby kontynuowac...");
fgets(line, sizeof(line), stdin);
} while (koniec == FALSE); /* powtarzaj dopoki to jest prawda */

return 0;
}

Zamienić opcje literowe (a-d) na cyfrowe (1-4).

Poprawić program tak, aby nie korzystać ze zmiennej koniec.

ZADANIE (poprawne wczytywanie liczb)


#include <stdio.h>
#define MAXLINE  80

int main(void) 
{
int liczba;
char line[MAXLINE];        /* wczytany wiersz z stdin */

printf("Podaj liczbe int: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &liczba);
printf("Podales liczbe %d\n", liczba);
return 0;
}

Podany sposób powoduje oczyszczenie strumienia wejściowego (dla wierszy krótszych od MAXLINE), ale jeżeli użytkownik nie podał liczby, to zmienna liczba będzie zawierać śmieci. Trzeba pamiętać, że podanie przez użytkownika liczby w formacie float lub double zwykle powoduje złą interpretację, np. po podaniu "1e2" program wczyta 1, a nie 100. Jeżeli chcemy prosić do skutku użytkownika o podanie poprawnej liczby, to wygodnie jest stworzyć osobną funkcję.


#define MAXLINE  80

int pobierz_int(void)
{
int liczba;
char line[MAXLINE];        /* wczytany wiersz */

while (1) {
    /* Pobieramy wiersz do tablicy line[]. */
    fgets(line, sizeof(line), stdin);
    if (sscanf(line, "%d", &liczba) == 1)
        break;
    printf("To nie jest int.\nPodaj int: ");
}
return liczba;
}

W analogiczny sposób można stworzyć funkcje do pobierania liczb float lub double. Oczywiście po pobraniu liczby warto jeszcze sprawdzić w programie, czy jest ona sensowna, np. czy wiek osoby jest przedziale [0, 150], itp.

ZADANIE (liczby przypadkowe)


#include <stdio.h>
#include <stdlib.h>   /* system(), rand(), srand() */
#include <time.h>    /* time(), clock()   */

#define LICZBA   8

int losuj(int a, int b)
{ /* zwraca losowana liczbe z przedzialu [a,b-1] typu calkowitego */
return a + (int) (rand()*(float)(b-a)/(RAND_MAX+1.0));
}

int main(void) 
{  /* poprawna deklaracja */
int i;

system("clear");
srand(time(NULL));
printf("Liczby przypadkowe w przedziale [0,1)\n");
for (i = 0; i < 5; ++i) {
    system("sleep 1s");
    printf("%f\n", rand()/(RAND_MAX+1.0));
}
printf("Liczby calkowite z przedzialu [%d,%d]\n", 1, LICZBA);
for (i = 0; i < 10; ++i) {
    printf("%d ",losuj(1, LICZBA+1));
}
printf("\n");
return 0;
}

Programowanie w C (index)