Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Alte tipuri de date:structuri, uniuni, tipul enumerat

c



+ Font mai mare | - Font mai mic



Alte tipuri de date:
structuri, uniuni, tipul enumerat

Probleme rezolvate

P7.1 Scrieti un program care citeste datele pentru un grup de cel mult 10 persoane si afiseaza datele citite.
Precizari: Pentru fiecare persoana se vor memora numele, prenumele si data nasterii. Datele fiecarei persoane va fi memorat sub forma unei structuri. Data nasterii va fi tot o structura care va avea campurile zi, luna si an.



#include <stdio.h>

#include <stdlib.h>

int main() ;

struct persoana ;

struct persoana grup[10];

int i, n;

do while ((n <= 0) || (n > 10));

for(i = 0; i < n; i++) while((grup[i].datan.an < 0) ||

((grup[i].datan.zi <= 0) &&

(grup[i].datan.zi >= 31)));

}

printf('Nume Prenume An Luna Zin');

for(i = 0; i < n; i++)

printf('|%st|%st|%dt|%st|%dt|n',

grup[i].nume, grup[i].prenume, grup[i].datan.an,

grup[i].datan.luna, grup[i].datan.zi);

printf('n');

system('PAUSE');

return 0;

Programul va afisa:

Introduceti numarul de persoane: 2

Nume Prenume An Luna Zi

POPA Marius 1980 Mai 22

Nume Prenume An Luna Zi

DUTA Ioana 1981 Iunie 2

Nume Prenume An Luna Zi

|POPA |Marius |1980 |Mai |22 |

|DUTA |Ioana |1981 |Iunie |2 |

Discutie

-  In programul anterior se definesc doua structuri: data si persoana. Structura persoana utilizeaza un camp datan care este de tipul struct data

-  Variabila grup este un tablou de 10 elemente de tipul persoana

-  Primul ciclu do - while citeste numarul de persoane, n, care trebuie sa fie un numar pozitiv si mai mic decat 10. Deci corpul ciclului va fi executat pana cand n va fi in intervalul [1, 10].

-  Al doilea ciclu for citeste element cu element persoanele din variabila grup. De notat ca elementul grup[i] are 3 campuri: primele doua (nume prenume) sunt de tipul sir de caractere in timp ce al treilea este de tipul struct datan. Al treilea camp are la randul sau trei alte campuri: zi luna si an. Deci pentru accesarea acestor subcampuri avem nevoie de operatorul ,,." aplicat de doua ori asupra unei variabile de tipul grup[i]

-  Al treilea ciclu for afiseaza rezultatele citite de la tastatura ca un tabel sub forma: | Nume | Prenume | An | Luna | Zi |.

P7.2 Scrieti un program care citeste doua numere complexe de la tastatura, calculeaza si afiseaza suma celor doua numere complexe.
Precizare: Un numar complex se va memora sub forma unei structuri cu campurile real si imag

#include <stdio.h>

#include <stdlib.h>

int main(void) complex;

complex a, b, sum;

printf('Introduceti partea reala a primului nr.: ');

scanf('%f', &a.real);

printf('Introduceti partea imaginara a primului nr.: ');

scanf('%f', &a.imag);

printf('Introduceti partea reala celui de al doilea nr.: ');

scanf('%f', &b.real);

printf('Introduceti partea imaginara celui de al ');

printf('doilea nr.: ');

scanf('%f', &b.imag);

sum.real = a.real + b.real;

sum.imag = a.imag + b.imag;

printf('Suma celor doua numere complexe este: ') ;

printf(' %.2f + (%.2f) * in', sum.real, sum.imag);

system('PAUSE');

return 0;

Programul va afisa:

Introduceti partea reala a primului nr.: 1.2

Introduceti partea imaginara a primului nr.: 1.0

Introduceti partea reala a celui de al doilea nr.: -0.2

Introduceti partea imaginara a celui de al doilea nr.: 0

Suma celor doua numere complexe este: 1.00 + (1.00) * i

Discutie

Declaratia typedef introduce un tip utilizator cu numele complex. Structura are doua campuri: real si imag de tipul float a b si sum sunt cele trei variabile utilizate in cadrul programului. a si b se citesc de la tastatura iar rezultatul sumei complexe se atribuie variabilei sum. Aceasta atribuire se poate face numai utilizand operatorul ,,." pentru a selecta individual campurile real si imag. De notat ca atribuirea sum = a + b nu este posibila in C.

P7.3 Scrieti un program care citeste si stocheaza doua momente succesive de timp, ce reprezinta, de exemplu, momentul la care a plecat un atlet si respectiv a sosit un atlet intr‑o competitie. Programul va afisa timpul scurs intre cele doua momente.

#include <stdio.h>

#include <stdlib.h>

int main() ;

struct timp start, stop;

int start_int, stop_int;

printf('Introduceti start: ');

scanf('%d:%d:%d', &start.ora, &start.min, &start.sec);

printf('Introduceti stop: ');

scanf('%d:%d:%d', &stop.ora, &stop.min, &stop.sec);

