Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] programma con strutture

    ciao a tutti,
    sono nuovo del forum...
    avrei bisogno di aiuto su questo programma in C:

    codice:
    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define N 5
    typedef struct {
    	int Matricola;
    	char Nome [20];
    	int Anno;}Studente;
    typedef struct {
    	char Provincia[20];
    	int CodInsegnmento;
    	int voto;}Esame;
    main()
    {
    	int I,somma=0;float media;
    	FILE *fp1;
    	FILE *fp2;
    	Studente dati1;
    	Esame dati2;
    	fp1=fopen("studenti.dat", "wb");
    	if(fp1==NULL){fprintf(stderr, "errore di apertura");exit(1);}
    	printf("Acquisizione struttura Studente\n\n");
    	for(I=0;I<N;I++)
    	{
    		printf("Matricola:  ");scanf("%d",&dati1.Matricola);
    		printf("Nome studente:  ");scanf("%s", dati1.Nome);
    		printf("Anno corso:  ");scanf("%d", &dati1.Anno);
    		fwrite(&dati1, sizeof(dati1), 1, fp1);}
    	fclose(fp1);
    	fp2=fopen("Esami.dat", "wb");
    	if(fp2==NULL){fprintf(stderr, "Errore di apertura");exit(1);}
    	printf("Acquisizione struttura Esame\n\n");
    	for(I=0;I<N;I++)
    	{
    		printf("Provincia:  ");scanf("%s",dati2.Provincia);
    		printf("Codice insegnamento:  ");scanf("%d", &dati2.CodInsegnmento);
    		printf("Voto:  ");scanf("%d", &dati2.voto);
    				fwrite(&dati2, sizeof(dati2), 1, fp2);}
    	fclose(fp2);
    	fp2=fopen("esami.dat", "rb");
    	if(fp2==NULL) {fprintf(stderr, "Errore di apertura");exit(1);}
    	while(fread(&dati2, sizeof(dati2), 1, fp2)!=0)
    	{printf("Nome %s\n",dati1.Nome);}
    	fclose(fp2);
    }
    leggendo i dati dai file si vuole mostrare:
    -l'elenco degli studenti la cui media dei voti è superiore a 27
    -l'elenco delle province da cui provengono almeno 3 studenti la cui media è superiore a 27

    qualcuno sa dirmi come impostarlo per ottenere i risultati elencati?

    grazie

    saluti

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Prendi anche visione del Regolamento interno, ci sono diverse cose da sapere prima di aprire una discussione.

    1) Il linguaggio obbligatorio nel titolo
    2) Un titolo che faccia capire il contenuto della discussione
    3) Il posting del codice usando gli appositi tag CODE.
    4) Informazioni precise sugli errori ottenuti o su quali sono i dubbi

    Se intendi trovare qualcuno che scriva il codice al posto tuo, c'è il forum "Offro Lavoro / Collaborazione".

    Correggo la discussione ove possibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    grazie LeleFT...

    scusa per post affrettato...

    saluti

  4. #4
    Qual è la relazione tra la struttura Studente e Esame?
    Da quello che hai scritto, l'unico legame che posso supporre è che il primo esame è relativo al primo studente. E' corretto?
    Ma così facendo, se uno studente sostiene più di un esame, i suoi dati di anagrafica saranno duplicati, con conseguente spreco di memoria.
    La soluzione migliore è di inserire nella struttura Esame un riferimento allo studente, ad esempio la matricola, che ha sostenuto la prova.

  5. #5
    Originariamente inviato da google01
    Qual è la relazione tra la struttura Studente e Esame?
    Da quello che hai scritto, l'unico legame che posso supporre è che il primo esame è relativo al primo studente. E' corretto?
    Ma così facendo, se uno studente sostiene più di un esame, i suoi dati di anagrafica saranno duplicati, con conseguente spreco di memoria.
    La soluzione migliore è di inserire nella struttura Esame un riferimento allo studente, ad esempio la matricola, che ha sostenuto la prova.
    forse hai ragione tu non ho messo nessun collegamento tra le due strutture...
    il testo originale riporta "matricola" in entrambe le strutture...ho scordato di usarlo!
    provo ad aggiungere matricola nelle due strutture e poi mi ricavo la media dei voti...
    appena posso aggiorno il tread....

    grazie del suggerimento

    saluti

  6. #6
    codice:
    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define NUM_STUDENTI 2
    #define NUM_VOTI 4
    typedef struct {
    	int Matricola;
    	char Nome [20];
    	int Anno;}Studente;
    typedef struct {
    	int Matricola;
    	char Provincia[20];
    	int CodInsegnmento;
    	int voto[NUM_VOTI];}Esame;
    main()
    {
    	int I,J,somma=0;float media;
    	FILE *fp1;
    	FILE *fp2;
    	Studente dati1;
    	Esame dati2;
    	fp1=fopen("studenti.dat", "wb");
    	if(fp1==NULL){fprintf(stderr, "errore di apertura");exit(1);}
    	printf("Acquisizione struttura Studente\n\n");
    	for(I=0;I<NUM_STUDENTI;I++)
    	{
    		printf("Matricola:  ");scanf("%d",&dati1.Matricola);
    		printf("Nome studente:  ");scanf("%s", dati1.Nome);
    		printf("Anno corso:  ");scanf("%d", &dati1.Anno);
    		fwrite(&dati1, sizeof(dati1), 1, fp1);}
    	fclose(fp1);
    	fp2=fopen("Esami.dat", "wb");
    	if(fp2==NULL){fprintf(stderr, "Errore di apertura");exit(1);}
    	printf("Acquisizione struttura Esame\n\n");
    	for(J=0;J<NUM_STUDENTI;J++)
    	{
    		printf("Matricola:  ");scanf("%d",&dati2.Matricola);
    		printf("Provincia:  ");scanf("%s",dati2.Provincia);
    		printf("Codice insegnamento:  ");scanf("%d", &dati2.CodInsegnmento);
    		for(I=0;I<NUM_VOTI;I++){
    			printf("Voti studente:  ");scanf("%d", &dati2.voto);
    			somma=somma+dati2.voto;}
    		media=somma/NUM_VOTI;
    		fwrite(&dati2, sizeof(dati2), 1, fp2);}
    	fclose(fp2);
    	fp1=fopen("studenti.dat", "rb");
    	if(fp1==NULL){fprintf(stderr, "Errore di apertura");exit(1);}
    	while(fread(&dati1, sizeof(dati1),1,fp1)!=0)
    		if(strcmp(dati1.Matricola, dati2.Matricola)==0)
    		{printf("Media= %f",media);}
    	fclose(fp1);
    	fp2=fopen("esami.dat", "rb");
    	if(fp2==NULL) {fprintf(stderr, "Errore di apertura");exit(1);}
    	while(fread(&dati2, sizeof(dati2), 1, fp2)!=0)
    	{printf("Nome %s  media %f\n",dati1.Nome,media);}
    	fclose(fp2);
    }
    ho provato a modificare il codice in questo modo...
    sono sempre bloccato...EXC_BAD_ACCESS l'errore riscontrato!
    qualche suggerimento per ottenere l'elenco degli studenti con media sup a 27?

    saluti

  7. #7
    codice:
    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define NUM_STUDENTI 5
    #define NUM_VOTI 4
    typedef struct {
    	int Matricola;
    	char Nome [20];
    	int Anno;}Studente;
    typedef struct {
    	int Matricola;
    	char Provincia[20];
    	int CodInsegnmento;
    	int voto;}Esame;
    int main()
    {
    	int I,J;
    	float media,somma=0;
    	FILE *fp1;
    	FILE *fp2;
    	Studente dati1;
    	Esame dati2;
    	fp1=fopen("studenti.dat", "wb");
    	if(fp1==NULL){fprintf(stderr, "errore di apertura");exit(1);}
    	printf("Acquisizione struttura Studente\n\n");
    	for(I=0;I<NUM_STUDENTI;I++)
    	{
    		printf("Matricola:  ");scanf("%d",&dati1.Matricola);
    		printf("Nome studente:  ");scanf("%s", dati1.Nome);
    		printf("Anno corso:  ");scanf("%d", &dati1.Anno);
    		fwrite(&dati1, sizeof(dati1), 1, fp1);}
    	fclose(fp1);
    	fp2=fopen("Esami.dat", "wb");
    	if(fp2==NULL){fprintf(stderr, "Errore di apertura");exit(1);}
    	printf("Acquisizione struttura Esame\n\n");
    	for(J=0;J<NUM_STUDENTI;J++)
    	{
    		printf("Matricola:  ");scanf("%d",&dati2.Matricola);
    		printf("Provincia:  ");scanf("%s",dati2.Provincia);
    		printf("Codice insegnamento:  ");scanf("%d", &dati2.CodInsegnmento);
    		for(I=0;I<NUM_VOTI;I++){
    			printf("Voti studente:  ");scanf("%d", &dati2.voto);
    			somma=somma+dati2.voto;}
    		media=somma/NUM_VOTI;
    		fwrite(&dati2, sizeof(dati2), 1, fp2);}
    	fclose(fp2);
    		fp1=fopen("studenti.dat", "rb");
    	if(fp1==NULL) {fprintf(stderr, "Errore di apertura");exit(1);}
    	while(fread(&dati1, sizeof(dati1), 1, fp1)!=0)
    		if(media>=27)
        {printf("Studente con media superiore a 27\n\n %s con media %.2f\n\n",dati1.Nome,media);}
    		else {printf("Nessun Studente\n\n");}
    	fclose(fp1);
    	fp2=fopen("esami.dat", "rb");
    	if(fp2==NULL) {fprintf(stderr,"Errore di apertura");exit(1);}
    	while(fread(&dati2, sizeof(dati2),1,fp2)!=0)
    		if(media>=27)
    		{printf("Province con media superiore a 27: \n\n%s con media %.2f\n\n",dati2.Provincia,media);}
    		else {printf("Nessuna Provincia");}
    	fclose(fp2);
    }
    ok mi sono ricavato la media degli esami...
    così modificato il codice mi restituisce la media globale di tutti gli studenti elencati...
    se volessi la media individuale per ogni studente come posso impostarlo?
    c'è qualcuno che mi sappia aiutare?

    grazie

    saluti

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Come detto poco sopra, il codice va postato usando gli sppositi tag CODE.
    Nel regolamento interno (sempre linkato sopra), al punto 6 c'è anche un esempio di come fare.

    In futuro, usali.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    nessuno che riesce ad aiutarmi?

    saluti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.