Salve, sono alle prese con la preparazione dell'esame di Informatica e ieri mi sono imbattuto in un esercizio sui file che mi sta dando problemi.
codice:
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define R 80
#define N 20
#define P 4
int main(int argc, char *argv[])
{
if(argc!=2) {
printf("ERROR");
return -1;
}
struct corso {
char materia[N];
char nome[N];
char cognome[N];
int periodo;
int crediti;
int superamento;
};
struct corso insegnamenti[R];
FILE *f;
int i = 0, j, k = 0;
int creditimax = 0;
int superamentomin[R];
int somcrediti = 0;
float mediasuperamenti = 0;
char riga[R];
char matcreditimax[R];
char matsupmin[P][R];
char insegnante[N];
for(j=0; j<R; j++) {
superamentomin[i] = 100;
}
f = fopen(argv[1], "r");
if(fopen(argv[1], "r")==NULL) {
printf("ERROR");
return -1;
}
while(fgets(riga, R, f)!=NULL) {
fscanf(f,"%s %s %s %d %d %d", insegnamenti[i].materia, insegnamenti[i].nome, insegnamenti[i].cognome, &insegnamenti[i].periodo, &insegnamenti[i].crediti, &insegnamenti[i].superamento);
if(insegnamenti[i].crediti>creditimax) {
creditimax = insegnamenti[i].crediti;
strcpy(matcreditimax, insegnamenti[i].materia);
i++;
}
}
for(j=0; j<i; j++) {
switch(insegnamenti[j].periodo) {
case 1:
if(insegnamenti[j].superamento<superamentomin[j]) {
superamentomin[j] = insegnamenti[j].superamento;
strcpy(matsupmin, insegnamenti[j].materia);
}
break;
case 2:
if(insegnamenti[j].superamento<superamentomin[j]) {
superamentomin[j] = insegnamenti[j].superamento;
strcpy(matsupmin, insegnamenti[j].materia);
}
break;
case 3:
if(insegnamenti[j].superamento<superamentomin[j]) {
superamentomin[j] = insegnamenti[j].superamento;
strcpy(matsupmin, insegnamenti[j].materia);
}
break;
case 4:
if(insegnamenti[j].superamento<superamentomin[j]) {
superamentomin[j] = insegnamenti[j].superamento;
strcpy(matsupmin, insegnamenti[j].materia);
}
break;
default:
break;
}
}
printf("La materia con piu' crediti associati e' %s con %d crediti.\n", matcreditimax, creditimax);
for(j=0; j<i; j++) {
printf("Periodo %d - Materia piu' difficile da superare: %s - Superamento esame %d %.\n", i, matsupmin[i], superamentomin[i]);
}
printf("Inserire cognome professore ricercato: ");
scanf("%s", insegnante);
for(j=0; j<i; j++) {
if(strcmp(insegnante, insegnamenti[i].cognome)==0) {
somcrediti = somcrediti + insegnamenti[i].crediti;
mediasuperamenti = mediasuperamenti + insegnamenti[i].superamento;
k++;
}
}
mediasuperamenti = (float) mediasuperamenti/k;
printf("L'insegnante ricercato segue corsi per un totale di %d crediti e con una media superamento di %f %.", somcrediti, mediasuperamenti);
fclose(f);
if(fclose(f)==NULL) {
printf("ERROR");
return -1;
}
return 0;
}
Al momento della compilazione mi da alcuni errori, tra cui
"c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.6. 1\..\..\..\..\include\string.h|45|note: expected 'char *' but argument is of type 'char (*)[80]'|"
e il warning
"C:\Users\dying_000\Desktop\Polito Informatica\Laboratorio\Settimana 11\Settimana11_Es1\main.c|76|warning: passing argument 1 of 'strcpy' from incompatible pointer type [enabled by default]|"
Tutto questo per i strcpy utilizzati nello switch. Sapresti spiegarmi a cosa può essere dovuto l'errore?