PDA

View Full Version : [C] Risoluzione esercizio semplice...


enrico999
06-06-2007, 13:44
semplice per voi...

Data la traccia sotto riportata completare il codice in modo di aumentare di 1 tutti gli interi pari e diminuire di 1 tutti quelli dispari nell'array vettore[] di dimensione dim. Riportare come risultato il numero che comparira' a monitor. Per esempio un vettore che contiene gli elementi {4,56,3,78,23} dopo essere stato aggiornato deve contenere gli elementi {5,57,2,79,22} .



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


float CalcolaRisultato(int vettore[], int dim);

int main()
{

int vettore[]= {6,5,4,3,3,1,14,67,89,105,24,56,78, 9,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,
3,2,11,14,67,89,100,24,56,78, 9,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,
67,89,100,24,46,78, 9,
2,1,14,67,89,100,24,56,78, 9,
6,5,4,37,2,1,14,67,89,100,24,56,78,
9,6,5,4,5,2,1,14,67,89,100,24,56,78, 9,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,67,89,102,24,56,78, 9,
6,5,4,3,2,1,14,67,89,67,89,100,24,5,79,9,6,5,4,3,2,1,
104,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
6,5,4,3,2,1,14,68,89,100,24,56,79,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
6,5,4,3,12,1,14,67,89,100,24,56,78,9,6,5,4,3,
6,5,4,3,5,1,14,67,89,100,24,56,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,112,1,14,67,89,100,124,56,78, 9,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,
5,4,3,2,1,14,67,89,100,24,56,78, 9,
6,5,4,3,2,14,14,67,89,100,24,56,78,9,6,5,4,3,2,21,14,67,89,100,24,56,78, 9,
14,67,89,100,24,56,78, 9,6,5,4,3,2,1,14,
6,5,4,3,2,1,14,67,89,190,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
78,9,6,5,4,3,2,1,14,67,89,104,24,56,78, 9,
6,5,4,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,2,1,14,67,89,100,24,56,78, 9,
6,5,5,3,2,1,14,67,89,100,24,56,78,9,6,5,4,3,21,1,
14,67,89,100,24,56,78, 9,
6,5,4,3,2,1,14,67,99,100,24,56,78,9,6,5,4,0,2,1,14,67,89,110,24,56,78, 9
};

int dim =462; // il vettore contiene dim elementi !
float risultato;



// ----- inizio dell'esercizio -------

// Scrivi il codice che incrementa tutti gli interi pari e decrementa tutti quelli dispari
// nell'array vettore[]
// N.B. la soluzione corretta deve stare dentro l'array vettore[]


// ----- fine dell'esercizio -------


// NON TOCCARE TUTTE LE RIGHE QUI SOTTO
risultato = CalcolaRisultato(vettore, dim);
printf("\nrisultato da copiare ed incollare = %d \n\n" , (int) risultato );
getchar();
exit(0);
} // main

float CalcolaRisultato(int vettore[], int dim)
{
int i;
float divisore, dividendo=0;
for(i=0;i < dim; i++)
{
dividendo += i * vettore[i];
}
divisore = (dim +1)*dim/2;
return 100*dividendo/divisore;

}

andbin
06-06-2007, 14:03
Data la traccia sotto riportata completare il codice in modo di aumentare di 1 tutti gli interi pari e diminuire di 1 tutti quelli dispari nell'array vettore[] di dimensione dim.Fai un ciclo for in cui per ogni valore del vettore calcoli il resto della divisione per 2 (n%2), se il resto è 0 allora è pari, altrimenti è dispari. A quel punto incrementi o decrementi il valore.

enrico999
06-06-2007, 15:06
come faccio a fare un ciclo for per ogni valore del vettore?

yorkeiser
06-06-2007, 15:10
Uh? NON devi fare un ciclo per ogni valore, te ne basta uno solo in cui scorri tutto il vettore

for (int i=0;i<max; i++)
{
vettore[i]= ...
}

enrico999
06-06-2007, 16:22
quindi devo fare:


for (int i=0;i<462; i++)
{
vettore[i]=462
}


mmmmm mi sa che ho sbagliato....

andbin
06-06-2007, 16:27
for (int i=0;i<462; i++)
{
vettore[i]=462
}


mmmmm mi sa che ho sbagliato....La variabile 'dim' ce l'hai, quindi non vedo perché devi usare una costante.
Comunque dentro questo ciclo for devi semplicemente calcolare il resto della divisione tra un valore e 2. Questo lo ottieni con l'operatore %. Stabilito se è pari o dispari, incrementi o decrementi il valore.

enrico999
06-06-2007, 16:53
potresti postarmi il codice giusto, proprio non mi ci trovo...

uomoserio
06-06-2007, 19:43
potresti postarmi il codice giusto, proprio non mi ci trovo...

for (int i=0; i<dim; i++)
{
if (vettore[i]%2 == 0) vettore[i]=vettore[i]+1
else vettore[i]=vettore[i]-1
}

Ovviamente l'incremento e il decremento del valore del vettore li ho scritti per esteso solo per farti capire meglio.
Fossi in te, però, per imparare meglio eviterei di farmi dare il codice "pronto" ;)

