PDA

Visualizza la versione completa : [c] problema esecuzione programma


simone1988
05-02-2009, 11:11
ragazzi ho un problema
ho fatto questo esercizo e me lo compila
però quando lo invio dopo l'inserimento scelgo l'opzione nel case
e mi si apre una finestra di errore di windows
help me please!

#include <stdio.h>
#include <stdlib.h>

struct indirizzo {
char strada[20];
char CAP[5];
char civico[3]; };

struct data {
short giorno;
char mese[10];
char anno[4];};

typedef struct indirizzo ind;
typedef struct data Data;

struct studente {
char nome[10];
char cognome[15];
char matricola[10];
char luognasc[25];
ind indirizzo;
Data datanascita;
short presenze[20];
};

typedef struct studente stud;
stud student[30];
stud max_I(stud a, stud b);
int max_(int a,int b);
stud massimo_a_ricDI(stud a[],int n);
void stampa(stud *);
void inserimento(stud *);
void ricerca(stud *);


void stampa(stud *student)
{short i;
//stampa dei dati e presenze totali
printf("dati degli studenti");
for (i=0;i<3;i++)
{fflush(stdin);
printf("%s %s %s %s \n %s %s %s \n %d %s %s\n",student[i].cognome,student[i].nome,student[i].matricola,
student[i].luognasc,student[i].indirizzo.strada,student[i].indirizzo.civico,student[i].indirizzo.CAP,
student[i].datanascita.giorno,student[i].datanascita.mese,student[i].datanascita.anno);
printf(" presenze totali su 20 giorni %d \n",3-student[i].presenze[0]);
}
}

void ricerca(stud *student)
{short j;char nome[10],cognome[15];
//ricercadi uno studente dato nome e cognome
printf("inserisci cognome e nome dello studente da ricercare");
scanf("%s" "%s",&cognome,&nome);
while ((student[j].cognome!=cognome || student[j].nome!=nome)&&(j<3))//controollare la condizione
{j=j+1;}
//if cognome e nome trovati
printf("%s %s %s %s \n %s %s %s \n %d %s %s\n",student[j].cognome,student[j].nome,student[j].matricola,
student[j].luognasc,student[j].indirizzo.strada,student[j].indirizzo.civico,student[j].indirizzo.CAP,
student[j].datanascita.giorno,student[j].datanascita.mese,student[j].datanascita.anno);
printf(" assenze 20 giorni %d \n",student[j].presenze[0]);
}



stud max_I(stud a, stud b) {

if (a.presenze[0] > b.presenze[0])
return a;
else
return b;
}


stud massimo_a_ricDI(stud a[],int n)
{
int mediano;
/* soluzione del caso base */
if(n == 1)
return a[0];
else
{
/* autoattivazioni */
mediano = (n-1)/2;
return max_I(massimo_a_ricDI(a,mediano+1),massimo_a_ricDI (a+mediano+1,n-mediano-1));
}
}



void inserimento(stud *student)
{short i,j,h;
for (i=0;i<2;i++)
{fflush(stdin);
printf("inserisci nome studente n %d\n ",i+1);
scanf("%s",&student[i].nome);fflush(stdin);
printf("inserisci cognome studente %s\n ",student[i].nome);
scanf ("%s",&student[i].cognome);fflush(stdin);
/*printf("inserisci matricola studente %s\n ",student[i].cognome);
scanf("%s",&student[i].matricola);fflush(stdin);
printf("inserisci luogo di nascita studente %s\n ",student[i].cognome);
scanf("%s",&student[i].luognasc);fflush(stdin);
printf("inserisci indirizzo(strada,civico,CAP) lasciando uno spazio, studente %s\n",student[i].cognome);
scanf("%s" "%s" "%s",&student[i].indirizzo.strada,&student[i].indirizzo.civico,&student[i].indirizzo.CAP);
printf("inserisci data nascita (gg mese(parola) anno) lasciando uno spazio, studente %s\n",student [i].cognome);
scanf("%d" "%s" "%s",&student[i].datanascita.giorno,&student[i].datanascita.mese,&student[i].datanascita.anno);
//finora carichiamo i dati degli studenti*/
}
for (h=1;h<3;h++)
{student[h].presenze[0]=0;
for (j=0;j<2;j++)
{fflush(stdin);
printf("lo studente %s %s e \npresente nel %d giorno\n",student[j].cognome,student[j].nome,h);
printf("\nimmettere 0 per presente e 1 per assente\n");
do{
fflush(stdin);printf("ripeti ");
scanf("%d",&student[j].presenze[h]);
}while ((student[j].presenze[h]!=0) && (student[j].presenze[h]!=1));
student[j].presenze[0]=student[j].presenze[0]+student[j].presenze[h];//conta il numero di assenze
}
}

}

