Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Bing-Content removal tool

Nu pot accesa monitorulsv.ro de l...

Cum sa elimini urmele de acnee?

Wc Geberit
 Routere detinute in trecut si in ...

Teii din fața casei

E-Mail in serie prin Excel si Out...

Modul alimentare rulou/jaluzea ex...
 Recuperare fișiere dupa form...

Aplicatii stress test RAM

Asigurare auto hibrid

Asus B550M - PC-ul nu porneste di...
 Tzanca Uraganu - Inconjurat de Fe...

explicatie montaj breadboard

3 Doors Down - Kryptonite

Semnalizati cand virati pe un dru...
 

Problema structuri

* * * * * 1 votes
  • Please log in to reply
12 replies to this topic

#1
Raz03

Raz03

    Junior Member

  • Grup: Junior Members
  • Posts: 61
  • Înscris: 14.10.2015
Salut.
Sunt începător la capitolul structuri și am o rezolvare la o problemă care nu funcționează.
Nu neg că e posibil să fi sărit anumite părți din teorie și să fie absurde unele lucruri, dar aș vrea să mă ajutați, vă rog.

Problema sună cam așa:
La un concurs au participat n elevi, pentru fiecare elev cunoscându-se numele, liceul de proveniență (șir de caractere) și media obținută (de la 1 la 10).
Să se realizeze un program care citește datele elevilor și afișează pe ecran numele elevilor cu cea mai mare notă și media notelor participanților.

Iar rezolvarea mea e următoarea:
#include <iostream>
#include <string.h>
using namespace std;
struct elev{
	char nume[51];
	char liceu[101];
	float media;
	};
struct maxim{
	char nume[51];
	char liceu[51];
	float media;
	}; //am luat o structură copie, în care vreau să rețin elevii cu media maximă
int main()
{
	elev e[100];
	maxim m[100];
	int n,i,j=1,s=0,max=0,x;
	float ma;
	cout<<"Numarul elevilor: ";cin>>n;
	cin.get();
	for (i=1;i<=n;i++)
	{
		cin.get();
		cout<<"Nume elev: "; cin.getline(e[i].nume,51);
		cout<<"Liceul de provenienta: "; cin.getline(e[i].liceu,101);
		cout<<"Media: "; cin>>e[i].media;
		s+=e[i].media;
		if (e[i].media>max)
		{
			m[i].nume==e[j].nume;
			m[i].liceu==e[j].liceu;
			m[i].media==e[j].media;
		}
		else if (e[i].media==max)
		{
			j++;
			m[i].nume==e[j].nume;
			m[i].liceu==e[j].liceu;
			m[i].media==e[j].media;
		}
	}
	cout<<"Elevi cu cea mai mare nota:"<<endl;
	for (i=1;i<=j;i++)
	{
		cout<<"Nume elev: "<<m[i].nume<<endl;
		cout<<"Liceul de provenienta: "<<m[i].liceu<<endl;
		cout<<"Media: "<<m[i].media<<endl;
	}
	cout<<endl<<"Media aritmetica a notelor: "<<(float)s/n;
	return 0;
}


Nu am vrut să fie rezolvarea optimă deoarece vreau întâi să găsesc o cale care să funcționeze, iar abia apoi să încep să o optimizez.
Aștept păreri.

#2
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

Quote

struct maxim{
	 char nume[51];
	 char liceu[51];
	 float media;
	 }; //am luat o structură copie, în care vreau să rețin elevii cu media maximă

Nu mai bine folosesti un vector de structuri de tip elev in care sa reti elevii cu media maxima, si acest vector sa-l  denumesti maxime ?
std::vector<elev> maxime;


Edited by Iulius-Foyas, 06 July 2019 - 18:22.


#3
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
la ce ajuta structura maxim ?

#4
Raz03

Raz03

    Junior Member

  • Grup: Junior Members
  • Posts: 61
  • Înscris: 14.10.2015

 MarianG, on 06 iulie 2019 - 18:21, said:

la ce ajuta structura maxim ?

Am vrut să rețin în ea toți elevii cu media maximă, ca apoi să o afișez.

#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
Parcugi elevii => aflii cea mai mare medie.
Parcurgi inca o data elevii => afisezi pe cei cu media maxima.

E structura cu aceleasi campuri dar alt nume nu te ajuta, poti declara oricate variabile de tipul primei structuri. La fel poti retine pointeri spre structuri, dar aia nu cred ca i-ai invatat inca.

#6
Raz03

Raz03

    Junior Member

  • Grup: Junior Members
  • Posts: 61
  • Înscris: 14.10.2015

 dani.user, on 06 iulie 2019 - 19:01, said:

Parcugi elevii => aflii cea mai mare medie.
Parcurgi inca o data elevii => afisezi pe cei cu media maxima.

Mulțumesc de idee, cred că e cea mai bună.

Nu am reușit să o testez pentru că am o problemă la citire, în zona asta probabil:

 Raz03, on 06 iulie 2019 - 18:06, said:

