Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

informatyk2000

Struktury+vector.

Rekomendowane odpowiedzi

Dzien dobry,

 

Mam problem z programem, brzmi on nastepująco:

Napisac strukturę, która bedzie pobierala imie, nazwisko, rok urodzenia oraz vector(ktory jest para), w ktorym zapisane beda oceny i nazwa przedmiotu ucznia.

 

Pomocy! :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam to zrobic w dwoch strukturach? podobnie nie wiem jak wyswietlic te dane z vectorem. Umiem zrobic wszystko oprocz dodania tego nieszczęsnego vectora....

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po pierwsze napisz poprawna tresc zadania a nie to co udalo Ci sie zapamietac z tej tresci.

Po drugie pokaz co juz zrobiles.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tresc zadania: stworzyć strukturę zawierającą imię, nazwisko, rok urodzenia oraz listę ocen studenta (ocena powinna być zadeklarowana jako struktura lub para zożona z nazwy i wartości) (napisać i wykorzystać oddzielne funkcje do wyświetlania i pobierania pojedynczej osoby.

 

Kod:

a)Struktura:

 

struct sStudent {

string imie;

string nazwisko;

int rok_urodzenia;

};

 

b)funkcje:

 

-pobierz()

 

sStudent pobierz()

{

sStudent tmp;

cin >> tmp.imie;

cin >> tmp.nazwisko;

cin >> tmp.rok_urodzenia;

return tmp;

}

 

 

-wyswietl:

 

void wyswietl(const sStudent& s)

{

cout << s.imie << endl;

cout << s.nazwisko << endl;

cout << s.rok_urodzenia << endl;

}

 

Nie wiem w jaki sposob przypisac okreslony wektor do osoby, aby pozniej moc wypisac np. ktora z posrod osob miala najwyzsza srednia...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Brakuje listy ocen w strukturze.

 

struct sStudent {
string imie;
string nazwisko;
int rok_urodzenia;
std::vector< std::pair<std::string, int> > oceny;
};

 

Wstawianie oceny:

sStudent s;
s.oceny.push_back(std::make_pair("matematyka", 1));

 

Wyciaganie oceny:

std::string nazwa = s.oceny[0].first;
int ocena = s.oceny[0].second;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

sStudent pobierz()

{

sStudent tmp;

cin >> tmp.imie;

cin >> tmp.nazwisko;

cin >> tmp.rok_urodzenia;

vector<pair<string, int>>oceny;

pair<string, int>ocena;

cin >> ocena.first;

cin >> ocena.second;

tmp.oceny.push_back(ocena);

return tmp;

}

czy tak powinna wyglądac moja funkcja pobierz?

 

W pliku naglowkowym zadeklarowalem taką strukturę:

 

struct sStudent {

string imie;

string nazwisko;

int rok_urodzenia;

vector<pair<string, int>>oceny;

};

 

 

Przepraszam, moze niektore pytania wydaja sie tobie banalne, lecz jest to moj dopiero 2 miesiac programowania, nie ukrywam iz ten przedmiot nie sprawia mi zbyt wiele przyjemnosci, ale zdobycie tej wiedzy jest niezbedne do jego zalcizenia.

 

I jak TO wyswietlic, jak wczytac dla jednej osoby wiecej niz jeden przedmiot?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Powinno byc:

sStudent pobierz()
{
 sStudent tmp;

 cin >> tmp.imie;
 cin >> tmp.nazwisko;
 cin >> tmp.rok_urodzenia;

 pair<string, int>ocena;
 cin >> ocena.first;
 cin >> ocena.second;

 tmp.oceny.push_back(ocena);

 return tmp;
}

 

Po drugie nie kasuj "std" ani nie uzywaj using namespace std w pliku .h ani .cpp

 

 

I jak TO wyswietlic, jak wczytac dla jednej osoby wiecej niz jeden przedmiot?

Mozna dodac pytanie wewnatrz funkcji wczytaj(). Cos na zasadzie "czy chcesz wczytac kolejny przedmiot" do tego wprowadzenie odpowiedzi za pomoca "cin" i sprawdzenie. Cos na wzor:

 

std::string odpowiedz;

do
{
 std::pair<string, int>ocena;

 cin >> ocena.first;
 cin >> ocena.second;

 tmp.oceny.push_back(ocena);

 std::cout << "Wprowadzic kolejna ocene?( tak | nie)" << std::endl;
 cin >> odpowiedz;
}
while(odpowiedz != "nie");

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chyba powoli zaczynam rozumieć, lecz nie bardzo wiem czemu nie powinienem używać "usingnamespace std;". Nurtuje mnie jeszcze takie pytanie, czy funkcja wyswietl powinna wygladac tak?:

 

void wyswietl(const sStudent& s, vector<pair<string, int>>&oceny)

{

cout << s.imie << endl;

cout << s.nazwisko << endl;

cout << s.rok_urodzenia << endl;

for (vector<pair<string, int>>::iterator i = oceny.begin(); i != oceny.end(); i++)

{

cout << i->first;

cout << i->second;

}

 

}

 

