EDIT: O przepraszam, w międzyczasie wstawiłeś następny kod. Ten mój post tyczy się twojego POPRZEDNIEGO kodu. Już patrzę na następny.
for(int i=1;i<n+1;i++)
{
cout<<"Podaj imie i nazwisko "<<i;cout<<". ucznia: "<<endl;
cin>>imie;
cin.getline( lancuch, rozmiar);
cout<<"Podaj srednia ocen "<<i;cout<<". ucznia: "<<endl;
cin>>a;
}
Masz 1 zmienną imię
, 1 zmienną lancuch
, 1 zmienną a
. Do każdej z tych zmiennych zapisujesz n
wartości. Tak to nie idzie. Każda zmienna przechowuje 1 wartość, a jeżeli próbujesz do niej zapisać następną, to ta druga NADPISUJE tą pierwszą.
Przykład, „jak to działa”.
#include <iostream>
#include <string>
using namespace std;
int main() {
string slowo;
cout << "Podaj 1. slowo:\n";
cin >> slowo;
cout << "Podaj 2. slowo:\n";
cin >> slowo;
cout << "Zawartosc zmiennej slowo: " << slowo << '\n';
cout << "Zawartosc zmiennej slowo po raz drugi: " << slowo << '\n';
system("pause");
return 0;
}
Uruchom ten przykładowy program, daj mu 2 słowa (np. Pianino
i Fortepian
), i zobacz, co się stanie.
Aby rozwiązać ten problem, potrzebujesz TABLICY zmiennych. Tablica ma mieć miejsce na tyle wartości, ile chcesz móc pamiętać.
Tyle jeśli chodzi o błędy. Teraz napiszę o kilku sprawach w kwestii tzw. „ładnego kodu”. Czyli – o co konkretnie rzucają się wszyscy ci, którzy zarzucają Ci niechlujność.
string imie;
const short rozmiar=50;
char lancuch[rozmiar];
To jest oczywiście poprawne. Ale po co? Chodzi mi o to, że zmienne typu string
duplikują funkcjonalność tablic znaków, tyle że łatwiej się ich używa. Na twoim miejscu zdecydowałbym się (dla prostoty), czy chcę używać string
ów, czy tablic znaków (char lancuch[costam]
). Czyli albo:
string imie;
string nazwisko;
albo:
const short rozmiar = 50;
char imie[rozmiar];
char nazwisko[rozmiar];
(Skoro już sam zacząłeś używać string
ów, to proponowałbym to pierwsze, bo trudniej o błędy).
ALe jeszcze raz: to co tu piszę, to tylko kwestia prostoty, nie poprawności. Tu akurat „twardego” błędu nie ma.
char lancuch[rozmiar];
Nazewnictwo. Nazywasz zmienną lancuch
, a przechowujesz w niej nazwisko. To nie byłoby lepiej nazwać tej zmiennej tak: char nazwisko[rozmiar]
?
Na marginesie: nie przyszło Ci do głowy, że możesz przechowywać imię i nazwisko RAZEM?
string imienazwisko;
cout << "Podaj imie i nazwisko:\n";
getline(cin, imienazwisko);
Albo:
char imienazwisko[50];
cout << "Podaj imie i nazwisko:\n";
cin.getline(imienazwisko, 50);
Niestety, o jednym trzeba pamiętać: kiedy używasz tablic znaków, to piszesz cin.getline(zmienna, liczbaZnakow)
. Kiedy używasz string
ów, to piszesz getline(cin, zmienna)
. Życie.
struct Dane
{public:
char imie,nazwisko;//liczba osob
int numer;
};
Po co definiujesz strukturę, skoro nigdzie niżej z niej nie korzystasz?
Pomijając to, że struktura jest niewykorzystana:
struct Dane
{public:
public
jest zbędne (ale nie niepoprawne), kiedy używasz struct
.
char imie,nazwisko;
UWAGA – TWARDY BŁĄD. Byłby, gdybyś użył tej struktury.
char imie
– uwaga, to jest JEDEN znak! JEDNA litera! Rzadko kiedy imiona składają się tylko z jednej litery. To samo z nazwiskiem.
DO przechowywania napisów (a takimi są imiona i nazwiska) musisz używać tablic znaków, albo string
ów, o których pisałem wyżej.
Zbędne klamerki.
cin>>n;
{
for(int i=1;i<n+1;i++)
Po co klamerka przed for
?
TO samo tutaj:
cin>>a;
}
}
{
for(int i=1;i<n+1;i++)
Nie jest to niepoprawne, ale może się stać, gdybyś zaczął w tych zbędnych klamerkach deklarować jakieś zmienne.
#include <conio.h>
#include <windows.h>
Te nagłówki są zbędne, bo nie wykorzystujesz oferowanej przez nie funkcjonalności. Można je wyrzucić. Nie znaczy to, że ich dołączenie jest niepoprawne.
Z drugiej strony, skoro używasz zmiennych typu string
:
string imie;
To musisz dołączyć nagłówek:
#include <string>
Twój kod może, ale nie musi działać, nawet jeśli tego nagłówku nie dołączysz. Można niedołączenie tego nagłówku uważać za „twardy” błąd.
Formatowanie. Tutaj pokażę ci po prostu na przykładzie, jak by moi „przedpiścy” chcieli, żeby twój kod wyglądał (nic nie zmieniałem w kwestii poprawności oprócz nagłówków i klamerek):
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
struct Dane
{
public:
char imie, nazwisko;
//liczba osob
int numer;
};
int main(int argc, char *argv[])
{
int n;
float a;
string imie;
const short rozmiar=50;
char lancuch[rozmiar];
cout << "Podaj liczbe uczniow: ";
cin >> n;
for(int i=1;i<n+1;i++)
{
cout << "Podaj imie i nazwisko " << i << ". ucznia: " << endl;
cin >> imie;
cin.getline(lancuch, rozmiar);
cout << "Podaj srednia ocen "<< i << ". ucznia: " << endl;
cin >> a;
}
for(int i=1;i<n+1;i++)
{
cout << "Uczen " << imie;
cout << " ma srednia: " << a << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}