Scusate l'intrusione :)

enrico999
07-06-2007, 10:49
mi da errore già alla prima riga:

for (int i=0; i<dim; i++)

e mi dice:

'for' loop initial declaration used outside C99 mode

andbin
07-06-2007, 11:15
mi da errore già alla prima riga:

for (int i=0; i<dim; i++)

e mi dice:

'for' loop initial declaration used outside C99 modeSe stai compilando in modalità "ANSI C" non si possono fare dichiarazioni di variabili nel for (lo si può fare appunto nel C99 o in C++).

Semplicemente dichiara 'i' da qualche altra parte, dove hai dichiarato 'dim' ad esempio.

enrico999
07-06-2007, 11:23
allora, ho fatto:



int i;
for ( i=0; i<dim; i++)
{
if (vettore[i]%2 == 0) vettore[i]=vettore[i]+1
else vettore[i]=vettore[i]-1
}



però mi da errore nell'ultima riga, mi dice:

parse error before "else"

andbin
07-06-2007, 11:45
parse error before "else"Metti il ';' dopo le due assegnazioni.

enrico999
07-06-2007, 11:54
GRAZIE GRAZIE!


Lo so che secondo voi capire come si fa un esercizio partendo dalla soluzione non va bene... ma ognuno ha i suoi metodi...

CIAO e GRAZIE ANCORA!


Avrei anche un altro esercizio... che dite, lo posto?

enrico999
07-06-2007, 11:56
Ma si dai, io lo posto, se qualcuno ha voglia di aiutarmi...

L'esercizio è questo:

* salva il testo sotto riportato nel file telefonate.txt ;
* scrivi il programma Contatelefonate.c che accede al file telefonate.txt e calcola il numero di telefonate effettuate a un cellulare e il numero di quelle effettuate verso un numero fisso;
* calcola come risultato il maggiore tra questi due numeri.

Per stabilire se il telefono e' un cellulare o un fisso si consiglia di utilizzale la funzione strcmp(s1,s2) che restituisce 0 se le due stringhe sono uguali, un numero negativo se s1 e' minore di s2 in ordine lessicografico e un numero positivo altrimenti. Nota bene: il file telefonate.txt e' composto da stringa tabulatore numeroconvirgola tabulatore stringa tabulatore stringa FINERIGA

---- testo da incollare nel file telefonate.txt -----
0234023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
0554023402 02.23 firenze 3minuti
06334023402 12.22 roma 4minuti
333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
024334023402 12.12 milano 4minuti
333402340 0.23 cellul 4minuti
02354023402 02.23 milano 3minuti
06334023402 12.22 roma 4minuti
3337402340 0.23 cellul 4minuti
0234023402 02.73 milano 3minuti
06334023402 12.22 roma 4minuti
0554023403 02.23 firenze 3minuti
3833402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
3333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minut
0554023403 02.23 firenze 3minuti
02334023402 12.22 milano 4minuti
3363402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
02534023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
0554023402 02.23 firenze 3minuti
06334023402 12.22 roma 4minuti
333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
024334023402 12.12 milano 4minuti
333402340 0.23 cellul 4minuti
333402340 0.23 cellul 4minuti
333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
023344023402 12.22 milano 4minuti
333402340 0.43 cellul 4minuti
0234023402 02.23 milano 3minuti
055334023402 12.22 firenze 4minuti
34333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
02324023402 02.23 milano 3minuti
05533402340 12.22 firenze 4minuti
3333402340 0.23 cellul 4minuti
06364023402 02.23 roma 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
0234023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
02324023402 02.23 milano 3minuti
02334023402 12.22 milano 4minuti
333402340 0.23 cellul 4minuti
3337402340 0.23 cellul 4minuti
0234023402 02.73 milano 3minuti
02334023402 12.22 milano 4minuti
05533402340 12.22 firenze 4minuti
3833402340 0.23 cellul 4minuti
0634023402 02.23 roma 3minuti
02334023402 12.22 milano 4minuti
---------------------

CIAO

andbin
07-06-2007, 12:11
* salva il testo sotto riportato nel file telefonate.txt ;
* scrivi il programma Contatelefonate.c che accede al file telefonate.txt e calcola il numero di telefonate effettuate a un cellulare e il numero di quelle effettuate verso un numero fisso;
* calcola come risultato il maggiore tra questi due numeri.Bene:

- apri il file in lettura con fopen()
- fai un ciclo in cui leggi una singola riga per volta con fgets()
- controlli/conteggi quello che ti interessa
- Una volta terminato il ciclo chiudi il file con fclose()

Questo in sintesi è il da farsi.

Quello che non ho capito è se devi avere un totale di tutte le telefonate a fissi e cellulari (in questo caso sarebbe semplice, se inizia con '0' non è un cellulare). Oppure se devi conteggiare le telefonate per ogni singolo numero (più complicato). Ma credo sia il primo caso.

enrico999
07-06-2007, 13:31
il primo pezzo ho fatto così:



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



