PDA

View Full Version : [C] Testo


xbubbax
11-08-2007, 09:13
Quando in un esercizio mi viene chiesto "inserisci un testo da tastiera", significa che devo inserire una stringa oppure una serie di stringhe, cioè andando anche a capo? Se è così come si fa ad inserirlo e poi a scorrerlo tutto?

xbubbax
11-08-2007, 09:16
Un'altra cosa, quando mi viene dato il prototipo int somma_interi_nel_testo()

signfica che posso metterci quanti argomenti mi pare oppure si sono dimenticati di metterli?:D

xbubbax
11-08-2007, 09:51
ho scritto questo programma per stampare i numeri interi presenti in una stringa, gia l'avevo postato sul forum ma non trovo piu il thread

mi da come risultato 99. non capisco dove sbaglio

#include <stdio.h>
int somma_interi_nel_testo(char *vett, int size);
int main(){
int size=10;
char vett[10];

printf("Inserisci una stringa di 9 caratteri/numeri:\n");
scanf("%s", vett);



printf("%d\n", somma_interi_nel_testo(vett, size));

while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();}




int somma_interi_nel_testo(char *vett, int size){
int somma=0;

for(;*vett!='\0';vett++){
if(*vett>='0'&&*vett<='9'){
somma += *vett;
}}
return somma;}



lasciate perdere i getchar, lo uso per far bloccare il risultato sullo schermo

mastoo
11-08-2007, 10:09
il fatto è che nela codifica ascii le cifre non valgono 0,1,2,3 ...
ma 48,49 ,50 .. (mi pare)
quindi dovresti scrivere nella formula per la somma
somma += (*vett-'0')
in questo modo sottrai l'offset

eliano
11-08-2007, 10:30
ho scritto questo programma per stampare i numeri interi presenti in una stringa, gia l'avevo postato sul forum ma non trovo piu il thread

mi da come risultato 99. non capisco dove sbaglio

#include <stdio.h>
int somma_interi_nel_testo(char *vett, int size);
int main(){
int size=10;
char vett[10];

printf("Inserisci una stringa di 9 caratteri/numeri:\n");
scanf("%s", vett);



printf("%d\n", somma_interi_nel_testo(vett, size));

while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();}




int somma_interi_nel_testo(char *vett, int size){
int somma=0;

for(;*vett!='\0';vett++){
if(*vett>='0'&&*vett<='9'){
somma += *vett-'0'; <------
}}
return somma;}



lasciate perdere i getchar, lo uso per far bloccare il risultato sullo schermo

Il classico errore di distrazione: hai dimenticato di convertire il valore da sommare in numero, sommando invece il codice ascii della cifra letta; il compilatore non protesta perché per lui un char altro non è che in int ad 8 bit.

xbubbax
11-08-2007, 10:35
e come si fa?:D

xbubbax
11-08-2007, 11:03
ho abbozzato anche la versione ricorsiva, fate prima a dirmi cosa c'è di giusto

int somma_interi_nel_testo(char *vett){
if(*vett!='\0'){
if(*vett<='9'&&*vett>=0){
return *vett + somma_interi_nel_testo(vett+1);}
else return somma_interi_nel_testo(vett+1);}

okay
11-08-2007, 11:13
ho abbozzato anche la versione ricorsiva, fate prima a dirmi cosa c'è di giusto

int somma_interi_nel_testo(char *vett){
if(*vett!='\0'){
if(*vett<='9'&&*vett>=0){
return *vett + somma_interi_nel_testo(vett+1);}
else return somma_interi_nel_testo(vett+1);}


te la scritto mastoo:

//questa è la riga da immettere al tuo progetto:
somma += (*vett-'0');

xbubbax
11-08-2007, 12:29
sisi non avevo letto

e per quanto riguarda quella ricorsiva?

wingman87
11-08-2007, 12:49
Manca un pezzo, probabilmente hai sbagliato ad incollare.

xbubbax
11-08-2007, 12:57
Non ho sbagliato a incollare, probabilmente ho sbagliato a scriverla:)

Se mi dite dove sbaglio

mastoo
11-08-2007, 13:22
l'errore è sempre lo stesso aggiungi il codice ascii invece della cifra e poi quando trova il terminatore null alla fine della stringa non retituisce niente mentre deve ritornare 0


int somma_interi_nel_testo(char *vett)
{
if(*vett != '\0')
if(*vett<='9'&& *vett>='0')
return (*vett-'0')+somma_interi_nel_testo(vett+1);
else
return somma_interi_nel_testo(vett+1);
else
return 0;
}


una versione piu compatta puo essere

int somma_interi_nel_testo(char *vett)
{
if(*vett != '\0')

return (*vett<='9'&& *vett>='0') ? (*vett-'0')+somma_interi_nel_testo(vett+1):somma_interi_nel_testo(vett+1);

else
return 0;
}

xbubbax
11-08-2007, 13:38
Ho capito. Vabbè c'ero quasi...

wingman87
11-08-2007, 14:07
Quando scrivi una funzione ricorsiva devi sempre stare attento che questa abbia un termine, è una regola fondamentale.

xbubbax
25-08-2007, 10:33
Ho provato a rifare da solo la ricorsione di questo esercizio ma mi da come risultato circa 400000, come mai?

l'esercizio sembra corretto

#include <stdio.h>
int Rsomma_interi_nel_testo(char *stringa);
int main(){
char testo[10]="apemaia12";


printf("Il risultato e' %d\n", Rsomma_interi_nel_testo(testo));


while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
}

int Rsomma_interi_nel_testo(char *stringa){
if(*stringa!='\0'){
if((*stringa>='0')&&(*stringa<='9')){
return (*stringa-'0') + Rsomma_interi_nel_testo(stringa+1);}
else Rsomma_interi_nel_testo(stringa+1);}
else return 0;}

cionci
25-08-2007, 12:31
Per favore xubbax...l'indentazione...non riesco a leggere i tuoi sorgenti.

xbubbax
25-08-2007, 13:14
come l'identazione?


ma non ti esce la barra per scorrere a destra?

AngeL)
25-08-2007, 13:37
come l'identazione?


