|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
[C] Risoluzione esercizio semplice...
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} . Codice:
#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;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
come faccio a fare un ciclo for per ogni valore del vettore?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Uh? NON devi fare un ciclo per ogni valore, te ne basta uno solo in cui scorri tutto il vettore
Codice:
for (int i=0;i<max; i++)
{
vettore[i]= ...
}
__________________
Il sole è giallo |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
quindi devo fare:
Codice:
for (int i=0;i<462; i++)
{
vettore[i]=462
}
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
potresti postarmi il codice giusto, proprio non mi ci trovo...
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Aug 2000
Messaggi: 608
|
Quote:
Codice:
for (int i=0; i<dim; i++)
{
if (vettore[i]%2 == 0) vettore[i]=vettore[i]+1
else vettore[i]=vettore[i]-1
}
Fossi in te, però, per imparare meglio eviterei di farmi dare il codice "pronto" Scusate l'intrusione
__________________
Intel Core2Quad Q6600 2,4GHz @ 3,0 GHz 2 Gb RAM 667 MHz ATI HD2900XT |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
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 |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Semplicemente dichiara 'i' da qualche altra parte, dove hai dichiarato 'dim' ad esempio.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
allora, ho fatto:
Codice:
int i;
for ( i=0; i<dim; i++)
{
if (vettore[i]%2 == 0) vettore[i]=vettore[i]+1
else vettore[i]=vettore[i]-1
}
parse error before "else" |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Metti il ';' dopo le due assegnazioni.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
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? |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
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 |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- 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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
il primo pezzo ho fatto così:
Codice:
#include <stdio.h> #include <stdlib.h> int main() FILE *fopen(telefonate.txt, r); come faccio adesso a fare un ciclo per leggere una sola riga per volta con fgets()??? |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#include <stdio.h>
int main (void)
{
FILE *f;
f = fopen ("telefonate.txt", "r");
if (f != NULL)
{
/* ... il resto ... */
}
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
bene..
ma per leggere una riga per volta? io ho provato a fare così, ma ho canato... Codice:
while(1) {
res=fgets(buf, 200, fd);
if( res==NULL )
break;
printf("%s", buf);
}
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Io in genere sono solito fare: while (fgets (buf, sizeof (buf), f) != NULL) { ..... }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Jan 2004
Città: Verolavecchia
Messaggi: 198
|
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? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:32.




