cout<<"Numarul elevilor: ";cin>>n;
cin.get();
for (i=1;i<=n;i++)
{
	 cin.get();
	 cout<<"Nume elev: "; cin.getline(e[i].nume,51);
	 cout<<"Liceul de provenienta: "; cin.getline(e[i].liceu,101);
	 cout<<"Media: "; cin>>e[i].media;
În codeblocks îmi sare peste unele câmpuri, până la un moment dat până când sare cu totul peste toate câmpurile, până la final. Nu golesc eu buffer-ul unde trebuie sau e altceva?
Am încercat să mut cin.get() și în alte locuri, dar nu se schimbă nimic.

Edited by Raz03, 06 July 2019 - 19:12.


#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
for (int i = 0; i < n; i++)
{
	cout<<"Nume elev: "; cin.getline(e[i].nume, sizeof(e[i].nume));
	cout<<"Liceul de provenienta: "; cin.getline(e[i].liceu, sizeof(e[i].liceu));
	cout<<"Media: "; cin>>e[i].media; cin.ignore();
...
}

Indecsii incep de la 0.
Amestecarea getline cu >> e mai delicata.
Daca ai zis deja ca nume are dimensiune max 51, folosesti sizeof sa-i zici compilatorului unde sa se uite, ca daca schimbi candva sa nu schimbi in 10 locuri.

Edited by dani.user, 06 July 2019 - 19:25.


#8
Raz03

Raz03

    Junior Member

  • Grup: Junior Members
  • Posts: 61
  • Înscris: 14.10.2015
Mulțumesc tuturor!

Aceasta este soluția funcțională, în caz că va mai interesa pe cineva în viitor:

#include <iostream>
#include <string.h>
using namespace std;
struct elev{
		char nume[51];
		char liceu[101];
		float media;
		};
struct maxim{
		char nume[51];
		char liceu[51];
		float media;
		};
int main()
{
		elev e[100];
		maxim m[100];
		int n,i,j=1,s=0,maxim=0,x;
		float ma;
		cout<<"Numarul elevilor: ";cin>>n;
		cin.get();
		for (int i = 0; i < n; i++)
		{
			cout<<"Nume elev: "; cin.getline(e[i].nume,sizeof(e[i].nume));
			cout<<"Liceul de provenienta: "; cin.getline(e[i].liceu,sizeof(e[i].liceu));
			cout<<"Media: "; cin>>e[i].media; cin.ignore();
			s+=e[i].media;
			if (e[i].media>maxim)
					maxim=e[i].media;
		}
		cout<<"Elevi cu cea mai mare nota:"<<endl;
		for (i=0;i<n;i++)
		{
			if (e[i].media==maxim)
			{
				cout<<"Nume elev: "<<e[i].nume<<endl;
				cout<<"Liceul de provenienta: "<<e[i].liceu<<endl;
				cout<<"Media: "<<e[i].media<<endl;
			}
		}
		cout<<endl<<"Media aritmetica a notelor: "<<(float)s/n;
		return 0;
}



#9
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
Cerintele programului nu necesita retinerea tuturor datelor. Nu ai nevoie decit de un for pentru citire si restul calculezi pe masura ce vin date...

Ai nevoie de o varibila max pentru a tine media cea mai mare, un vector in care sa tii elevii cu nota cea mai mare si inca o variabila sum in care sa aduni notele ca sa faci la sfirsit media impartind la numarul de participanti.

- Initializezi max cu prima medie citita si adaugi elevul in vectorul de elevi fenomenal de destepti, adaugi media la sum
- pentru fiecare elev citit ulterior aduni media la sum verifici daca
  - media e mai mare decit max, atunci stergi vectorul si pui elevu nou in el
  - media e egala cu max, adaugi elevu nou

La sfirsit tiparesti elevii din vectori si sum / numarul de participanti.

#10
Iulius-Foyas

Iulius-Foyas

    Active Member

  • Grup: Members
  • Posts: 1,361
  • Înscris: 21.04.2019

 Raz03, on 06 iulie 2019 - 21:53, said:

Mulțumesc tuturor!

Aceasta este soluția funcțională, în caz că va mai interesa pe cineva în viitor:
Anexat ti-am scris programul in C++ (si nu C combinat cu C++) daca te mai intereseaza :
Spoiler


#11
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
struct elev{
	char nume[51];
	char liceu[101];
	float media;
};
struct maxim{
	char nume[51];
	char liceu[51];
	float media;
};

nu are rost sa creezi o structura identica*,
creezi structura, apoi o atribui unei variabile, sau mai multor variabile.
Sa spui ca prima daca liceul are 100 de caractere intr-un loc si doar 50 in altul, n-are noima.

Edited by MarianG, 07 July 2019 - 06:44.


#12
Raz03

Raz03

    Junior Member

  • Grup: Junior Members
  • Posts: 61
  • Înscris: 14.10.2015

 MarianG, on 07 iulie 2019 - 06:39, said:

struct elev{
char nume[51];
char liceu[101];
float media;
};
struct maxim{
char nume[51];
char liceu[51];
float media;
};

nu are rost sa creezi o structura identica*,
creezi structura, apoi o atribui unei variabile, sau mai multor variabile.
Sa spui ca prima daca liceul are 100 de caractere intr-un loc si doar 50 in altul, n-are noima.

Scuze, am uitat să o șterg când am actualizat codul.

 Iulius-Foyas, on 06 iulie 2019 - 23:53, said:

Anexat ti-am scris programul in C++ (si nu C combinat cu C++) daca te mai intereseaza :
Spoiler

Util. Mersi! Posted Image

#13
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
La un concurs au participat n elevi, pentru fiecare elev cunoscându-se numele, liceul de proveniență (șir de caractere) și media obținută (de la 1 la 10).
struct elev
{
	char nume[CONST];
	char liceu[CONST];
	int medie;
};


struct concurs
{
	struct elev elevi[CONST];
	int ceaMaiMareMedie;
	int medieGenerala;
}

Să se realizeze un program care citește datele elevilor și afișează pe ecran numele elevilor cu cea mai mare notă și media notelor participanților.
int main()
{
	inscriereElevi(concurs);
	afisareEleviCuCeaMaiMareMedie(concurs);
	afisareMedieGenerala(concurs);
	return 0;
}

Edited by MarianG, 08 July 2019 - 19:35.


Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate