C++ program - N učenika, srednja ocjena

poruka: 16
|
čitano: 13.808
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
C++ pomoć

Tek sam poceo upotrebljavati C++ i naisao sam na problem u  zadatku pa bih molio pomoc. 

Svaki prijedlog je dobrodosao I PRIHVATIT ĆU GA SA ZAHVALNOŠĆU.

 

Unesite broj N (najviše 10 – provjerite i ispišite upozorenje ukoliko je broj prevelik!) i
omogućite unos imena i po 5 ocjena za svakog od N učenika.
a. Izračunajte srednju ocjenu za svakog učenika, zapamtite i ispišite popis koji sadrži
ime učenika i srednju ocjenu.
b. Ispišite popis učenika (imena) sortirana abecedno.
c. Implementirajte funkciju za izračun srednje ocjene (kao parametri ulaze ocjene, a
funkcija vraća srednju ocjenu).
d. Omogućite unos podataka korištenjem funkcije za unos (dodatno uz standardni unos).

 
0 0 hvala 0
17 godina
protjeran
offline
C++ pomoć

Obično nikome ne volim rješavati domaću zadaću i sl., ali ovaj zadatak zahtjeva da se pređe poprilično puno programerskog gradiva, pa je dobar bar za ponavljanje :)

 

#include <iostream>
#define MAX 10
using namespace std;

struct SUcenik{
    char ime[20];
    int ocjena[5];
    double prosjek;
};
double prosjek(int ocjene[], int n){
    int sum = 0;
    for(int i = 0; i < n; i++)
        sum += ocjene[i];
    return (double)sum/n;
}
int main()
{
    SUcenik Ucenik[MAX], pom;
    int n;

    do{
        cout << "Unesi n: ";
        cin >> n;
    }while(n > 10 || n < 1);

    for(int i = 0; i < n; i++){
        cout << "Ime ucenika: ";
        cin >>    Ucenik[i].ime;
        for(int j = 0; j < 5; j++){
            cout << j+1 << ".Ocjena: ";
            cin >>    Ucenik[i].ocjena[j];
        }
        Ucenik[i].prosjek = prosjek(Ucenik[i].ocjena, 5);
    }
    //sortiraj
    for(int i = 0; i < n-1; i++)
        for(int j = 0; j < n-1-i; j++)
            if(strcmp(Ucenik[j+1].ime, Ucenik[j].ime))    {
                pom = Ucenik[j];
                Ucenik[j] = Ucenik[j+1];
                Ucenik[j+1] = pom;
            }
    // ispis
    for(int i = 0; i < n; i++)
        cout << Ucenik[i].ime << ", prosjek: " << Ucenik[i].prosjek << endl;
    return 0;
}

 

A ti riješi ovo zadnje s dodatnom funkcijom za unos...

Moj PC  
1 0 hvala 0
16 godina
neaktivan
offline
C++ pomoć

Ja sam isto tek poceo koristit C++. Ma ustvari da budem iskren prvi put se sluzim programiranjem. Totalni pocetnik sam.

Uglavnom citao sam nekakav tutorial, pitao nekolicinu ljudi i svima ne radi ovaj source:

 

 

#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
     string a;
     printf ("Write the password: ");
     scanf ("%s",&a);
if (a=="lozinka")
printf ("Password is correct!");

else
printf ("Password is incorrect");

system ("PAUSE");
     return 0;
}

 

Spirit...
Poruka je uređivana zadnji put ned 20.12.2009 21:53 (Neutral).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ pomoć

Zašto svi pišu c++ u duhu c-a ,dajte budite moderni ....ovako to radi :

 #include <iostream>
#include <cstdlib>
#include<string>   //includaj ovo zaglavlje (radi unosa)
using namespace std;
int main ()
{
     string a;
    cout<<"Write the password: "<<endl;
 getline(cin,a);
if (a=="lozinka")
cout<<"Lozinka je ok!"<<endl;

else
cout<<"Lozinka nije ok!"<<endl;

system ("PAUSE");
     return 0;
}

...to je u duhu pravog c++-a.

sad će mi se javiti c programeri Nevinašce koji vole pisati c++ u sintaksi c-a....

Private
Poruka je uređivana zadnji put ned 20.12.2009 22:22 (Private).
15 godina
neaktivan
offline
C++ pomoć

@Tracer

dobro uradjeno, samo sto nisi u struct SUcenik, umjesto niza uzeo string, za ime..isto tako za ocjene si mogo vektor, mada ovde eto ako se trazi bas 5 onda je brze i lakse niz..za ime si ipak mogo string, il vektor stringove, buduci da moze se i prezime unijet..

neda mi se pisat program, a i predpostavljam da si daleko iskusniji od mene, pa zato i pitam sto ne ovako, jer ja bih koristio string..

 

i mogao si sortirat pomocu sort() i iteratora..cini mi se da bi to sve bilo malo vise c++ a manje c..a i lakse..

Poruka je uređivana zadnji put ned 20.12.2009 22:48 (ismar89).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ pomoć
Neutral kaže...

Ja sam isto tek poceo koristit C++. Ma ustvari da budem iskren prvi put se sluzim programiranjem. Totalni pocetnik sam.

Uglavnom citao sam nekakav tutorial, pitao nekolicinu ljudi i svima ne radi ovaj source:

 

 

#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
     string a;
     printf ("Write the password: ");
     scanf ("%s",&a);

if(strcmp("lozinka",a) == 0)       //if (a=="lozinka") -> krivo
printf ("Password is correct!");

else
printf ("Password is incorrect");

system ("PAUSE");
     return 0;
}

 

Ne radi zato sto se stringovi ne uspoređuju sa "==" nego sa funkcijom strcmp().

 

ismar89 kaže...

@Tracer

dobro uradjeno, samo sto nisi u struct SUcenik, umjesto niza uzeo string, za ime..isto tako za ocjene si mogo vektor, mada ovde eto ako se trazi bas 5 onda je brze i lakse niz..za ime si ipak mogo string, il vektor stringove, buduci da moze se i prezime unijet..

neda mi se pisat program, a i predpostavljam da si daleko iskusniji od mene, pa zato i pitam sto ne ovako, jer ja bih koristio string..

Zasto includati <string> header radi jednog jedinog stringa ili <vector> header radi jednog vektora

osim ako nije bas preko potrebno?

Pogotovo ako ovakva implementacija savrseno odgovara zahtjevima.

Jesi kad cuo za pojam "Overengeneering" ?

Cemu koristiti Vector ako je eksplicitno zadano 5 ocjena, sam si reko da je ovako lakse i brze sto ej tocno.

Cemu koristiti Vector koji sadrzi stringove zbog prezimena ako samo mozes dodati jos jedan string ili niz karaktera?

 

Pravi programer ne bi trebao koristi tehnologije ili u ovom slucaju npr. vectore samo zato sto moze nego tada kad smatra

da su potrebne.

 

All religions are the same: religion is basically guilt, with different holidays.
Poruka je uređivana zadnji put pon 21.12.2009 4:23 (drnde).
16 godina
neaktivan
offline
RE: C++ pomoć
Neutral kaže...

Ja sam isto tek poceo koristit C++. Ma ustvari da budem iskren prvi put se sluzim programiranjem. Totalni pocetnik sam.

Uglavnom citao sam nekakav tutorial, pitao nekolicinu ljudi i svima ne radi ovaj source:

 

 

#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
     string a;
     printf ("Write the password: ");
     scanf ("%s",&a);
if (a=="lozinka")
printf ("Password is correct!");

else
printf ("Password is incorrect");

system ("PAUSE");
     return 0;
}

 

Ono što bih ja rekao da je krivo:

1. nije includan <string>

2. učitavanje stringa ide preko cin

 

== može kod stringova, to je operator koji postoji u c++-u :D

 

Ako se želi c-ovski, onda:

1. promjenit početak program, tj includat potrebna zaglavlja

2. kod deklaracije varijable a ide char a[neki_broj] ili char*a pa dinamička alokacija kasnije

3. u c-u nema == za stringove (tj nizove charova), pa ide strcmp

15 godina
neaktivan
offline
RE: C++ pomoć

@drnde

razumijem..iskreno nisam pravio niti jedan veci program, tek se upoznajem sa ovim na faxu, i znam da bih dobio manje bodova da u c++ programu koristim niz karaktera a ne string :D

prosto da program bude "siguran za budale", za ime bih uzeo string..i to preko getline()..prosto da ne dodje do greske ako neko slucajno umjesto ime upise i prezime..mada program nije napisan za to..ali, valjda je i obaveza programera da misli o tome da osigura program da se bas nikada ne pojavi greska, cak i kada ga najveci debil koristi..za zadacu mozda nije potrebno, jer se trazi bas ovakav program, ni manje, ni vise..al ako bi ovaj kod bio dio nekog veceg programa, onda mislim da itekako ima smisla koristiti string za ime..posebno u vecim programima uzasno nervira kad u pola rada se pojavi neka glupa greska, radi stamparske greske, ili prosto zato to je neko smotan :P

