Leggi il Topic


Indice del forumMotobarForum Internet & Hi-Tech

   

Pagina 1 di 1
 
Linguaggio C... dov'è il problema?
12628289
12628289 Inviato: 2 Nov 2011 20:42
Oggetto: Linguaggio C... dov'è il problema?
 

non ritorna il valore i della funzione. La dichiarazione della variabile i nel main è differente da quella della funzione. il programma lo esegue ma qualsiasi numero metto, lui ritorna il valore di i all'interno del main, quindi a seconda di come imposto la variabilenel main ES: int i=5; mi da a video il valore 5 indifferentemente dal valore che lui acquisisce da tastiera(se non la definisco con un valore lui mi da un valore casuale). Non legge il valore di ritorno nel main.
esempio 5!=120
/* programma per fare la fattorializzazione di un numero*/
// dichiarazione librerie input output
#include <stdio.h>

int fattorializzazione(int n); // dichiarazione funzione che esegue il fattoriale

int main(){
int n;
int i;
printf("digitare il numero da fattorializzare\n");
scanf("%d",&n); // leggo da tastiera il numero intero desiderato

int fattorializzazione(int n); // funzione fattorializzazione

printf("il fattoriale e':\n%d",i);

return 0;
}


// funzione di fattorizzazione
int fattorializzazione(int n){
int i=1;

while(n>1){
i=i*n; // moltiplico il numero da fattorializzare per n volte
n--; // decremento il numero da fattorizzare

}

return i;

}
 
12628322
12628322 Inviato: 2 Nov 2011 20:46
 

quando chiami una funzione (quindi non una procedura, dove ritorni un valore) devi fare variabile=nomedellafunzione(variabile da passare, senza tipo)
in questo caso
i=fattorializzazione(n);
 
12628338
12628338 Inviato: 2 Nov 2011 20:49
 

bestiale... è un ora che cerco di capire... sei un genio. ora provo e vedo se funziona
 
12628365
12628365 Inviato: 2 Nov 2011 20:55
 

icon_asd.gif un genio addirittura icon_asd.gif
 
12628392
12628392 Inviato: 2 Nov 2011 21:00
 

ho provato a fare come dici te nel MAIN ma non funziona!!! mi da degli errori in fase di compilazione.
nel main
int i=fattorizzazione(n)


la funzione ho fatto
int fattorializzazione(n){
int i=1;

while(n>1){
i=i*n; // moltiplico il numero da fattorializzare per n volte
n--; // decremento il numero da fattorizzare

}

return i;

}
 
12628424
12628424 Inviato: 2 Nov 2011 21:04
 

trovato l'errore definivo INT i=fattorizzazione(n)
non devo mettere l'INT
 
12628458
12628458 Inviato: 2 Nov 2011 21:08
 

Sposto nella sezione tecnologica.. 0509_up.gif
 
12628495
12628495 Inviato: 2 Nov 2011 21:12
 

esatto niente int icon_asd.gif
 
12628529
12628529 Inviato: 2 Nov 2011 21:17
 

....dal titolo pensavo si parlasse di questo:




...correggo icon_asd.gif
 
12628835
12628835 Inviato: 2 Nov 2011 21:59
 

icon_eek.gif
 
12628855
12628855 Inviato: 2 Nov 2011 22:02
 

hahahahah cos'è sta cosa? 0509_si_picchiano.gif 0509_si_picchiano.gif
 
12629000
12629000 Inviato: 2 Nov 2011 22:25
 

cuzzo94 ha scritto:
hahahahah cos'è sta cosa? 0509_si_picchiano.gif 0509_si_picchiano.gif


Il titolo era "Linguaccio C... dov'è il problema?" icon_asd.gif
 
12629061
12629061 Inviato: 2 Nov 2011 22:34
 

rotfl.gif
 
12629711
12629711 Inviato: 3 Nov 2011 8:18
 

io invece pensavo che lo stavi facendo in modo ricorsivo
rotfl.gif rotfl.gif rotfl.gif rotfl.gif rotfl.gif rotfl.gif
che non si può fare con numeri elevati se no rischi che va in palla tutto il Pc per troppe chiamate

consiglio di prenderti un libro e di non seguire le lezioni online 0509_up.gif 0509_up.gif 0509_up.gif 0509_up.gif
 
13722588
13722588 Inviato: 4 Set 2012 15:59
 

rispolvero il topic anche se vecchiotto....
ho un'altro problema da esporvi con il linguaggio C.
il programma deve eliminare le vocali da una parola inserita dall'utente e stamparla a video senza vocali
Non ne riesco a venire a capo... si compira ma quando lo eseguo mi fa inserire la parola e poi da CORE DUMP...