start_int = start.ora * 3600 + start.min * 60 + start.sec;

stop_int = stop.ora * 3600 + stop.min * 60 + stop.sec;

printf('timp: %d sn', stop_int - start_int);

system('PAUSE');

return 0;

Programul va afisa:

Introduceti start: 10:11:10

Introduceti stop: 10:12:11

timp: 61 s

Discutie

 start si stop reprezinta doua variabile care stocheaza ora, minutul si secunda in care a plecat respectiv a terminat proba atletul. start_int si stop_int reprezinta echivalentul in secunde al celor doua momente de timp. Relatia de calcul are in vedere faptul ca o ora are 3600 de secunde iar un minut are 60 de secunde. Diferenta dintre cele doua variabile, stop_int - start_int, reprezinta echivalentul in secunde al timpului efectuat.

P7.4 Scrieti un program care determina spatiul de memorie ocupat de o structura.

#include <stdio.h>

#include <stdlib.h>

struct exemplu s;

int main()

Programul va afisa:

Structura exemplu are dimensiunea: 96 octeti.

P7.5 Scrieti un program care codeaza si decodeaza un intreg folosind uniuni prin inversarea ordinii octetilor care compun numarul intreg. Pentru valorile variabilelor din program, se va afisa:

10 codat este: 167772160
167772160 decodat este: 10

#include <stdio.h>

#include <stdlib.h>

int encode(int i);

int main() crypt;

unsigned char ch;

printf('Intoduceti un numar intreg: ');

scanf('%d', &in);

/* codarea intregului */

crypt.num = in;

ch = crypt.c[0];

crypt.c[0] = crypt.c[3];

crypt.c[3] = ch;

ch = crypt.c[1];

crypt.c[1] = crypt.c[2];

crypt.c[2] = ch;

i = crypt.num;

printf('%d codat este: %dn', in, i);

/* decodarea intregului */

crypt.num = i;

ch = crypt.c[0];

crypt.c[0] = crypt.c[3];

crypt.c[3] = ch;

ch = crypt.c[1];

crypt.c[1] = crypt.c[2];

crypt.c[2] = ch;

in = crypt.num;

printf('%d decodat este: %d', i, in);

printf('n');

system('PAUSE');

return 0;

Programul va afisa pe ecran, dupa compilare si executie:

Intoduceti un numar intreg: 10

10 codat este: 167772160

167772160 decodat este: 10

Discutie

-  Prin intermediul unei uniuni se pot accesa octetii care compun un numar intreg.

P7.6 Scrieti un program care memoreaza pe rand, in acelasi spatiu de memorie, un caracter, un numar intreg si un numar real.

#include <stdio.h>

#include <stdlib.h>

int main() u;

u.c = 'A';

printf('Un caracter: %cn', u.c);

u.i = 65;

printf('Codul ASCII: %dn', u.i);

printf('Caracterul urmator: %cn', u.c + 1);

u.f = u.i + 0.14;

printf('Un float: %.2fn', u.f);

u.f = 3.14;

u.i = 2;

printf('Aria cercului de raza %d: %.2fn', u.i, u.f * u.i * u.i);

system('PAUSE');

return 0;

Programul va afisa:

Un caracter: A

Codul ASCII: 65

Caracterul urmator: B

Un float: 65.14

Aria cercului de raza 2: 0.00

Discutie

-  In cadrul programului se defineste o variabila u avand tipul "union". Variabila poate stoca la un moment dat un caracter, un intreg sau un numar real.

-  Primele doua linii dupa declararea variabilei atribuie variabilei u, in campul c (adica u.c) valoarea 'A'. Variabila este apoi tiparita cu ajutorul specificatorului de format %c pentru caractere.

-  Urmatoarele trei linii ilustreaza atribuirea valorii 65, de data aceasta, campului i. In acest punct al executiei programului, valoarea campului c este distrusa. Tiparirea se va face utilizand specificatorul de format %d. A treia linie ilustreaza tiparirea caracterului asociat codului ASCII imediat urmator. Intrucat codul ASCII are valoarea 65 (el avand asociat caracterul 'A'), programul va afisa caracterul 'B'

-  Urmatoarele 2 linii atribuie campului f o valoare egala cu vechea valoare a campului i (adica 65) la care se aduna 0.14. De remarcat faptul ca vechea valoare, 65, se pierde numai dupa ce a avut loc atribuirea, adica ordinea operatiilor se desfasoara astfel incat se aduna intai 65 cu 0.14 si apoi se atribuie lui u.f valoarea 65.14. In acest moment, u.i isi pierde valoarea 65.

-  Ultimele trei linii ilustreaza calculul ariei unui cerc intr‑un mod gresit. In primele doua linii atribuirile u.f = 3.14 (adica numarul PI) si u.i = 2 (adica raza cercului) au ca efect modificarea valoarea lui PI astfel incat rezultatul final este in mod gresit altul decat cel asteptat. Intrucat o variabila de tipul enumerat poate lua valori de mai multe tipuri in timpul executiei programului, in lucrul cu uniuni trebuie avut grija ca la orice moment de timp sa fie stiut tipul datei ce se afla stocat in variabila uniune.