void wyswietl(const sStudent& s, vector<pair<string, int>>&oceny)
{
cout << s.imie << endl;
cout << s.nazwisko << endl;
cout << s.rok_urodzenia << endl;
for (vector<pair<string, int>>::iterator i = oceny.begin(); i != oceny.end(); i++)
{
	cout << i->first;
	cout << i->second;
}

}

 

Przpraszam, za bledne wstawianie kodu, ktore utrudnia ci prace.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobrze :) Fajnie ze skorzystales z iteratorow, mozna sie pokusic w tym przypadku o const_iterator zamiast iterator, poniewaz nie modyfikujesz tych danych.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przperaszam, czy moglbym dowiedziec sie co jest nie tak? Błąd jest w funkcji glownej, powinien byc widoczny.

TO jest funkcja glowna:

#include "Nagłówek.h"
using namespace std;


int main()
{
int a;
cout << "Ilu studentow chcesz pobrac? " << endl;
cin >> a;
vector<sStudent> studenci;
for (int i = 0; i < a; i++)
{
	sStudent k;
	k = pobierz();
	studenci.push_back(k);
}
for (vector<sStudent>::iterator i=studenci.begin();i!=studenci.end();i++)
{
	wyswietl(*i, vector<pair<string, int>>oceny)//TUTAJ JEST BŁĄD(PODKRESLA NA CZERWONO DRUGI SKLADNIK)
}






system("pause");
return 0;
}

 

 

To plik nagłowkowy:

 

#pragma once
#include <iostream>
#include <map>
#include <algorithm>
#include<string>
#include <cstring>
#include <vector>
using namespace std;



struct sStudent {
string imie;
string nazwisko;
int rok_urodzenia;
vector< pair<string, int> > oceny;
};
void wyswietl(const sStudent& s, vector<pair<string, int>>&oceny);
sStudent pobierz();

 

A to plik z funkcjami:

#include "Nagłówek.h"
sStudent pobierz()
{
sStudent tmp;
cin >> tmp.imie;
cin >> tmp.nazwisko;
cin >> tmp.rok_urodzenia;
string odpowiedz;
do
{
	std::pair<string, int>ocena;

	cin >> ocena.first;
	cin >> ocena.second;

	tmp.oceny.push_back(ocena);

	cout << "Wprowadzic kolejna ocene?( tak | nie)" << endl;
	cin >> odpowiedz;
} while (odpowiedz != "nie");
return tmp;
}
void wyswietl(const sStudent& s, vector<pair<string, int>>&oceny)
{
cout << s.imie << endl;
cout << s.nazwisko << endl;
cout << s.rok_urodzenia << endl;
for (vector<pair<string, int>>::iterator i = oceny.begin(); i != oceny.end(); i++)
{
	cout << i->first;
	cout << i->second;
}

}

 

Z gory dziękuję. :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

powinno być:

 

wyswietl(*i);

void wyswietl(const sStudent& s);


void wyswietl(const sStudent& s)
{
       cout << s.imie << endl;
       cout << s.nazwisko << endl;
       cout << s.rok_urodzenia << endl;
       for (vector<pair<string, int>>::const_iterator i = s.oceny.begin(); i != s.oceny.end(); i++)
       {
               cout << i->first;
               cout << i->second;
       }

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki wielkie! Mam jeszcze pytanie. Czy teraz mogę korzystać z wektora oceny aby obliczyć srednie i wyznaczyc osobe z najwyzszą?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

szkoda, że nie uczą już pisać po nowemu (tj. C++11 jako baza) - wtedy wszystko wygląda przejrzyściej np.

 

void wyswietl(const sStudent& s)
{
       cout << s.imie << endl;
       cout << s.nazwisko << endl;
       cout << s.rok_urodzenia << endl;
       for( auto ocena : s.oceny )
       {
               cout << ocena.first;
               cout << ocena.second;
       }
}

czy też

 

 

        for( auto student : studenci )
       {
               wyswietl(student);
       }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze nowsiej, a przede wszystkim - czytelniej:

for( auto& [przedmiot, ocena] : s.oceny )
{
       cout << przedmiot;
       cout << ocena;
}

:D

 

Ale jak nie ma najnowszego standardu, to wspomniany wyżej foreach. Mały detal na później - z czasem warto sobie kiedyś ogarnąć kiedy używać auto zmienna, kiedy auto& zmienna, a kiedy const auto& zmienna.

 

A jeżeli już nawet zostać przy chodzeniu iteratorami, to chociaż użyć auto do określenia typu, bo pisanie i oglądanie tego... boli :P

Czyli zamiast

vector<pair<string, int>>::const_iterator i = s.oceny.begin();

prościej

auto i = cbegin(s.oceny);

 

 

Chyba powoli zaczynam rozumieć, lecz nie bardzo wiem czemu nie powinienem używać "usingnamespace std;"

Jak się pisze duży projekt, składający się z wielu plików, to unika się tego, bo może powodować kolizje nazw. Ty sobie zrobisz funkcję "min", w std jest std::min... i już zgryz gotowy. Inny powód - jeżeli ktoś by załączał Twój nagłówek w którym robisz using, to będziesz tej osobie śmiecić w przestrzeni nazw rzeczami, których może nie chcieć.

Póki robisz krótkie programy dla siebie - to nie jest problem. Po prostu pamiętaj o tym jakbyś robił coś większego.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...