Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

Linguaggio C, Problema

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

Linguaggio C, Problema

Messaggioda Maurizio90 » ven gen 18, 2013 6:48 pm

Devo svolgere un esercizio, in Linguaggio C, che consiste in un programma, che prenda in ingresso una stringa inmessa dall'utente tramite la funzione GETCHAR e poi usando la funzione STRLEN devo stampare la stringa una lettera si e una lettera no.
Questo è come ho provato a fare io ma purtroppo non ha sortito i risultati sperati:

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char parola[100];
    int i;
   
    printf("inserire la frase(meno di 100 caratteri):\n\n");
   
    for( i = 0; (parola[i] = getchar()) != '\n'; i++)
   
    printf("La frase verrà stampata una lettera si e una no\n\n");
    //printf dentro al ciclo?!? perché?
    for( i = 0; i < strlen(parola); i = i + 2) 
    printf("%c", parola[i]);
   
    printf("\n");
   
    for( i = 0; i < strlen(parola); i++)
    printf("%c", parola[i]);
    //comparsa di simboli estranei e senza senso!! perché?
    printf("\n");
 
  system("PAUSE");   
  return 0;
}
Avatar utente
Maurizio90
Neo Iscritto
Neo Iscritto
 
Messaggi: 22
Iscritto il: mer gen 09, 2013 3:10 pm

Re: Linguaggio C, Problema

Messaggioda Ale2695 » ven gen 18, 2013 7:13 pm

C'è un problema fondamentale: la funzione getchar, come dice la parola stessa, acquisisce un solo carattere da tastiera, e non un'intera stringa.
Per fare quello che chiede l'esercizio, è necessario usare o la scanf con argomento %s, oppure la gets.
Ecco la mia possibile correzione:

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
char parola[100];
int i, n;

printf("inserire la frase(meno di 100 caratteri):\n\n");
gets(parola); //acquisizione della stringa
n=strlen(parola); //ricavo la lunghezza della stessa tramite strlen
printf("La frase verrà stampata una lettera si e una no\n\n"); //si, va stampata la frase prima del ciclo, sennò viene ripetuta ogni volta

for(i=0; i<n; i++) //ciclo che si ferma una volta arrivato all'ultima lettera in parola
if(i%2==0) //se i è pari
printf("%c\n", parola[i]);

system("PAUSE");   
return 0;
}
Oppure c'è un modo per acquisirla tramite getchar, ma è complesso in maniera inutile:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
char parola[100], x;
int i, n;

printf("inserire la frase(meno di 100 caratteri, dare invio senza scrivere nulla per terminare):\n\n");
while(x!=""){ //finchè x è diverso dal carattere NULL, vuoto
getchar(x);
if(x!="")
parola[]=x;
else
parola[]="\0"; //se è arrivato alla fine, chiudo la stringa col terminatore \0
}
n=strlen(parola); //ricavo la lunghezza della stessa tramite strlen
printf("La frase verrà stampata una lettera si e una no\n\n"); //si, va stampata la frase prima del ciclo, sennò viene ripetuta ogni volta

for(i=0; i<n; i++) //ciclo che si ferma una volta arrivato all'ultima lettera in parola
if(i%2==0) //se i è pari
printf("%c\n", parola[i]);

system("PAUSE");   
return 0;
}
http://www.chimerarevo.com/
Avatar utente
Ale2695
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5927
Iscritto il: dom gen 18, 2009 10:39 am
Località: Novara

Re: Linguaggio C, Problema

Messaggioda Maurizio90 » dom gen 20, 2013 2:22 pm

Grazie mille, ma l'esercizio chiedeva espressamente l'uso della getchar quindi non ho potuto caricare la stringa con %s e tutto il resto.
Mi ero dimenticato di aggiungere il '\0' alla fine della stringa ma non capisco perché mi consideri dentro al ciclo la printf La frase verrà stampata una lettera si e una no\n\n dato che non è dentro graffe e neanche direttamente sotto il ciclo for?
Avatar utente
Maurizio90
Neo Iscritto
Neo Iscritto
 
Messaggi: 22
Iscritto il: mer gen 09, 2013 3:10 pm

Re: Linguaggio C, Problema

Messaggioda M@ttia » dom apr 07, 2013 1:19 pm

Beh, drasticamente in ritardo, ma magari a chi leggerà in futuro potrà servire...

Il ciclo for è dato nella forma:
Codice: Seleziona tutto
for(....)
{
  CODICE DENTRO IL CICLO
}
CODICE FUORI IL CICLO

Esempio:
Codice: Seleziona tutto
for(int i=0; i<10; ++i)
{
  printf("Ora siamo all'iterazione numero ");
  printf(i);
  printf("\n\n");
}
printf("FINITO!");


In verità, il ciclo for esegue solo il SINGOLO COMANDO successivo al for(...). Le parentesi {} definiscono un blocco, che viene visto quindi come un unico comando che viene eseguito da ciclo. Se non si mettono le parentesi {}, il primo comando che si trova dopo il for(...), anche 30 righe vuote sotto, è l'unico comando che viene eseguito nel ciclo, quindi:

Codice: Seleziona tutto
for(....)
CODICE DENTRO IL CICLO
CODICE FUORI IL CICLO

Esempio (indentato male apposta):
Codice: Seleziona tutto
for(int i=0; i<10; ++i)

printf(i);
printf("FINITO!");


Il tuo esempio "problematico" è equivalente all'ultima casella di codice qui sopra. [^]
</IE><FIREFOX>
Avatar utente
M@ttia
Moderatore
Moderatore
 
Messaggi: 8363
Iscritto il: lun giu 09, 2003 2:18 pm
Località: Ticino - Estero


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron
Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising