View Full Version : Duvida (principiante)


phoenix127
13-03-2008, 17:57
estou a tentar aprender C sozinho pelos tutoriais do cprogramming.com e uso o dev-c++ como compiler. no tutorial eles dao-nos um pequeno programa para ver como funciona:

#include <stdio.h>

int main() /* Most important part of the program!
*/
{
int age; /* Need a variable... */

printf( "Please enter your age" ); /* Asks for age */
scanf( "%d", &age ); /* The input is put in age */
if ( age < 100 ) { /* If the age is less than 100 */
printf ("You are pretty young!\n" ); /* Just to show you it works... */
}
else if ( age == 100 ) { /* I use else just to show an example */
printf( "You are old\n" );
}
else {
printf( "You are really old\n" ); /* Executed if no other statement is
*/
}
return 0;
}

a duvida é: quando executo isto aparece a tal janela preta a dizer «please enter your age», aí eu ponho um numero qualquer e carrego enter, certo? é isso que faço e a janela fecha-se, desaparece, porquê? que estou a fazer mal?

Ajudem-me tou a começar a gostar disto!

Tsunamy_boy
13-03-2008, 18:06
falta-t fazer uma pausa no ecra... para ele nao ir abaixo...
nao me lembro do comando mas no final do codigo antes de "return 0" mete "scanf( "%d", &age );" vai ler a variavel novamente mas assim ja ves o resultado...
procura "pause" ou readkey no google ou assim

experimenta isto antes do return 0:
getch();

e nao faças "int main()" faz "void main(void) " e tira o "return 0"
o return serve para devolver um valor ao procedimento, no caso do procedimento principal nao é necessario, fora exepções

phoenix127
13-03-2008, 18:06
RESULTOU!!!!!!!!!! :002:

outra coisa: so posso inseriri a idade uma vez so certo? é porque ele vai abaixo quando meto segunda vez....

Tsunamy_boy
13-03-2008, 18:11
só pois só a pedes uma vx no codigo:
scanf( "%d", &age );
caso queiras varias fezes faz um ciclo "for" ou um "while"
sugiro "for"

phoenix127
13-03-2008, 18:11
experimenta isto antes do return 0:
getch();

e nao faças "int main()" faz "void main(void) " e tira o "return 0"
o return serve para devolver um valor ao procedimento, no caso do procedimento principal nao é necessario, fora exepções

n funciona assim....

Tsunamy_boy
13-03-2008, 18:13
da-me o teu codigo actual

phoenix127
13-03-2008, 18:13
só pois só a pedes uma vx no codigo:
scanf( "%d", &age );
caso queiras varias fezes faz um ciclo "for" ou um "while"
sugiro "for"

pois isso ainda não sei, é a próxima lição.

:lol:


#include <stdio.h>
int main() /* Most important part of the program!
*/
{
int age; /* Need a variable... */
printf( "Please enter your age" ); /* Asks for age */
scanf( "%d", &age ); /* The input is put in age */
if ( age < 100 ) { /* If the age is less than 100 */
printf ("You are pretty young!\n" ); /* Just to show you it works... */
}
else if ( age == 100 ) { /* I use else just to show an example */
printf( "You are old\n" );
}
else {
printf( "You are really old\n" ); /* Executed if no other statement is
*/
}
scanf("%d", &age);
return 0;
}

assim vai la

Tsunamy_boy
13-03-2008, 18:15
tira o "scanf("%d", &age);" e poe
"getch();"
Funka?

phoenix127
13-03-2008, 18:16
diz que «getch() is undeclared (first use this function)»

Tsunamy_boy
13-03-2008, 18:20
na primeira linha poe tambem:
#include <conio.h>
e usa o getch() na mesma
ve se da

phoenix127
13-03-2008, 18:23
deu! mas depois de carregar enter se tento escrever mais alguma coisa vai abaixo
axo k ficou melhor com a 1ª solução

Tsunamy_boy
13-03-2008, 18:27
sim, este comando com está faz uma espera de tecla.
queres fazer aparecer varias vezes a pergunta?

deu! mas depois de carregar enter se tento escrever mais alguma coisa vai abaixo
axo k ficou melhor com a 1ª solução
nao uses a primeira solução estas a guardar valores numa variavel desnexexariamente se mais tarde precisares da variavel ela axumiu outros valores

phoenix127
13-03-2008, 18:28
deixa estar. muito obrigado por tudo, vou seguir as lições.
OBRIGADÃO!!

Tsunamy_boy
13-03-2008, 18:31
de nada fica bem...
ja agora codeproject.com ajuda... tens lá varias linguagens de programação...
cumps

phoenix127
13-03-2008, 18:35
diz-me so uma coisa, tenho de manter #include <stdio.h> não é?

