Setul 3

Problema 1 - Definire structură și citire/afișare

Definiţi o structură pentru memorarea următoarelor informaţii despre animale:

- numărul de picioare: număr întreg, minim 0 (ex. şarpe), maxim 1000 (ex. miriapod)

- greutatea în kg: număr real

- periculos pentru om: da/nu

- abrevierea ştiinţifică a speciei: şir de maxim 8 caractere

- vârsta maximă în ani: număr întreg, minim 0, maxim 2000

Unde este posibil, codificaţi informaţiile prin numere întregi. Spre exemplu “da”=1, “nu”=0.

Definiţi structura în aşa fel încât să ocupe spaţiul minim de memorie posibil. Afişaţi spaţiul de memorie ocupat, folosind operatorul sizeof. Folosind structura definită, citiţi de la tastatură informaţii despre un animal, pe urmă afişaţi-le pe ecran.

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("Hello world!\n");

struct animal{

unsigned int periculos:1;

unsigned int nrpicioare:10;

unsigned int varsta:11;

char denumire[9];

float greutate;

}an;

unsigned int aux;

float aux2;

printf("Dimensiunea structurii este: %d\n",sizeof(an));

printf("Este animalul periculos? 1/0:");scanf("%u",&aux);

an.periculos=aux;

printf("Denumirea stiintifica este: ");scanf("%s",&an.denumire);

printf("Numarul de picioare este: ");scanf("%u",&aux);

an.nrpicioare=aux;

printf("Varsta este: ");scanf("%u",&aux);

an.varsta=aux;

printf("Greutatea este: ");scanf("%f",&aux2);

an.greutate=aux2;

printf("\nDenumirea stiintifica a animalul este: %s. Acesta are varsta de %u ani.",an.denumire,an.varsta);

printf("\nNumarul de picioare este %u, iar greutatea acestuia este %f",an.nrpicioare,an.greutate);

if(an.periculos)

printf("\nAnimalul este periculos!");

else

printf("\nAnimalul NU este periculos!");

return 0;

}

Problema 2 - Citire și prelucrare linie comandă

Scrieți un program care calculează suma parametrilor primiți din linia de comandă (numere reale). Spre exemplu dacă executabilul generat se numește p2, atunci execuția lui fără parametri:

va afișa:

Execuția:

va afișa:

Execuția:

va afișa:

Folosiți funcția atof pentru a transforma parametri primiți ca șiruri de caractere în numere reale.

./p2

0

./p2 1 2 3

6

./p2 1.1 6.57 99.122

106.792

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char *argv[])

{

printf("Hello world!\n");

int i,n;

float s=0;

if(argc==0)

printf("s=0");

else

{

for(i=1;i<argc;i++)

s=s+atof(argv[i]);

printf("s=%f",s);

}

return 0;

}

Problema 3 - Criptare / decriptare

Scrieţi un program care criptează sau decriptează un şir de cuvinte.

Criptarea se face după un algoritm simplu. Ştim că fiecare literă din alfabet are asociat un număr de ordine. Numerele de ordine ale tuturor caracterelor (nu doar litere) formează ceea ce se numeşte tabela de coduri ASCII. Pentru a afla numărul de ordine al unui caracter, e suficient să îl afişăm ca şi întreg. Spre exemplu:

char c = 'a'; printf("Numarul de ordine al lui '%c' este %d.\n", c, c);

Pentru a cripta un anumit cuvânt, avem nevoie de un număr întreg N numit cheie de criptare. Criptarea se realizează astfel: la numărul de ordine al fiecarei litere a cuvântului se adună N şi rezultă o nouă literă. Cuvântul criptat este constituit din noile litere ce se obţin.

Spre exemplu să considerăm cuvântul “abecedar” şi cheia de criptare 1.

Literele originale

Numerele de ordine ale literelor originale

Numerele de ordine ale literelor criptate

Literele criptate

Incrementarea numerelor de ordine se face circular, adica litera z incrementată cu 1 devine litera a.

Operaţia de decriptare se face exact invers. Având un cuvânt şi o cheie de decriptare N, se scade din numerele de ordine ale literelor cuvântului valoarea N, obţinându-se astfel literele cuvântului decriptat.

Scrieţi un program care face operaţii de criptare şi decriptare conform algoritmului descris. Programul va primi următorii parametri din linia de comandă:

– Primul parametru va fi una din valorile “enc” sau “dec”. Dacă valoarea este “enc” atunci se va face criptare, dacă este “dec” se va face decriptare. Dacă primul parametru are altă valoare, se va afişa un mesaj de eroare.

– Al doilea parametru este un număr întreg reprezentând cheia N de criptare/decriptare.

– Următorii parametri sunt cuvinte care trebuie criptate sau decriptate, după caz, în funcţie de valoare primului parametru. Cuvintele pot conţine atât litere mari, cât şi litere mici, dar ele vor trebui convertite la litere mici înainte de a face operaţia de criptare/decriptare.

Programul va afişa pe ecran cuvintele obţinute în urma criptării/decriptării cuvintelor trimise din linia de comandă.

Spre exemplu dacă rulăm programul astfel:

programul trebuie să afişeze

Dacă rulăm

programul va afişa

Dacă rulăm

programul va afişa

Dacă rulăm

programul va afişa

a b e c e d a r

b c f d f e b s

97 98 101 99 101 100 97 114

98 99 102 100 102 101 98 115

./criptare enc 1 abecedar

./criptare dec 1 bcfdfebs

bcfdfebs

abecedar

./criptare enc 1 zaraza

absbab

./criptare enc 10 vine VINE primavara PRImaVAra

fsxo fsxo zbswkfkbk zbswkfkbk

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

void criptation(char *word, int key, char *type) {

unsigned long wordLen = strlen(word);

for (unsigned long i = 0; i < wordLen; i++) {

char letter = (char) tolower(word[i]);

if (strcmp(type, "enc") == 0) {

if (letter + key > 'z') {

word[i] = (char) ('a' + (letter + key - 'z' - 1));

} else {

word[i] = (char) (letter + key);

}

} else {

if (strcmp(type, "dec") == 0) {

if (letter - key < 'a') {

word[i] = (char) ('z' - ('a' - (letter - key) - 1));

} else {

word[i] = (char) (letter - key);

}

}

}

}

}

void usageHelper() {

printf("usage: ./prog enc criptationKey word1 word2 ...wordN\n");

printf("usage: ./prog dec criptationKey word1 word2 ...wordN\n");

}

int main(int argc, char *argv[]) {

printf("Hello world!\n");

if (argc < 3) {

usageHelper();

}

if (strcmp(argv[1], "enc") != 0 && strcmp(argv[1], "dec") != 0) {

usageHelper();

}

for (int i = 3; i < argc; i++) {

criptation(argv[i], atoi(argv[2]), argv[1]);

}

printf("The word after criptation/decriptation are:\n");

for (int i = 3; i < argc; i++) {

printf("%s ", argv[i]);

}

return 0;

}