P7.7 Reluati problema anterioara dar construiti si o metoda care va permite sa aflati in orice moment tipul informatiei stocate.

#include <stdio.h>

#include <stdlib.h>

int main() u;

} z;

z.u.c = 'A';

z.tip = 0;

z.u.f = 3.1415;

z.tip = 2;

switch (z.tip)

system('PAUSE');

return 0;

Programul va afisa:

Un float: 3.141500

Discutie

-  Acest program ilustreaza utilizarea unei uniuni, u, in cadrul unei structuri, z. Structura are un camp, tip, de tipul intreg. Valorile pe care le ia campul tip (de exemplu: 0 pentru caractere, 1 pentru intregi si 2 pentru real), pot fi modificate la momentul atribuirii unui subcamp al uniunii, u. Astfel, in orice moment de timp se cunoaste tipul stocat in campul u dupa valorile campului tip

-  Instructiunea switch decide, functie de valoarea din campul tip (0, 1, 2), cum trebuie afisata variabila z

P7.8 Scrieti un program care calculeaza media notelor obtinute la probele de verificare (laborator, partial si examen) ale unei materii (fizica, biologie si chimie) utilizand tipul enumerat.

#include <stdio.h>

#include <stdlib.h>

int main() didactic;

didactic activitate;

typedef enum materii;

materii materie;

float nota, suma;

for(materie = fizica; materie <= chimie; materie++)

printf('Media = %.2fn', suma/3);

}

system('PAUSE');

return 0;

In urma introducerii notelor la laborator, partial si lucrarea finala, pentru fiecare din cele materii, programul va afisa:

Media = 9.67

Media = 7.83

Discutie

-  Programul anterior citeste de la tastatura notele obtinute de un student la diferite materii, fiecare materie avand examinari, de exemplu, la laborator, pe parcursul semestrului, respectiv la examenul final. La finalul fiecarei materii, programul afiseaza media la materia respectiva.

-  Programul defineste doua enumerari, didactic si materii, avand ca membri tipul de examinare (laborator partial sau examen) respectiv numele materiilor la care s‑a efectuat examinarea (fizica biologie chimie). Variabilele activitate si materie sunt de tipul didactic respectiv materii

-  Variabilele nota si suma sunt de tipul float. Cu ajutorul a doua cicluri for se parcurg toate materiile posibile, respectiv toate probele. Variabila suma se initializeaza cu valoarea 0 la inceputul celui de al doilea ciclu for. In interiorul acestuia se citeste succesiv variabila nota, aceasta urmand sa se adune la totalul din variabila suma

-  La finalul ultimului ciclu for, se afiseaza valoarea mediei.

Probleme propuse

Scrieti un program care citeste de la tastatura un vector de elemente complexe, calculeaza si afiseaza suma complexa a tuturor elementelor sale.

Scrieti un program care citeste de la tastatura un vector de elemente complexe, calculeaza si afiseaza produsul complex al tuturor elementelor sale.

Sa se modifice programul P7.3 astfel incat sa nu mai afiseze numai numarul total de secunde, ci si timpul efectuat sub forma: ore : minute : secunde


Exemplu: 3700 secunde reprezinta 1 ora, 1 minut si 40 de secunde
adica "

Scrieti un program care citeste de la tastatura un vector de coordonate ale unei structuri impreuna cu masele plasate la coordonatele respective si calculeaza centrul de greutate al structurii.
Precizari:
  fiecare coordonata impreuna cu masa asociata se va memora intr‑o structura definita astfel:

typedef struct punct;

  punctele se vor memora intr‑o matrice definita astfel:

punct mase[MAX];

  structura va putea fi alcatuita din cel mult 100 de puncte.

Modificati programul P7.8 astfel incat sa memoreze numele materiilor si notele obtinute in structuri.

Scrieti un program care memoreaza scorurile obtinute de cel mult 10 jucatori impreuna cu numele jucatorilor. Informatiile se vor memora intr‑o matrice constituita din structuri definite astfel:

typedef struct jucator;

Scrieti un program care implementeaza o agenda telefonica sub forma unei structuri cu urmatoarea definitie:

typedef struct intrare;

Scrieti un program care scrie octetii care formeaza o valoare de tip double sub forma zecimala in ordinea octet7, octet6, octet5, octet4, octet3, octet2, octet1, si octet0, unde octet este octetul cel mai semnificativ iar octet0 este octetul cel mai putin semnificativ.
Precizari:
  ordinea in memorie a octetilor depinde de platforma de calcul: exista calculatoare de tip "BIG_ENDIAN", la care primul octet din memorie este cel mai putin semnificativ si de tip "LITTLE_ENDIAN" la care primul octet este cel mai semnificativ. Va trebui ca mai intai sa stabiliti ce tip de calculator folositi si apoi sa parcurgeti octetii in ordinea corespunzatoare;
  pentru a accesa octetii care formeaza un numar de tip double utilizati uniunea:

typedef union valoare;



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2403
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved