www.rgc.ro Web analytics

Jump to content

Programare


Alin N
 Share

Recommended Posts

Salutare!

Am si eu o mica problema la programare si nu imi dau seama la ce gresesc. Ma gandesc ca printre atatia instrumentisti trebuie sa fie macar cativa care sa aibe idee cu ce se mananca programarea, macar un pic. Mentionez ca eu sunt la inceput. Am vrut sa fac un program care sa imi citeasca din fisierul elev.in niste date ale unui elev (nume, prenume si trei note) apoi sa imi scrie in fisierul elev.out aceste date in formatul:

Nume: .......

Prenume: .......

Note: nota1 nota2 nota3

Media notelor: ...

Am facut ok in mare. Imi afiseaza asa cum vreau, doar ca la scrierea notelor in loc sa imi scrie de ex 7.50 9.20 8.05 si apoi sa imi calculeze media, imi scrie 0.00 peste tot. Sunt si un pic obosit ca am stat sa invat pt examene pana acum, dar totusi, nu imi dau seama la ce gresesc. Codul il gasiti mai jos, poate reusiti sa imi dati un sfat. Structurile le-am inclus pt ca intra in materia de examen si momentan fac probleme care sa combine cat de cat structuri, fisiere si pointeri.

 

#include <stdio.h>

int main()

{

struct elev

{char nume[20], prenume[30];

float note[3], medie;} elev;

FILE *fin=fopen("elev.in","r");

if (!fin)

{

printf("Eroare la deschiderea fisierului elev.in!\n");

return 1;

}

else printf("Fisierul elev.in a fost deschis cu succes!\n");

FILE *fout=fopen("elev.out","w");

if(!fout)

{

printf("Eroare la deschiderea fisierului elev.out!\n");

return 2;

}

else printf("Fisierul elev.out a fost deschis cu succes!\n");

int i=0;

float n=0,suma=0;

char c='a';

while ((c!=' ')&&(i<20))

{

c=fgetc(fin);

elev.nume=c;

i++;

}

while (c!=' ') c=fgetc(fin);

i=0;

while ((c!='\n')&&(i<30))

{

c=fgetc(fin);

elev.prenume=c;

i++;

}

while (c!='\n') c=fgetc(fin);

// de aici in jos presupun ca e problema, dar nu imi dau seama exact ce e gresit.

for (i=0;i<3;i++) elev.note=fscanf(fin,"%.2f",&elev.note);

for (i=0;i<3;i++) suma=suma+elev.note;

elev.medie=suma/3.0;

fprintf(fout,"Nume: ");

i=0;

while (elev.nume!=' ')

{

fprintf(fout,"%c",elev.nume);

i++;

}

fprintf(fout,"\nPrenume: ");

i=0;

while (elev.prenume!='\n')

{

fprintf(fout,"%c",elev.prenume);

i++;

}

for (i=0;i<3;i++) fprintf(fout,"\nNotele la bac: %.2f ", elev.note);

fprintf(fout,"\nMedia de la bac a elevului este: %.2f", elev.medie);

fclose(fin);

fclose(fout);

getchar();

return 0;

}

 

Daca poate cineva sa ma ajute, dau o bere. Ca mi-am zapacit creierii, uitandu-ma ca boul la cod.

Edited by metal_messiah
Link to comment
Share on other sites

ai definit structul dar nu l-ai instantiat.

 

tre sa faci ceva e genul

 

elev e;

 

e =(elev)malloc(sizeof(struct * elev));

 

 

vei trece astfel datele in structul e care instantiaza elev.

 

dupa aia vei obtine pointeri catre datele din el:

 

float* p_note = &(e->note);

 

si ve scrie for (i=0;i<3;i++) elev.note=fscanf(fin,"%.2f",&elev.note);

 

 

asa: for (i=0;i<3;i++) fscanf(fin,"%.2f",p_note);

 

 

spor(t)

 

fscan f scrie automat in parametrul 3 datele din param 1 gasite cu conditia din param 2

Edited by iulian
Link to comment
Share on other sites

Greseala este aici:

for (i=0;i<3;i++) elev.note[i]=fscanf(fin,"%.2f",&elev.note[i]);

 

Corect este:

for (i=0;i<3;i++) fscanf(fin,"%f",&elev.note[i]);

 

PS: N-am vazut ca a raspuns deja cineva

L-a instantiat la capat struct elev { char nume[20], prenume[30]; float note[3], medie;} elev;

Codul sursa e o amestecatura de C++ si C asa ca merge cum a facut el in varaiantele de compilatoare care aloca automat (gen borland c++ 5.0, microsoft visual C++ 6.0).

Nu e nevoie de %.2f cand dai scanf pt ca e mult mai flexibil cu %f

