Dziennik ocen studenta - prośba o sprawdzenie kodu

2014-12-27 21:18
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;
}
brak podziału na klasy, brak znajomości podstawowych kontenerów list, set ... - karolinaa 2014-12-27 21:30

Pozostało 580 znaków

2014-12-27 21:27
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ć).


Pozostało 580 znaków

2014-12-27 21:33
0

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

Pozostało 580 znaków

2014-12-27 21:33
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.


edytowany 1x, ostatnio: furious programming, 2014-12-27 21:34

Pozostało 580 znaków

2014-12-27 21:38
0

I nie rób wszystkiego w mainie.

Lista będzie długa... :D - furious programming 2014-12-27 22:01

Pozostało 580 znaków

2014-12-28 10:15
cpsc
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

Pozostało 580 znaków

2014-12-28 22:27
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

edytowany 1x, ostatnio: Muszkin93, 2014-12-28 22:28

Pozostało 580 znaków

2014-12-28 22:41
0
double zaokr (double srednia) { return 0.5*round(srednia*2); }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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