/*programma che elimina le vocali da una parola inserita dall'utente*/
#include <stdio.h>
#define size 30

void cancella(char v[size]);


int main(){

char v[size]; //stringa dove memorizzo la parola dell'utente
char stringa[size]; //stringa in cui memorizzo solo le consonanti

printf("inserire una parola a cui bisogna togliere le vocali\n");
scanf("%s",v); //leggo la parola dell'utente

cancella(v[size]); //funzione che cancella le vocali

printf("%s\n",stringa); //stampo la stringa

return 0;
}

void cancella(char v[size]){


int x,k=0;
int j=0;
char stringa[k];
/*controllo che la lettera posizionata all'indice v[j] sia una vocale,
se è una vocale passo alla lettera successiva,
se non è una vocale memorizzo la consonante nella stringa nella posizione stringa[k]*/

for(x=0;x<size;x++){


if((v[j]=="a") || (v[j]=="e") || (v[j]=="i") || (v[j]=="o") || (v[j]=="u")){
j++;

}

else{

stringa[k]=v[j];
k++;
j++;

}

}
}
 
13723369
13723369 Inviato: 4 Set 2012 19:30
 

Allora, il mio C è molto vecchiotto per cui il codice non sarà ottimizzato al massimo, ma ho trovato gli errori!

Questo intanto è il codice con le correzioni che compila e funziona:

Codice:
/*programma che elimina le vocali da una parola inserita dall'utente*/
#include <stdio.h>
#include <string.h>
#define size 30

void cancella(char v[size]);


int main(){

char input[size]; //stringa dove memorizzo la parola dell'utente

printf("inserire una parola a cui bisogna togliere le vocali\n");
scanf("%s",input); //leggo la parola dell'utente

cancella(input); //funzione che cancella le vocali
getch("pause");
return 0;
}

void cancella(char input[size]){
     int lunghezzaEffettiva = strlen(input);
     int x, j=0;
     char stringa[lunghezzaEffettiva];
     /*controllo che la lettera posizionata all'indice v[j] sia una vocale,
     se è una vocale passo alla lettera successiva,
     se non è una vocale memorizzo la consonante nella stringa nella posizione stringa[k]*/

     for(x=0;x<=lunghezzaEffettiva;x++)
                         if((input[x]=='a') || (input[x]=='e') || (input[x]=='i') || (input[x]=='o') || (input[x]=='u'))
                         ;
                         else {
                         stringa[j] = input[x];
                         j++;
                         }
                         

       printf("%s", stringa);                 
}


Veniamo agli errori:

1) Quando hai chiamato la funzione cancella, hai scritto cancella(v[size]), mentre dovevi inserire cancella(v). Come avevi scritto tu è come se tu stessi passando a cancella una nuova definizione della variabile v...sintatticamente corretto (credo...dovrei andare a rispolverare il Deitel&Deitel icon_redface.gif ), ma facevi impazzire tutto.

2)Il printf("%s\n",stringa); le cose sono due: o fai in modo che la funzione cancella restituisca una stringa e la salvi dentro la variabile stringa che hai creato nel main, oppure fai quello che ho fatto io, ovvero inizializzi, modifichi e stampi la variabile stringa dentro il metodo cancella. Ricorda: una variabile nasce, si modifica e muore all'interno del metodo in cui viene chiamata. Se vuoi permettere a quella variabile di vivere in tutto il tuo programma, allora devi inizializzarla come globale...ma è una pratica assolutamente sconsigliata.

3) if((v[j]=="a") || (v[j]=="e") || (v[j]=="i") || (v[j]=="o") || (v[j]=="u")) stai confrontando caratteri di stringa (quindi char), per cui invece di " devi usare ', ovvero
if((input[x]=='a') || (input[x]=='e') || (input[x]=='i') || (input[x]=='o') || (input[x]=='u'))

Appunti personali:
Come hai notato mi sono permesso di modificare la variabile v in input e di semplificare un po' il procedimento di ricerca. Quando crei un codice cerca di usare nomi di variabili più esplicativi possibile, anche se stai facendo un codice piccolo come questo, aiuta nella comprensione futura e, se lavori in team, permette anche a chi lavora con te di comprendere il tuo codice.

Inoltre quando crei un algoritmo cerca di pensare alla strada più semplice e di realizzarlo nella maniera più semplice, ad esempio io ho preso la tua idea, ma ho tolto un po' di roba che facevi in più:
* controllo che il carattere sia una vocale
* se lo è non faccio niente, per cui il for va avanti con il prossimo carattere
* se non lo è allora copio quel carattere nella stringa di appoggio e incremento il contatore della stringa di appoggio.

