PROBLEMA Programma in C

Kryspirit

Nuovo Utente
39
0
Buona sera, per esercizio scolastico devo creare un programma che, Legge da un file un nome e un numero e me li scrive in un altro file, se trova due nomi uguali deve sommare il numero del nome che c'è già con quello che trova. Sono quasi alla fine ma non riesco proprio a passare il vettore di strutture alla funzione, ho provato in tutti i modi ma non ne vuole sapere.
Pensavo di passargli il vettore di strutture con un & davanti e quindi nella funzione * come faccio sempre quando devo passare un dato che mi deve modificare.. Vi posto il file sorgente sperando capiate il mio ragionamento.. Scusate ma sono ancora alle prime armi :/.. Potreste dirmi cosa c'è che non va :/?



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define dmax 50
#define dname 20


typedef struct Locca {
char nome[dname];
int valore;
}nv_t;




void presente(char nometemp[dname], int valoretemp, nv_t *vettore[dmax],int *index){
int i;
for(i=0;i<=dmax;i++){
if (0 == strcmp(nometemp,vettore.nome)){
vettore.valore=valoretemp;
break;
}
if(i==index){
strcpy(vettore.nome,nometemp);
vettore.valore = valoretemp;
index++;
break;
}

}

}




int main(int argc, char *argv[])
{


FILE *data;
data = fopen("file.txt","r");
nv_t vettore[dmax];
int i = 0;
char nometemp[dname];
int valoretemp;
int index=0;


// inizializzo il vettore dove metterò quello che tiro su dal file
for(i=0;i<=dmax;i++){
strcpy(vettore.nome,"0");
vettore.valore=0;
}



// se ho trovato il file prendo il nome e il valore e li passo alla function presente
if (data!=NULL){
while(1){
if(feof(data)) break;
fscanf(data,"%s %d",&nometemp,&valoretemp);
presente(nometemp,valoretemp,&vettore[dmax],&index);
i++;
}
}
else {printf("\nErrore, file non trovato \n" );} // se non trovo file do errore



// stampo il vettore finale

for(i=0;i<=dmax;i++){
printf("\n %s %d",vettore.nome,vettore.valore);

}

system("PAUSE");
return 0;
}
 

Pheonixs

Nuovo Utente
70
6
Ciao! Potrebbe essere d'aiuto linkare anche cosa segna come errore il compilatore (se lo segna). Detto questo, nella mia esperienza di programmazione in C non ho mai visto il "break" nell'"if", come mai lo usi? Inoltre, so che forse a livello scolastico non l'avrai ancora affrontato, ma ti consiglio di impararti bene l'uso dinamico della memoria, in questo caso sarebbe molto utile. Manca qualcosa alla fine di data = fopen (...). Non ho idea di come sia il testo dal quale devi copiare, da quello che hai scritto tu il testo dovrebbe essere es: "Marco 15Paolo 14Flavio 16", quindi magari puoi rivedere la lettura da file nello fscanf. L'uso di if(feof(data)) può dare dei problemi e risulta poco intuitivo se si presentano degli errori. Il mio consiglio è di usare questa dicitura

while(fscanf(data,"%s %d",&nometemp,&valoretemp))== 2)

tra l'altro, non ricordo bene, quando si interrompe il %s nel momento della lettura?
Il metodo che ti ho consigliato è ottimo poichè sai se il tuo programma legge effettivamente quello che vuoi tu e non cose a caso (come può capitare con il foef).

Perchè presente(nometemp,valoretemp,&vettore[dmax],&index); ci sono le & ?
NB: Alla fine fai una stampa a video e non una su file!!

Hai gia fatto le liste per caso? Sarebbe un pò più semplice con problemi di questo tipo.
 
  • Like
Reactions: Kryspirit

Kryspirit