Edited by serby
Link to comment
Share on other sites

Greseala este aici:

for (i=0;i<3;i++) elev.note[i]=fscanf(fin,"%.2f",&elev.note[i]);

 

Corect este:

for (i=0;i<3;i++) fscanf(fin,"%f",&elev.note[i]);

 

PS: N-am vazut ca a raspuns deja cineva

L-a instantiat la capat struct elev { char nume[20], prenume[30]; float note[3], medie;} elev;

Codul sursa e o amestecatura de C++ si C asa ca merge cum a facut el in varaiantele de compilatoare care aloca automat (gen borland c++ 5.0, microsoft visual C++ 6.0).

Nu e nevoie de %.2f cand dai scanf pt ca e mult mai flexibil cu %f

 

Mersi frumos! Acum am ajuns acasa si am probat varianta propusa de tine. Functioneaza. Mersi!

Link to comment
Share on other sites

Greseala este aici:

for (i=0;i<3;i++) elev.note[i]=fscanf(fin,"%.2f",&elev.note[i]);

 

Hi,hi,hi!Acum am vazut acest post.

Ce misto! O asemenea linie de cod nici ca as fi putut sa-mi imaginez vreodata. Probabil a scris-o din neatentie.

 

Oricum, corect este sa iei referinta intregii structurii si dupa aceea sa accesezi membrii ei.

Edited by ggg
Link to comment
Share on other sites

Asa de curios, in ce compilator lucrezi?

 

Nu este un "debug" cu care sa mergi pe fiecare pas si sa vezi unde nu functioneste treaba?

Lucrez cu mai mult compilatoare , depinde de OS .

Bineinteles ca exist moduri de debugging care depind in mare parte de RAD si nu de compilator . Dar problemele de stiva si "memory alignment" nu prea le vezi in modul debug , ruland step-by-step .

Edited by ggg
Link to comment
Share on other sites

Nu sunt foarte avansat nici eu dar ma ajuta cand gasesc UNDE nu mai merge ceva. Macar stiu cam ce sa caut si ma descurc.

Disfunctionalitati sunt de multiple tipuri. Vei gasi ceva care nu functioneaza (flagrant) din cauza sintaxei sau a lipsei initializarilor. Poti , de asemenea , sa urmaresti algoritmul implementat de tine...dar toate problemele care deriva din "memory leak" & "associatii" nu le vei gasi in acest mod. Daca scrii cod ca sa treci un examen , chiar ca nu doare pe nimeni. Dar daca vrei sa devii profesionist, lucrurile trebuiesc privite din alte perspective.

Edited by ggg
Link to comment
Share on other sites

Ce nu inteleg eu de ce s-ar complica cineva, mai ales care vrea sa invete programare sa lucreze cu limbaje si compilatoare obosite care folosesc alocari de memorie si nu folosesc limbaje cu automatic garbage collection. Pana mea, nu mai suntem in secolul trecut si daca nu vrei sa faci vreun sistem de operare sau softuri pentru deviceuri care nu inteleg decat assembler atunci e arhisuficient un limbaj ca Java sau Visual C#. In afara de asta cele 2 variante propuse de mine sunt REALLY object oriented si nu sute de librarii adaugate de unii si de altii in timp ca sa depaseaca problemele mari pe care limbaje ca C/C++ le-au dovedit de-a lungul timpului.

 

PS: Daca ma contrazice cineva sau vrea sa ma ia la misto am sa-l intreb simplu ref la C/C++: Cate metode de a citi un string sunt? Raspuns: nu se stie, ca fiecare librarie adaugata in timp a avut propria varianta.

 

PS2: Am lucrat in C/C++ aproape 5 ani pana am trecut la Java vreo 2-3 apoi la C# de 5 ani.

  • Like 1
Link to comment
Share on other sites

C/C++/ASM au avantaje de netagaduit din pct de vedere economic datorita unei mult mai bune utiizari a resurselor. Garbage collection este un procedeu sigur care insa are la baza o risipa imensa. Adroid-ul este un exemplu de sistem de operare in care programarea protejata (adica in limbaje care nu permit accesarea directa a memoriei) a dus la o risipa enorma de resurse. Avem telefoane Quad core care nu sunt in stare sa faca amre lucru datorita acestei risipe.

Cum ar fi ca intr-o masina calculatorul acesteia sa fie programat intr-un limbaj protejat. Pai in loc de un procesor de 200-300 MHz ar fi nevoie de unul la 2000-3000 MHz care are un alt regim termic si este mult mai sensibil la diversele probleme de natura mecanica sau electrica care pot surveni intr-un mediu atat de necontrolat precum un automobil.

Driverele, Jocurile si programele care fac procesare real-time (cum sunt cele audio) sunt scrise in limbaje neprotejate din acelasi motiv. Se doreste economisirea resurselor.