int main()


FILE *fopen(telefonate.txt, r);





va bene?

come faccio adesso a fare un ciclo per leggere una sola riga per volta con fgets()???

andbin
07-06-2007, 13:38
#include <stdio.h>
#include <stdlib.h>



int main()


FILE *fopen(telefonate.txt, r);





va bene?No.
#include <stdio.h>

int main (void)
{
FILE *f;

f = fopen ("telefonate.txt", "r");

if (f != NULL)
{
/* ... il resto ... */
}

return 0;
}

enrico999
07-06-2007, 14:12
bene..

ma per leggere una riga per volta?

io ho provato a fare così, ma ho canato...



while(1) {
res=fgets(buf, 200, fd);
if( res==NULL )
break;
printf("%s", buf);
}

andbin
07-06-2007, 14:30
while(1) {
res=fgets(buf, 200, fd);
if( res==NULL )
break;
printf("%s", buf);
}

Tecnicamente mi sembra corretto.

Io in genere sono solito fare:
while (fgets (buf, sizeof (buf), f) != NULL) { ..... }

enrico999
07-06-2007, 14:33
anche a me sembra corretto, ma mi da errore in questa riga:

res=fgets(buf, 200, fd);

mi da questo errore:

`res' undeclared (first use in this function)


potresti magari postare il codice come sei solito fare tu?

andbin
07-06-2007, 14:46
res=fgets(buf, 200, fd);

mi da questo errore:

`res' undeclared (first use in this function) Beh, 'res' devi dichiararlo! E deve essere di tipo char*

enrico999
07-06-2007, 14:52
devo dichiarare anche buf, che tipo deve essere?

andbin
07-06-2007, 14:55
devo dichiarare anche buf, che tipo deve essere?Un array di char, di dimensione tale da poter contenere senza problemi le righe.

char buf[50];

enrico999
07-06-2007, 15:04
fd invece? cos'è? devo dichiarare anche questo?

andbin
07-06-2007, 15:08
fd invece? cos'è? devo dichiarare anche questo?È il valore di ritorno della fopen, vedi il mio esempio sopra.

enrico999
07-06-2007, 15:15
ok, ho fatto, ma mi sono perso. cosa devo fare ora?

posto il codice che ho scritto fino a qui:



#include <stdio.h>

int main (void)
{
FILE *f;

f = fopen ("telefonate.txt", "r");

if (f != NULL)
{
char res;
char buf[50];
char fd[50];

while(1)
{
res=fgets(buf, 200, fd);
if( res==NULL )
break;
printf("%s", buf);
}

}

return 0;
}

andbin
07-06-2007, 15:28
No no.

Innanzitutto quel 'fd' NON serve. Lì ci va la 'f' che è il puntatore a FILE ritornato da fopen().

Poi comunque in genere è buona prassi dichiarare tutte le variabili all'inizio della funzione, non nei blocchi (salvo casi particolari).

Poi se il 'buf' è di 50 caratteri, non ne devi poter leggere di più! In genere come dimensione si specifica semplicemente sizeof(buf) e si è a posto.

Dopo il ciclo di lettura il file va chiuso con fclose().

enrico999
07-06-2007, 15:35
scusa, ma se mi posteresti il codice di come andrebbe svolto l'intero esercizio farei veramente molto meglio a capire...

okay
07-06-2007, 15:37
scusa, ma se mi posteresti il codice di come andrebbe svolto l'intero esercizio farei veramente molto meglio a capire...

;)

okay
07-06-2007, 15:39
potresti magari postare il codice come sei solito fare tu?

;) ;)

Stev-O
07-06-2007, 17:33
scusa, ma se mi posteresti il codice di come andrebbe svolto l'intero esercizio farei veramente molto meglio a capire...

e ricordati di controllare SEMPRE l'apertura degli stream...
è buona norma;)
per esempio:

if((f=fopen ("telefonate.txt", "r")) == NULL) {
puts("errore nell'apertura del file");
exit(-1);
}

andbin
07-06-2007, 18:00
exit(-1);Un codice di uscita di -1 dice ben poco .... anche perché dipende molto da come il S.O. tratta lo status code. Su Linux ad esempio lo status code è gestito su 8 bit unsigned. Quindi lo status code verrebbe visto dal sistema come 255.
Nulla di sbagliato ... sia chiaro ... basta solo non sparare numeri a caso nella exit. ;)

mapomapo
07-06-2007, 18:07
scusa, ma se mi posteresti il codice di come andrebbe svolto l'intero esercizio farei veramente molto meglio a capire...
solo per curiosità...ma di teoria del linguaggio C cosa conosci?

Vito

Stev-O
07-06-2007, 18:43
Un codice di uscita di -1 dice ben poco .... anche perché dipende molto da come il S.O. tratta lo status code. Su Linux ad esempio lo status code è gestito su 8 bit unsigned. Quindi lo status code verrebbe visto dal sistema come 255.
Nulla di sbagliato ... sia chiaro ... basta solo non sparare numeri a caso nella exit. ;)

vabbe ma è didattico...
basta che non metti 0...