Nuovo Utente
39
0
Allora: il compilatore, se passo per indirizzo un vettore di una struttura quando vado ad usare un dato di una struttura di quel vettore non me lo riconosce più come se non riuscisse a risalire al vettore di cui passo l'indirizzo. Questo problema l'ho risolto mettendo tutto nel main che ai me non è una bella cosa ma almeno funzionava perchè non sapevo cosa fare.
uso il break nell'if perchè per tirar su le stringhe dal file txt uso un loop infinito ( while(1) ) e quindi mi esce da li solo quando ho finito.
il programma adesso funziona correttamente anche se nel main c'è un po uno schifo.
Stavo appunto cercando di fare una "versione successiva del programma" utilizzando la memoria dinamica solo che ho riscontrato problemi perchè sembra impossibile usare la malloc su un vettore di strutture.. Aspetterò che il prof la spieghi visto che è in programma.
Il file da cui legge è fatto cosi :
Marco 12
Luigi 16
Flavio 24
Antonia 3

Posto ora il codice del programma (funzionante) in modo che magari potrà servire a qualcuno nella mia situazione, anche se senza l'utilizzo delle funzioni è un po un programma "rozzo".

- - - Updated - - -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
//#define dmax 50
#define dname 20


typedef struct Locca {
char nome[dname];
int valore;
}nv_t;


/*
void presente(char nometemp[dname], int valoretemp,nv_t vettore[dmax],int *index){

int i;
for(i=0;i<=dmax;i++){

if (0 == strcmp(nometemp,vettore.nome)){
vettore.valore=valoretemp;
//printf("\n Vettore %s %d\n\n\n",vettore.nome,vettore.valore);
break;
}
if(i==*index){
strcpy(vettore.nome,nometemp);
vettore.valore = valoretemp;
*index++;
//printf("\n index %s %d\n\n\n",vettore.nome,vettore.valore);
break;
}

}

for(i=0;i<=dmax;i++){
printf("\n %s %d",vettore.nome,vettore.valore);
}


}
*/


int main(int argc, char *argv[])
{

int dmax = 10;
FILE *data,*finale;
data = fopen("file.txt","r");
finale = fopen("finale.txt","w");
nv_t vettore[dmax];
int i = 0;
int g = 0;
char nometemp[dname];
int valoretemp;
int index=0;


// inizializzo il vettore dove metterò quello che tiro su dal file
for(i=0;i<=dmax;i++){
strcpy(vettore.nome,"0");
vettore.valore=0;
}

// se ho trovato il file prendo il nome e il valore e li passo alla function presente
if (data!=NULL){
while(1){
if (g==dmax) dmax+=50; // una specie di realloc
if(feof(data)) break;
strcpy(nometemp,"");
valoretemp = 0;
fscanf(data,"%s %d",&nometemp,&valoretemp);
if((0 == strcmp(nometemp,"")) || (0 == strcmp(nometemp,"\n")) ||
(0 == strcmp(nometemp,"\f")) || (0 == strcmp(nometemp,"\t")) ||
(0 == strcmp(nometemp,"\v")) || (0 == strcmp(nometemp," "))) break;


/////////////////////////////////////////////////////
//presente(nometemp,valoretemp,&vettore[dmax],&index); Se utilizzo la funzione presente
// però non funziona il passaggio di
// parametro per indirizzo

for(i=0;i<=dmax;i++){


if (0 == strcmp(nometemp,vettore.nome)){
vettore.valore+=valoretemp;
break; break;
}
if(i==index){
strcpy(vettore.nome,nometemp);
vettore.valore = valoretemp;
index++;
break; break;
}

}

/////////////////////////////////////////////////////////
g++;
}//fine while
}//fine if
else {printf("\nErrore, file non trovato \n" );} // se non trovo file do errore



// stampo il vettore

for(i=0;i<index;i++){
printf("%s %d\n",vettore.nome,vettore.valore);
fprintf(finale,"%s %d\n",vettore.nome,vettore.valore);
}
fclose(data);
fclose(finale);

system("PAUSE");
return 0;
}




IL PROGRAMMA legge da un file "file.txt" delle stringhe e dei numeri, le stampa su un altro file e se trova due stringhe uguali ne somma i rispettivi valori, il file di output si chiama "finale.txt".
 

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 14 15.9%
  • Gearbox

    Voti: 1 1.1%
  • Xbox & Bethesda

    Voti: 63 71.6%
  • Square Enix

    Voti: 3 3.4%
  • Capcom

    Voti: 5 5.7%
  • Nintendo

    Voti: 13 14.8%
  • Altro (Specificare)

    Voti: 7 8.0%

Discussioni Simili