Baderous
13-03-2008, 18:38
e nao faças "int main()" faz "void main(void) " e tira o "return 0"
o return serve para devolver um valor ao procedimento, no caso do procedimento principal nao é necessario, fora exepções

Errado. Segundo as normas ANSI, a função main pode ter 2 cabeçalhos:

int main()ou
int main(int argc,char *argv[])A diferença que existe na 2ª é que esta recebe parâmetros através da linha de comandos.

http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20(ANSI)%202.2.pdf (http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf)
http://members.aol.com/wantondeb/#MAIN

Se quiseres que o programa não pare, podes experimentar corrê-lo a partir da linha de comandos ou então colocar um getchar() (e não um getch(), não é preciso sobrecarregar o compilador com processamento de bibliotecas - conio.h - desnecessariamente) antes do return 0 (o qual deve estar presente!).

Tsunamy_boy
13-03-2008, 18:39
sim, sempre! pois vais precisar de vaios procedimentos que essa "biblioteca" tem

Baderous
13-03-2008, 18:41
sim, sempre! pois vais precisar de vaios procedimentos que essa "CLASS" tem

Biblioteca

Tsunamy_boy
13-03-2008, 18:42
Errado. Segundo as normas ANSI, a função main pode ter 2 cabeçalhos:

int main()ou
int main(int argc,char *argv[])A diferença que existe na 2ª é que esta recebe parâmetros através da linha de comandos.

http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20(ANSI)%202.2.pdf (http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf)
http://members.aol.com/wantondeb/#MAIN

Se quiseres que o programa não pare, podes experimentar corrê-lo a partir da linha de comandos ou então colocar um getchar() (e não um getch(), não é preciso sobrecarregar o compilador com processamento de bibliotecas - conio.h - desnecessariamente) antes do return 0 (o qual deve estar presente!).


o int main();
nao vai dizer que o procedimento vai devolver valores do tipo int? então para que usar isto s ele não vai receber nada daki

bem tenho k ir embora...
eu usava o void main();
mas cada um usa conforme o k precisar, e nao é incorrecto usar int main();
bem usem ao vosso gosto eu axo desnexexario...

Baderous
13-03-2008, 18:45
o int main();
nao vai dizer que o procedimento vai devolver valores do tipo int? então para que usar isto s ele não vai receber nada daki

1 - Procedimentos é em Pascal. Aqui temos funções.
2 - A função vai indicar ao sistema operativo se concluiu a tarefa com sucesso (valor do return), esse valor pode ser utilizado posteriormente pelo SO.

Não é o que tu achas necessário, é seguir as normas para que depois não haja problemas na execução dos programas!

phoenix127
13-03-2008, 19:17
Errado. Segundo as normas ANSI, a função main pode ter 2 cabeçalhos:

int main()ou
int main(int argc,char *argv[])A diferença que existe na 2ª é que esta recebe parâmetros através da linha de comandos.

http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20(ANSI)%202.2.pdf (http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf)
http://members.aol.com/wantondeb/#MAIN

Se quiseres que o programa não pare, podes experimentar corrê-lo a partir da linha de comandos ou então colocar um getchar() (e não um getch(), não é preciso sobrecarregar o compilador com processamento de bibliotecas - conio.h - desnecessariamente) antes do return 0 (o qual deve estar presente!).

pois, mas se coloco o getchar(), tiro o conio.h e o getch() (certo?), e quando executo o programa mal carrego enter vai abaixo.

Baderous
13-03-2008, 19:27
pois, mas se coloco o getchar(), tiro o conio.h e o getch() (certo?), e quando executo o programa mal carrego enter vai abaixo.

Isso acontece porque quando tu introduzes a idade (por ex: 8), na verdade não introduzes 1 valor, mas sim 2, uma vez que após carregares na tecla 8, de seguida carregas no ENTER. Ora assim estás a ler para o buffer de entrada 2 valores (8 + '\n' ; \n é o caracter que representa o ENTER). O 1º valor (8) é aproveitado para guardar na variável "age" enquanto que o 2º se mantém no buffer. O que acontece ao colocares o tal getchar() antes do return é que esse getchar vai ler um caracter do standard input (normalmente, o teclado), mas como o buffer de entrada já contém um caracter (o tal \n), o getchar() vai aproveitar esse caracter e, como tal, o programa prossegue para o return e termina sem tu veres nada.
A solução aqui consiste em limpar o buffer de entrada que pode ser feito colocando esta linha (antes do tal getchar()):
scanf("%*[^\n]"); scanf("%*c");
Podes ver a explicação para esta linha aqui (http://www.portugal-a-programar.org/forum/index.php/topic,12638.0.html).