PDA

Visualizza la versione completa : [C] Chiusura del programma inaspettata


21Edoardo96
01-10-2012, 16:21
Ciao,
ho scritto un programma che conoscendo già i 10 nomi degli studenti e inserendo un voto a ciascuno dica quale sia il miglior studente.
Però quando lo eseguo trovo 2 problemi:
1)Dopo che inserisco il voto dell'ultimo studente e premo invio il programma si ferma e mi appare queta scritta: "Si è verificato un errore in Miglior voto alunni.exe. L'applicazione verrà chiusa." :confused:
2)Quando lo compilo il compilatore mi dice "Warning assignment makes integer from pointer
without a cast" riferito alle righe dove vi è scritto
mnome=nome[i]; e questa è la prima volta che i appare questa scritta.
Qualcuno potrebbe aiutarmi spiegandomi dove ho sbagliato?


//Miglior voto delgi alunni conoscendo il nome e cognome
#include<stdio.h>
int main()
{
float voti , votimax;
const char *nome[] = {"Paolo", "Luca", "Giacomo", "Rita", "Mario", "Germano", "Emanuele", "Alessio", "Matteo", "Clara"};
char mnome; //Corrisponde al nome dello studente migliore
int i;
for(i=0;i<10;i++)
{
printf("\nInsersci il %d %c voto corrisondente alla studente %s: ", i+1, 167, nome[i]);
scanf("%f", &voti);
if(i==0)
{
votimax=voti;
mnome=nome[i];
}
else
{
if(voti>votimax)
{
votimax=voti;
mnome=nome[i];
}
}
}
printf("\nIl voto massimo e\' di %f ed e\' stato fatto dallo studente di nome %s", votimax, mnome);
system ("pause");
return 0;
}

21Edoardo96
01-10-2012, 16:23
Ciao,
ho scritto un programma che conoscendo già i 10 nomi degli studenti e inserendo un voto a ciascuno dica quale sia il miglior studente.
Però quando lo eseguo trovo 2 problemi:
1)Dopo che inserisco il voto dell'ultimo studente e premo invio il programma si ferma e mi appare queta scritta: "Si è verificato un errore in Miglior voto alunni.exe. L'applicazione verrà chiusa." :confused:
2)Quando lo compilo il compilatore mi dice "Warning assignment makes integer from pointer
without a cast" riferito alle righe dove vi è scritto codice:

mnome=nome[i]; e questa è la prima volta che i appare questa scritta. :confused:
Qualcuno potrebbe aiutarmi spiegandomi dove ho sbagliato?


//Miglior voto delgi alunni conoscendo il nome e cognome
#include<stdio.h>
int main()
{
float voti , votimax;
const char *nome[] = {"Paolo", "Luca", "Giacomo", "Rita", "Mario", "Germano", "Emanuele", "Alessio", "Matteo", "Clara"};
char mnome; //Corrisponde al nome dello studente migliore
int i;
for(i=0;i<10;i++)
{
printf("\nInsersci il %d %c voto corrisondente alla studente %s: ", i+1, 167, nome[i]);
scanf("%f", &voti);
if(i==0)
{
votimax=voti;
mnome=nome[i];
}
else
{
if(voti>votimax)
{
votimax=voti;
mnome=nome[i];
}
}
}
printf("\nIl voto massimo e' di %f ed e' stato fatto dallo studente di nome %s", votimax, mnome);
system ("pause");
return 0;
}

oregon
01-10-2012, 16:25
char mnome