Link to comment
Share on other sites

Ce nu inteleg eu de ce s-ar complica cineva, mai ales care vrea sa invete programare sa lucreze cu limbaje si compilatoare obosite care folosesc alocari de memorie si nu folosesc limbaje cu automatic garbage collection. Pana mea, nu mai suntem in secolul trecut si daca nu vrei sa faci vreun sistem de operare sau softuri pentru deviceuri care nu inteleg decat assembler atunci e arhisuficient un limbaj ca Java sau Visual C#. In afara de asta cele 2 variante propuse de mine sunt REALLY object oriented si nu sute de librarii adaugate de unii si de altii in timp ca sa depaseaca problemele mari pe care limbaje ca C/C++ le-au dovedit de-a lungul timpului.

 

PS: Daca ma contrazice cineva sau vrea sa ma ia la misto am sa-l intreb simplu ref la C/C++: Cate metode de a citi un string sunt? Raspuns: nu se stie, ca fiecare librarie adaugata in timp a avut propria varianta.

 

PS2: Am lucrat in C/C++ aproape 5 ani pana am trecut la Java vreo 2-3 apoi la C# de 5 ani.

 

deci stii ca daca vrei sa storci fiecare strop de performanta din aplicatie nu ai ce face cu c# / java.

 

Eu folosesc C#/Java in testare automata si e ok, ca scriu cod rapid si nu ma doare de performanta, dar nici nu am pretentii de performata.

Link to comment
Share on other sites

Ce nu inteleg eu de ce s-ar complica cineva, mai ales care vrea sa invete programare sa lucreze cu limbaje si compilatoare obosite care folosesc alocari de memorie si nu folosesc limbaje cu automatic garbage collection.

Aplicatiile de sistem folosesc aceste compilatoare , care nu aloca numai memorie . Se intampla mult mai multe lucruri .

In plus , ce te faci cand ai de dezvoltat solutii pt *Nix-uri(Linux,Solaris,..etc) sau mai grav, in QNX ????

Programarea nu se rezuma numai la costruirea unor pagini in ASP.

Cat despre eficienta mecanismelor GC ,..o lasi balta numai cand te uiti in TaskManager .

Link to comment
Share on other sites

Off topic este de mult.Nu mai este nicio problema :)

ASM si C sunt cele mai utilizate in scrierea codurilor pt interfete cu alte elemente periferice (precum un driver) . Sunt multe motive pt care inca se programeaza in ASM,C sau chiar C++ .

Bineinteles ca in Romania poti sa obtii un venit mai mult decat decent ca analist programator . Limbajele de programare sunt ca si limbile straine. Le inveti, nu-i nicio problema . Dar ce te apuci sa programezi, daca nu cunosti arhitecturi ???????? Chiar si o aplicatie Web Multi-tier , trebuie facuta in mare cunostinta de cauza pt a functiona ireprosabil.

 

Ce vreau sa subliniez!? Doar cunoasterea unui limbaj de programare , nu reprezinta vreo garantie ca maine "planeta e la picioarele tale" .

 

P.S. Cunoasterea limbajului C este foarte util si in scrierea codurilor pt uC , PIC, ATMEL...etc

Edited by ggg
Link to comment
Share on other sites

@iulian, era vorba de o aplicatie care citeste niste fisiere si genereaza altele, deci nu stiu ce mare performanta vrea userul sa obtina cu asta.

 

@ggg, eu lucrez dupa cum spuneam de aproape 7-8 ani in mediul GC si am facut aplicatii semi-critice, nu pagini de web cum banuiesti tu. NU am facut aplicatii critice pentru ca intr-adevar nu se pot face sau se pot face foarte greu. Pana la urma am si in C# optiunea de unsafe si ma lasa sa ma joc cu memoria daca vreau. Dar de ce sa vreau pointeri, calcule de alocari, dll Hell si alte asemenea aberatii? Ca asa ne-au invatat unii in facultate ca e bine? Bullshit.

 

a, si tot la ggg. Desi am avut posibilitatea sa ma angajez si la o firma care lucra cu C++ pentru Linux si alte platforme ciudate cu x, pe care le-am invatat in facultate ca si mani thing cand ele de fapt erau si ele pe acolo ca sa nu zica ca nu sunt, am renuntat. Principiul meu e ca softul meu se adreseaza clientilor care isi permit macar o licenta de windows. Altfel cum sa-mi plateasca ei licenta la softurile mele daca ei saracii nu isi pot permite una de Windows.

 

