Dziennik ocen studenta - prośba o sprawdzenie kodu

0

Jako, że jestem nowy to witam wszystkich. Mam prośbę o sprawdzenie kodu na zaliczenie na studiach. Są to moje początki z programowaniem więc proszę o wyrozumiałość. Proszę również o sugestie w których miejscach należało by poprawić kod lub coś dodać.

Treść zaliczenie brzmi:
"Napisać program ewidencjujący studentów i ich oceny z egzaminów. Program pobiera od użytkownika liczby N - określająca ilość studentów oraz M - określającą ilość egzaminów, a następnie dla każdego studenta wylicza średnią z ocen. Dane osoby powinny zawierać co najmniej imię, nazwisko. Program ma mieć możliwość zapisu danych do pliku i odczytu danych z pliku. Ma również zawierać menu."

 
#include <iostream>
#include <cstdio>
#include <math.h>
#include <fstream>

using namespace std;

int main()
{
	int liczba_stud, liczba_egz;											//ilosc studentow, ilosc egzaminow
	string imie[200], nazwisko[200];										//tablica z imionami i nazwiskami
	string dane;		 											
	int ocena_egz[200][50], egzamin[200];									//ocena z danego egzaminu, suma ocen z egzaminu
	double srednia;													//zmiena pod ktora bedzie podstawiana srednia
	int menu = 0;													//zminna sterujące funkcją switch - case
	
	
	fstream dziennik;													//funkcja pozwalająca na zapis i odczyt
	dziennik.open("dziennik.txt", ios::in | ios::out);
	{
		cout << "Witaj w programie Dziennik Studenta ver. 2.0" << endl;			//blok powitalny
		cout << endl;
		cout << "Aby rozpoczac prace nacisnij ENTER" << endl;
		cout << endl;
		system("PAUSE");
		
		cout << "Podaj liczbe studentow: ";
		cin >> liczba_stud;
		cout << "Podaj liczbe egzaminow: ";
		cin >> liczba_egz;
		system("PAUSE");
		
		cout << "Wybierz co chcesz zrobic: " << endl;							//blok menu
		cout << "1 - Rozpocznij program z zapisem" << endl;						
		cout << "2 - Odczytaj poprzedni zapis" << endl;
		cout << "3 - Zakoncz program" << endl;
		cin >> menu;
		
		switch (menu)														//sterowanie blokiem wyboru
		{
			
			case 1:
				{
				cout << "Wypełnij ponizszy formularz: " << endl;
				
					for (int i=0; i<liczba_stud; i++)
						{
							cout << "Student " << i+1 <<":" << endl;			//pobieranie danych studenta
							cout << "Imie: ";
							cin >> imie[i];
							cout << "Nazwisko: ";
							cin >> nazwisko[i];
							cout << endl;
							
								for (int e=0; e<liczba_egz; e++)
								{
									cout << "Egzamin " << e+1 << " - ocena: ";	//wypisywanie numerow egzaminu
									
									do								//petla sprawdzajaca oceny z zakresu od 2 do 5
									{
										cin >> ocena_egz[i][e];
										if (ocena_egz[i][e] > 5 || ocena_egz[i][e] < 2)
										cout << "Nieprawidlowa ocena! Wstaw poprawna: ";
										
									} while (ocena_egz[i][e] > 5 || ocena_egz[i][e] < 2);
								}
								
						cout << endl;
						}
						
					for (int i=0; i<liczba_stud; i++)	
						{
							cout << imie[i] << " " << nazwisko[i] << " - srednia z ocen: ";	
							
								for (int e=0; e<liczba_egz; e++)
									{
										egzamin[i]=egzamin[i]+ocena_egz[i][e];
									}
								
								srednia = (double)egzamin[i] / (double)liczba_egz;		//wylicza srednia z egzaminow dla danego studenta
								
								cout.precision(2);
								cout << srednia << endl;
								
							dziennik << imie[i] << " " << nazwisko[i] << " ";
								
								for (int e=0; e<liczba_egz; e++)
									{
										dziennik << ocena_egz[i][e] << ", ";
									}
							dziennik << "Srednia: " << srednia << endl;	//podstawienie pod zmienna srednia danego studenta
						}
				
				
				
				break;
				}
				
			
			case 2:
				for (int i=0; i<liczba_stud; i++)	//odczytywanie danych z zapisanego pliku
				{
				getline(dziennik, dane );
				cout << dane <<endl;				
				
				}
				break;
				
			case 3:				//konczenie programu
				exit (0);
				break;
		}
		
		dziennik.close();			//zamykanie pliku z danymi
	}
	
	return 0;
}
3

