Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cel mai ieftin TV LED mic

Reverse proxy si htaccess pe Raps...

Statie de epurare sau fosa septic...

"enerlux p" afisaj interm...
 Adaptor usb3.1gigabit vs Adaptor ...

La multi ani @Atreides!

La multi ani @KENSINGTON!

La multi ani @burebista!
 La multi ani de Florii!

Stihl fs 70 c-e

Challengers (2024)

Care mai sunt mediile de admitere...
 Laptop cu HDD atasare memorie MMC...

Hartile google nu mai au chenarul...

Tomate in ghiveci la curte?

Idei cale de actiune recuperare g...
 

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,445
  • Î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,240
  • Î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,240
  • Î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,445
  • Î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,445
  • Î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

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

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