void main()
{short i=0,j=3;stud h;
inserimento(student);
printf("premi 1 per Stampare i dati e le presenze totali di tutti gli studenti\n");
printf("premi 2 per Dato un nome e un cognome stampare i dati e le assenze totali dello studente\n");
printf("premi 3 per Stampare il nome e il cognome dello studente che ha fatto più assenze\n");
scanf("%d",i);
switch(i){
case 1:
stampa(student);break;
case 2:
ricerca(student);break;
case 3:
h=massimo_a_ricDI(student,j);
default:
printf("errore");break;
}
}

king64
05-02-2009, 11:32
Che errore ti da ? Dovresti specificare il compilatore usato e il tipo di errore, in quanto si è capito che compili in ambiente Windows :) . Saluti :ciauz:

oregon
05-02-2009, 11:42
scanf("%d", &i);

simone1988
05-02-2009, 11:45
e ho provato a fare molte modifiche quindi ci stanno alcuni errori nel codice
allora uso il visual c del pacchetto visual studio 6
l'errore non dipende dal c ma proprio da windows in pratica esce la finestra di termina programma con le opzioni debug,invia segnalazione non inviare segnalazione, come se l'errore fosse del programma che uso

simone1988
05-02-2009, 11:54
Originariamente inviato da oregon
scanf("%d", &i);

si risolto cmq mi potete dare una mano con una funzione?
si tratta ddi



stud max_I(stud a, stud b) {

if (a.presenze[0] > b.presenze[0])
return a;
else
return b;
}


stud massimo_a_ricDI(stud a[],int n)
{
int mediano;
/* soluzione del caso base */
if(n == 1)
return a[0];
else
{
/* autoattivazioni */
mediano = (n-1)/2;
return max_I(massimo_a_ricDI(a,mediano+1),massimo_a_ricDI (a+mediano+1,n-mediano-1));
}
}


in pratica devo fare un confronto tra gli array della struct del campo .presenze[0]
devo vedere qualè il piu grande come valore (short) e devo usare un algoritmo ricorsivo come sopra citato,ora mi servirebbe solo l'indice dell'array di quello piu grande ma sono un po confuso

YuYevon
05-02-2009, 14:05
Ciao simo' (ci si rivede anche qui) :)

sei sicuro che la traccia richieda proprio l'indice dello studente col massimo valore di presenze[0] ? A me sembra un po' difficile da realizzarsi come cosa, leggendo il codice.

Al massimo, potresti far restituire alla funzione la struttura e poi cercare quest'ultima all'interno dell'array (confrontando dei campi chiave che identifichino univocamente la struttura, sperando che ce ne siano) per poi memorizzare l'indice dell'elemento che corrisponde...

Oppure semplicemente c'è da cambiare qualcosa a monte...

simone1988
05-02-2009, 14:26
devo stampare tutti i dati di quello che ha il valore massimo nel campo student.presenza[0]

YuYevon
05-02-2009, 17:22
Ma quindi non ti chiede esplicitamente di determinare l'indice... o sbaglio?

Loading