View Full Version : [C] Testo
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?
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
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
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
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.
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);}
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');
sisi non avevo letto
e per quanto riguarda quella ricorsiva?
wingman87
11-08-2007, 12:49
Manca un pezzo, probabilmente hai sbagliato ad incollare.
Non ho sbagliato a incollare, probabilmente ho sbagliato a scriverla:)
Se mi dite dove sbaglio
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;
}
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.
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;}
Per favore xubbax...l'indentazione...non riesco a leggere i tuoi sorgenti.
come l'identazione?
ma non ti esce la barra per scorrere a destra?
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)))
si ma che fa che esce?
a funzionare funziona lo stesso, e per leggerlo basta scorrere a destra la barra...
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.
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;}
e come lo devo scrivere?
devo andare a capo piu spesso e devo evitare di scrivere queste righe lunghissime?
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.