Nie piszę w C++. Ale zasugeruje uniwersalne rzeczy niezależne od języka.

Wedle mnie zbędna jest całkowicie ta pauza po podaniu nazwy programu i jego wersji.
O ilość studentów i przedmiotów powinieneś zapytać tylko przy chęci wprowadzania danych.
Dane o ilości studentów i przedmiotów powinieneś przy odczycie wziąć z pliku (i ją też tam zapisywać).

0

W dodatku nie sprawdzasz czy plik istnieje/ został poprawnie otworzony.

0

I à propos komentarzy - nie tłumacz w nich kodu, a jedynie zaznaczaj sobie co jest wykonywane; Nauczysz się tak robić i później nie będziesz w stanie zrozumieć kodu bez precyzyjnych objaśnień w komentarzach.

0

I nie rób wszystkiego w mainie.

0

Nie widzę sensu pisania 99% komentarzy w tym kodzie. Pamiętaj, że komentarze z reguły pisze się z konieczności, jeśli kod jest niejasny. W przyszłości komentując każdy skrawek będziesz tracił godziny, a jeśli o zgrozo w programie będzie błąd z tego względu że źle skomentowałeś kod to znalezienie błędu będzie zajmowało długi czas.

Co do samego kodu.
1)Mogłeś ten program oprzeć na klasie, ale piszesz, że jesteś początkujący więc podejrzewam, że tego jeszcze na zajęciach nie mieliście.

2)Warto by podzielić ten program na funkcje. Oddzielnie wczytywanie ocen, obliczanie średniej itp.

3)Co do otwierania pliku, jak ktoś wyżej napisał, nie sprawdzasz czy plik został prawidłowo otworzony.

4)Jeśli chcesz ulepszyć ten program, zabezpiecz go przed wczytaniem niepoprawnych danych. Twój program wysypuje się przy podaniu "niezwykłych" danych. Możesz tu po prostu dodać funkcję sprawdzającą czy podana dana jest prawidłowa (zwracająca np. true albo false). Ewentualnie możesz użyć tutaj wyjątków, ale podejrzewam, że pewnie na zajęciach też o tym nie było.

Ogólnie kod jest w miarę dobry, brakuje mi tu kilku elementów. Najbardziej przeszkadzają mi te komentarze.
Powodzenia

0

Dziękuje za uwagi :)
Za waszą radą usunąłem większość komentarzy, zapisuje tylko to co najważniejsze, co udało mi się to przeniosłem do funkcji, program w tej chwili też sprawdza czy plik udało się otworzyć itp.
Próbuję zapobiec wpisaniu innych ocen niż od 2 do 5 i niby wszystko jest ok tylko jak ktoś próbuje wpisać 4**,5 (przecinek) zamiast 4.**5 (kropka) to program się zapętla i wypisuje na ekranie "Nieprawidłowa ocena! Wstaw poprawna:". Ma ktoś pomysł jak temu zapobiec? Druga sprawa jak zrobić by program zapisywał średnia do pliku z jednym miejscem po przecinku, a nie 5? Przy wyświetlaniu średniej podczas działania programu wstawiłem funkcję

double zaokr (double srednia)
{
  int y = srednia * 1000;
  if (y % 100 >= 5) y += 10;
  return (y / 100) * 0.1;
} 

no ale to tylko formatuje wyświetlania a nie przy zapisie.
Pozdrawiam

0
double zaokr (double srednia) { return 0.5*round(srednia*2); }

1 użytkowników online, w tym zalogowanych: 0, gości: 1