Non so se hai studiato le librerie che manipolano stringhe, ma invece di scorrere il contenitore input fino a 30, conviene scorrerlo sono fino a dove è "pieno". Per fare ciò ti basta semplicemente utilizzare la funzione strleng(v) che ti restituisce un intero con la lunghezza della stringa v, risparmiandoti un sacco di cicli nel for. Inoltre ti permette di risparmiare buffer di memoria creando una stringa di appoggio che sia lunga almeno come quella di input.

getch("pause") serve a bloccare il terminale, in modo che non si chiuda appena il programma ha terminato l'esecuzione dell'algoritmo.

se hai domande chiedi pure! icon_wink.gif

0510_saluto.gif
 
13725877
13725877 Inviato: 5 Set 2012 13:08
 

grazie sei stato utilissimo allora arriverò con qualche altra domanda. oggi ho dato l'esame ed è stato un dissastro... ti manderò il tema d'esame così da poter capire come agire e dove sbaglio... 0509_doppio_ok.gif 0509_doppio_ok.gif
 
14152324
14152324 Inviato: 23 Feb 2013 21:47
 

riapro questo topic riguardanda il linguaggio C

vorrei capire come faccio a inserire i dati letti da scanf dentro alla struttura...
il formato da leggere di presenta cosi
città - Km - ore
Adelaide 3559 7
Amsterdam 6.532 13
Auckland 5277 10


#include<stdio.h>
#include <string.h>




/*definisco una struttura di dati*/
typedef struct dati{
int distanza;
char nome[30];
int ore;
}DATI;
DATI riga[10];

int main(){
char n;
int d,o;

FILE *fp;
fp=fopen("aereoporto.txt","r");
if(fp == NULL){
printf("il file letto non è valido");
}
else{
int i=0;
while(fp != EOF){
fscanf(fp,"%s %d %d",&n, &d, &o);
riga[i].nome = &
riga[i].distanza=&
riga[i].ore=&

i++;
}
}
return 0;
}
 
14156824
14156824 Inviato: 25 Feb 2013 21:25
 

La distanza se la inserisci cosi

6.253 -> float
6253 -> Integer o int
 
14156905
14156905 Inviato: 25 Feb 2013 21:44
 

non capisco bene il problema. cosa non riesci a fare? se ho capito bene vuoi leggere delle righe da un file di testo e inserirle in un record. In questo caso di basta crearti una funzione che divide le stringhe dei 3 campi (sono separate dal carattere ' ' ascii 32) per poi convertire in float o int i valori (per gli interi hai la funzione atoi, per float/double non ricordo, cerca online, c'è di sicuro).


edit:vedo ora che usi la fscanf (che io non ho mai usato, ma leggendo online sembra molto più comoda di quello che ti ho detto io, penso che ti basti mettere le 3 variabili che passi alla fscanf nel punto in cui hai messo le &)


ps: la prossima volta per postare un codice usa il tasto Code, almeno resta indentato e si capisce meglio
 
14161204
14161204 Inviato: 27 Feb 2013 19:04
 

Ho provato a compilarlo alla veloce e mi da due errori, uno per quanto riguarda la condizione nella while e l'altro per l'assegnazione di quello che leggi dal file nella structure. Non so se sono i problemi che hai tu, ma basta usare

Codice:
while(!feof(fd))


e come ha detto cuzzo indicare direttamente nella fscanf le variabili (o structure) dove vuoi memorizzare i dati, così

Codice:
fscanf("%s %d %d", &riga[i].nome, &riga[i].distanza, &riga[i].ore);


funziona allo stesso modo la scanf.

Inoltre ti consiglierei di aggiungere exit(1) nella if che controlla l'invalidità nel file, perchè come scritto nel tuo programma viene semplicemente vidualizzato un messaggio d'errore e il programma va avanti incontrando poi errori.
 
14161302
14161302 Inviato: 27 Feb 2013 19:43
 

e dovresti anche chiudere il file con una fclose (solo nell' else)
 
14161403
14161403 Inviato: 27 Feb 2013 20:26
 

Sono riuscito a risolvere il problema 0509_doppio_ok.gif
 
Mostra prima i messaggi di:





Pagina 1 di 1

Non puoi inserire nuovi Topic
Non puoi rispondere ai Topic
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi
 
Indice del forumMotobarForum Internet & Hi-Tech

Forums ©