znam kad sam radio program u QBasic za takmicenje, i nakon mozda 2-3 hiljade linija koda (program nije bio nista ekstra, samo obiman) sam ga dao starom da koristi (tad nije znao ugasit racunar, znao je upalit xD)

sva sreca, nakon 1 minutu nasao je gresku haha, koju sam ispravio, i program je bio ok..

i mislim da je dobra praksa i na mailm programima osiguravat za takve greske, mada na ovima konkretno nije potrebno, ali u buducnosti nece niti jedan program biti ovako jednostavan kao ovaj, tako da..

Poruka je uređivana zadnji put pon 21.12.2009 5:33 (ismar89).
17 godina
protjeran
offline
C++ program - N učenika, srednja ocjena

Za sve one koji vole komplicirati, i misle da zapravo time pokazuju nekakvo znanje.. u krivu su. Evo, baš me zanima koliko tih će razumijeti onaj gore isti program napisan na sljedeći način.

 

#include <iostream>
#define MAX 10
using namespace std;

class CUcenik{
    private:
        char ime[20];
        int ocjena[5];
        double prosjek;
        // tek toliko da budemo cool...
        friend istream& operator >> (istream& izlaz, CUcenik &pom);
    public:
        double GetProsjek();
        char* GetIme() { return ime; }
};
// zašto jednostavno kad možemo zakomplicirati?
double CUcenik::GetProsjek(){
    int sum = 0;
    for(int i = 0; i < 5; i++)
        sum += ocjena[i];
    return (double)sum/5;
}
// e tek smo sada prave face ;)
istream& operator >> (istream& ulaz, CUcenik &pom){
    cout << "Ime ucenika: ";
    ulaz >> pom.ime;
    for(int i = 0; i < 5; i++){
        cout << i+1 << ".Ocjena: ";
        ulaz >> pom.ocjena[i];
    }
    return ulaz;
}
int main()
{
    CUcenik Ucenik[MAX], pom;
    int n;

    do{
        cout << "Unesi n: ";
        cin >> n;
    }while(n > 10 || n < 1);

    for(int i = 0; i < n; i++)
        cin >> Ucenik[i];    // gle ti ove fore!
    for(int i = 0; i < n-1; i++)
        for(int j = 0; j < n-1-i; j++)
            if(strcmp(Ucenik[j+1].GetIme(), Ucenik[j].GetIme()))    {
                pom = Ucenik[j];
                Ucenik[j] = Ucenik[j+1];
                Ucenik[j+1] = pom;
            }
    for(int i = 0; i < n; i++)
        cout << Ucenik[i].GetIme() << ", prosjek: " << Ucenik[i].GetProsjek() << endl;
    return 0;
}

 

I eto.. mislih dodati još sortiranje preko pokazivača na funkcije (qsort), te eventualno napraviti koji predložak funkcije, ili čak klase pa da i takvi koji kompliciraju budu zadovoljni Namigiva. No mislim da sam dovoljno izrazio svoju poantu.

 

I sada.. usporedite prvi program s ovime pa recite koji bi vi odabrali.

Poruka je uređivana zadnji put pon 21.12.2009 10:29 (Tracer).
Moj PC  
1 0 hvala 0
16 godina
neaktivan
offline
RE: C++ program - N učenika, srednja ocjena

...tracer vidim da su te iziritirali...pa si sve lijepo stavio u klasu ,čak i overloado operator unosa tako ta sad "mi " jednostavno samo unesemo učenika kontrolirano pomoću "našeg operatora " ,pa mogao si još to lijepo razdvojiti u fiile-ove .h i .cpp i to je to .....uuh kako su te živcirali ...to mi je poznato..pmogneš a oni kompliciraju još više ..Nevinašce

 

 

Private
17 godina
protjeran
offline
C++ program - N učenika, srednja ocjena

EDIT: Ne kanim se živcirati Namigiva

 

Nema potrebe kompliciranju. Ako se nešto može napraviti jednostavno - onda to tako i napravi.

Poruka je uređivana zadnji put pon 21.12.2009 11:13 (Tracer).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ program - N učenika, srednja ocjena

...eto vidiš kako je sad jednostvnije kad se tako objasni ......Namigiva....e sad već idem u off topic...