ma non ti esce la barra per scorrere a destra?

si, ma non dovrebbe uscire se il codice è indentato bene..
(te l'ho già detto in un altro thread (link (http://www.hwupgrade.it/forum/showpost.php?p=18326762&postcount=22)))

xbubbax
25-08-2007, 15:16
si ma che fa che esce?

a funzionare funziona lo stesso, e per leggerlo basta scorrere a destra la barra...

cionci
25-08-2007, 15:20
xubbax: te l'ho già spiegato rende difficile la lettura del tuo codice. Inoltre semplicemente non si indenta così, non è buon uso e quindi da evitare soprattutto quando proponi il tuo codice ad altri che lo devono leggere.
Giusto per spiegarti un problema: quando si legge cosa fai all'interno del blocco ci si perde già l'if precedente. Cionfronta quanto sia facile leggere il codice di mastoo rispetto al tuo. inoltre non si capisce assolutamente niente di quello che fai con le parentesi e quindi non ci si rende conto a che livello siamo nella struttura del codice.

cionci
25-08-2007, 15:45
Inoltre sono convinto che renderebbe più facile anche te capire cosa hai scritto e scovare eventuali errori.
Confronta...

#include <stdio.h>
int Rsomma_interi_nel_testo(char *stringa);

int main()
{
char testo[10]="apemaia12";

printf("Il risultato e' %d\n", Rsomma_interi_nel_testo(testo));

while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
}

int Rsomma_interi_nel_testo(char *stringa)
{
if(*stringa!='\0')
{
if((*stringa>='0')&&(*stringa<='9'))
{
return (*stringa-'0') + Rsomma_interi_nel_testo(stringa+1);
}
else
Rsomma_interi_nel_testo(stringa+1);
}
else
return 0;
}


#include <stdio.h>
int Rsomma_interi_nel_testo(char *stringa);
int main(){
char testo[10]="apemaia12";


printf("Il risultato e' %d\n", Rsomma_interi_nel_testo(testo));


while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
}

int Rsomma_interi_nel_testo(char *stringa){
if(*stringa!='\0'){
if((*stringa>='0')&&(*stringa<='9')){
return (*stringa-'0') + Rsomma_interi_nel_testo(stringa+1);}
else Rsomma_interi_nel_testo(stringa+1);}
else return 0;}

xbubbax
25-08-2007, 16:53
e come lo devo scrivere?

devo andare a capo piu spesso e devo evitare di scrivere queste righe lunghissime?

cionci
25-08-2007, 17:12
Devi semplicemente scegliere uno stile di scrittura fra quelli più diffusi e mantenere lo stesso stile per tutto il codice.
Ad esempio: parentesi graffe da sole su una linea, 3 o 4 caratteri di indentazione per ogni blocco (per questo ti può aiutare l'editor di testo che usi per scrivere il codice), INVIO dopo un'istruzione di flusso (if, for, while etc etc), un spazio prima e dopo gli operatori (io non lo metto solo per gli operatori unari, cioè ++, --) e dopo la virgola.

Ad esempio:

int f(int n)
{
int ret = 0, i;

if(n > 0)
{
return 1;
}

if(n == 1)
{
return 0;
}

for(i = 0; i < n; i++);
{
ret += i;
}

return ret;
}

Codice inutile quello sopra, per carità, ma ti può far vedere come scrivere il tutto.