a, si inca una pt ggg, intr-adevar cunoasterea unui limbaj de programare nu reprezinta garantia ca ai lumea la picioarele tale, dar faptul ca eu am lucrat mereu cu cea mai noua tehnologie de la Microsoft .Net 1.0, 1.1, 2.0, 3.0, 3.5, 4.0 4.5 samd ma face pe mine sa fiu mai in contact mult cu evolutia tehnologica decat daca as lucra in vim-ul de Linux si as calcula alocari de pointeri.

 

In loc sa calculez pointeri sau sa gasesc una din cele x metode de a citi/aloca un string mai bine ma preocup de ce vrea clientul si ii fac aplicatia in Visual Studio in juma de zi cu tot ce vrea el, GUI, BD, Rapoarte samd.

Link to comment
Share on other sites

Ok.Tu lucrezi de 8 ani , eu am experienta de peste 25 de ani, dar ce importanta are ? In momentul in care va trebui sa dezvolti aplicatii pt industrii care produc "in foc continuu" si unde software-ul nu are voie sa se opreasca , iti vei aduce aminte (brusc si dintr-odata) de toate bullshiturile care le-ai invatat la scoala . De abia atunci iti vei da seama ca si alea care (daca) le-ai invatat , nu sunt suficiente.

Edited by ggg
Link to comment
Share on other sites

@ggg, respect experienta ta, nu am scris ca sa ma dau mare sau smecher. Doar ca ma refeream la scopul pentru care initiatorul topicului il avea pentru programul lui. In rest sunt de acord ca daca faci drivere/SO/samd nu se pot folosi tehnologiile GC. Asta pana sa se definitiveze si sa intre pe piata Arm Processor si Windows RT de la Microsoft cu care ma joc acuma si care imi plac destul de mult, desi ei sunt ca sunt gata dar eu cred ca sunt abia la inceput. E ceva ce a incercat Java acum multi ani cu arhitecturile de sistem Solaris, adica s-a scris Java on-top-ul Sistemului de Operare, ceea ce a si reusit pentru o vreme aparand multe deviceuri cu suport Java pe ele.

 

Si deci cum spuneam scopul topicului era sa faca omul programul sa mearga. Eu m-am bagat numai asa in seama sa-i recomand pe viitor o alta abordare. Un program ca asta de-l vrea omul cu tot cu interfata grafica si cu ce vrea el se face in C# in 10 minute maximum. El a pierdut niste vreme si a mai si postat aicea intrebari despre ceva care nu-i mergea. Nu am avut rabdare sa stau sa calculez alocarile de variabile pe acolo, dar se pare ca a existat deja cineva care a facut-o si omul a zis ca e ok.

 

Ideea pe care o sustin in continuare ar fi: avem un timp alocat sa facem un soft. Ce facem cu el? E critica aplicatia, trebuie neaparat C/C++? Daca da, pierdem 90% din timp sa o facem sa mearga cum trebuie, si 10% din timp sa implementam functionalitatile ei necritice. Daca nu, pierdem 0% sa o facem sa mearga (adica nu alocam pointeri samd) si 100% sa implementam functionalitatile reale ale aplicatiei. Ambele variante sunt corecte, doar ca daca facem un SO al nostru in C# o luam razna. Tot la fel daca ne apucam sa facem o aplciatie simpla in C++, sau si mai rau daca ne apucam sa invatam in C++ sa programam, mai ales programare orientata pe obiecte. De ce? Pai pentru ca C++ nu e OO. NU E SI GATA.

Link to comment
Share on other sites

Mama... C, frate! Mai vechi decit roata...

Stiu ca e offtopic, dar ca idee, mai foloseste cineva C? Iti poti gasi de lucru in Romania ca programator in C?

Oh da, cunosc o gramada de proiecte Embedded care necesita good ol' C.

 

Parerea mea este ca a aborda limbaje gen C/C++ pentru un incepator ii permite sa vada ce e sub abstractizarea reprezentata de Java sau .NET. Sunt notiuni de luat acolo care sunt foarte bune de avut (ce este un pointer adeverat, si alocarea lor, de exemplu). La fel cu notiunile de OOP care sunt ignorate de cei care se bazeaza prea mult pe codul generat. Ieri am vazut in interview un baiat cu 2 ani de experienta in .NET cu ultimele framework-uri, incapabil sa-mi zica diferinta intre o interfata si o clasa abstracta.

 

Este evident ca castigam un timp fenomenal cu toate tool-urile disponibile acum, dar am impresia ca nivelul de programare pur a cazut in ultimii ani :( Eu am facut Java, am inceput cu C++, la un moment dat am avut impresia sa ma joc cu Lego-uri lipite de XML, si sa nu mai fac programare. Acum ma joc acasa cu C pe placi Arduino, e fun :D

Edited by Pierre
Link to comment
Share on other sites

  • 10 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

"This site uses cookies. By continuing to browse the site you are agreeing to our use of cookies.