è un semplice char e non un array di char, come dovrebbe essere in C (è ovvio che alla fine hai quell'errore)

E la copia non avviene con un = ma con la funzione strcpy


Rivedi il capitolo sulle stringhe (array di char) perché hai delle lacune ...

21Edoardo96
01-10-2012, 17:08
Ciao,
ho provato ad usare lo strcpy ma essendo la priva volta ne faccio uso non sapevo bene come gestirlo (anche avendo letto qualche pagina su internet), quindi ho proprio paura di aver fatto molti erori grossolani anche sugli arrey, in quanto è da poco che li sto utilizzando e sto trovando delle difficoltà.
Potreste gentilmente darmi delle dritte su come sistemare il codice?
Ciao e grazie in anticipo.


//Miglior voto delgi alunni conoscendo il nome e cognome
#include<stdio.h>
#include <string.h> //Serve per far funzionare lo strcpy
int main()
{
float voti , votimax;
const char *nome[] = {"Paolo", "Luca", "Giacomo", "Rita", "Mario", "Germano", "Emanuele", "Alessio", "Matteo", "Clara"};
const char *mnome [] ; //mnome corrisponde al nome dello studente migliore
int i;
for(i=0;i<10;i++)
{
printf("\nInsersci il %d %c voto corrisondente alla studente %s: ", i+1, 167, nome[i]); //Il numero 167 corrisponde (in codice ascii) al pallino ° che si mette per indicare l'ordine
scanf("%f", &voti);
if(i==0)
{
votimax=voti;
strcpy(mnome, nome);
}
else
{
if(voti>votimax)
{
votimax=voti;
strcpy(mnome, nome);
}
}
}
printf("\nIl voto massimo e\' di %f ed e\' stato fatto dallo studente di nome %s", votimax, mnome);
system ("pause");
return 0;
}

P.S. I commenti a lato servono solo a me per capire meglio

oregon
01-10-2012, 17:11
Un array di char è questo

char mnome[30];

ed è fatto da 30 caratteri compreso il terminatore

Invece

char *nome[]

è un array di puntatori e nella strcpy va usato individuando il puntatore all'elemento da copiare

strcpy(mnome, nome[i]);

21Edoardo96
01-10-2012, 17:29
Ciao,
ho cercato di sistemarlo, però quando lo faccio comipilare, il compilatore mi dice che la strcpy contiene delle incompatibilità tra tipi, quindi mi viene da pensare che nome e mnome debbano essere entrambi o char o const char però non so se sia giusto.


//Miglior voto delgi alunni conoscendo il nome e cognome
#include<stdio.h>
#include <string.h> //Serve per far funzionare lo strcpy
int main()
{
float voti , votimax;
const char *nome[] = {"Paolo", "Luca", "Giacomo", "Rita", "Mario", "Germano", "Emanuele", "Alessio", "Matteo", "Clara"}; //E' è un array di puntatori
char *mnome [30] ; //mnome corrisponde al nome dello studente migliore
int i;
for(i=0;i<10;i++)
{
printf("\nInsersci il %d %c voto corrisondente alla studente %s: ", i+1, 167, nome[i]); //Il numero 167 corrisponde (in codice ascii) al pallino ° che si mette per indicare l'ordine
scanf("%f", &voti);
if(i==0)
{
votimax=voti;
strcpy(mnome, nome[i]);
}
else
{
if(voti>votimax)
{
votimax=voti;
strcpy(mnome, nome[i]);
}
}
}
printf("\nIl voto massimo e\' di %f ed e\' stato fatto dallo studente di nome %s", votimax, mnome);
system ("pause");
return 0;
}

oregon
01-10-2012, 17:31
Ma scusa ... fai un po' di attenzione ... mi pare di averti scritto che devi usare

char mnome [30] ;

e ti ho detto anche il perché è differente da

char *mnome [30] ;

21Edoardo96
01-10-2012, 17:48
Ciao,
grazie mille per i vostri aiuti.
Ecco il codice finito


//Miglior voto delgi alunni conoscendo il nome e cognome
#include<stdio.h>
#include <string.h> //Serve per far funzionare lo strcpy
int main()
{
float voti , votimax;
const char *nome[] = {"Paolo", "Luca", "Giacomo", "Rita", "Mario", "Germano", "Emanuele", "Alessio", "Matteo", "Clara"}; //E' è un array di puntatori
char mnome [30] ; //mnome corrisponde al nome dello studente migliore
int i;
for(i=0;i<10;i++)
{
printf("\nInsersci il %d %c voto corrisondente alla studente %s: ", i+1, 167, nome[i]); //Il numero 167 corrisponde (in codice ascii) al pallino ° che si mette per indicare l'ordine
scanf("%f", &voti);
if(i==0)
{
votimax=voti;
strcpy(mnome, nome[i]);
}
else
{
if(voti>votimax)
{
votimax=voti;
strcpy(mnome, nome[i]);
}
}
}
printf("\nIl voto massimo e\' di %2.1f ed e\' stato fatto dallo studente di nome %s", votimax, mnome);
printf("\n");
system ("pause");
return 0;
}


P.S. Se trovate qualcosa che non va rettificatemi subito

Ciao :ciauz:

oregon
01-10-2012, 17:55
L'importante non è che il programma adesso funzioni ma che tu abbia capito cosa sbagliavi e che approfondisci gli argomenti su cui hai ancora forti dubbi.

21Edoardo96
01-10-2012, 18:01
Si,
grazie ai vostri aiuti sono riuscito a risolvere alcuni dei miei dubbi.
Ciao e grazie

Loading