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ć:
+---+---+---+---+ | | | | | +---+---+---+---+ | | | | | +---+---+---+---+
Napisz program, który zamienia liczby na tekst. Na przykład wynikiem konwersji liczby -234 będzie tekst minus dwa trzy cztery.
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 */
#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.
#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.
#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.
#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;
}