Private
15 godina
neaktivan
offline
C++ program - N učenika, srednja ocjena

jako zakompliciran program, posebno radi friend istream..do toga jos nisam doso sa svojim predavanjem :D

al ocigledno nisi shvatio komentar, objekti, metode i algoritmi ne cine komplikovaniji kod, cak ga cine razumljivijim, laksim za odrzavanje i efikasnijim..i valjda je to, kao vec navedeno, u "duhu c++", a ne nizovi struktura, nizovi karaktera..moze se svaki program rijesit uz petlju, if naredbu i niz, i mozda jos koju funkciju..i ako neko jos uvijek zeli razmisljat tako, i sklapat sebi stvari koje su ljudi vec davno napravili, puno efektivnije, brze i lakse, onda izvoli..moj komentar nije napad na tebe i tvoje sposobnosti, nego samo savjet za onog ko je postavio ovu temu, i savjet koji ja dobijam redovno..zakomplicirao si program tako da ga je teze razumit, al je sposoban ko i onaj prije..a mozes ga napravit prostim za razumit, a duplo efikasnijim, al eto, ocigledno si uvrijedjen, mada ti to stvarno ne treba, jer sam siguran da ce meni trebat puno godina i iskustva ako zelim dostic tvoj nivo

Moj PC  
0 0 hvala 0
17 godina
protjeran
offline
RE: C++ program - N učenika, srednja ocjena

Sve 5 ;) Nisam ja uvrijeđen ili takvo što. Samo želim reći da je nepotrebno tražiti neka nova znanja samo da bi to bilo u "duhu c++a" ako i ova prethodna znanja zadovoljavaju i ničime ne daju slabije rezultate/performanse od novijih pristupa. Jasno, objektni pristup je poželjan, ali ne i nužno greška ako ga nema. Zato ćete mene rijetko vidjeti da koristim vektore i STL jer jednostavno to mene ničime ne impresionira u odnosu na ono što već postoji. Također, string pogotovo izbjegavam koristiti zbog nedefinirane veličine tog tipa podatka, gdje neke varijante stringa mogu zauzeti onoliko memorije koliko je raspoloživo u RAMu. Tada je teško napraviti bilo kakvo blokovsko pisanje/čitanje jer zbog stringa nije riječ o blokovima fiksne duljine, dok ako se koristi char[] onda uvijek znam koliko to mjesta u memoriji zauzima.

15 godina
neaktivan
offline
C++ program - N učenika, srednja ocjena

ocigledno je to prosto razlika u stilu..ja sam, za vrijeme osnovne skole i programiranja u QBasic-u, bukvalno "obozavao" naredbu GO TO :D

sad je ne koristim nikako, cak nisam do skoro ni znao da to postoji u c i  c++, ali nam je profesor srdacno preporucio da je nikad ne koristimo :p

a kako se sv moglo rijesit uz if uslov i go to, sve, al zato kasnije nemam ni sam pojma sta pise..upravo radi takvih stvari, i ponekad kompliciranije izvedbe, ja preferiram ono malo "vise" sto c++ nudi, a to su algoritmi i predefinirani objekti, kontejneri itd..prosto mi je program pregledniji, laksi za obradu, promjene..mozda neko ko ne zna za te naredbe preferira klasicni c pristup, ali kad nauci to sve, vjerujem da ce mu bit lakse i "ljepse" radit tako, al to je ipak stil, i otiso sam daleko u offtopic..

 

izvinjavam se jos jednom ako si imao osjecaj da te napadam, samo sam malo skreno u offtopic i poceo pricat o stvarima koje idu malo dalje od ove zadace, prosto radi diskusije..ali vjerovatno za to ima neka druga tema..

Moj PC  
0 0 hvala 0
17 godina
protjeran
offline
RE: C++ program - N učenika, srednja ocjena

Sve je ok. Ne moraš se ispričavati. Ispravno je koristiti objektni pristup, a pogotovo ako već učiš ispočetka. Ja sam se nekako navikao na C stil i teško mi se prebaciti na nešto drugo dok ne vidim baš nešto toliko isplativo u usporedbi s ovim što primjenjujem već dugo vremena. A može biti da je i lijenost u pitanju Belji se.

 

Inače, goto naredba je na nekim fakultetima zabranjena za korištenje, dok i ja primjenjujem tu praksu. Razlog je najviše jedan te isti: Svaki dio code-a treba biti maksimalno neovisan o ostatku programa. Zato se negdje zabranjuje i korištenje globalnih varijabli.

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice