Duvida em C

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Duvida em C

Mensagempor Zé da Moca » Terça Fev 12, 2008 12:20

Boas, iniciei-me agora a programar em c e estou aqui com dois pequenos problemas que julgo serem de facil resolução, mas que me estão a picar o coco. É o seguinte, primeiro estou a ter problemas em ficar os resultados no ecrã, ja usei a biblioteca <stdlib> para usar o system("PAUSE") e nem assim, sai do programa e so depois pede pa digitar premir uma tecla pra continuar :twisted: .

Outro dos problemas é que pretendo fazer um programa que me destinga numeros pares de numeros impares, ja vi na net mas n entendi ao certo como o fazer.

Ja agora... vejo muitas vezes no final de codes que vejo na net o statment return=0; kual a utilidade disto???
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor Kayn » Terça Fev 12, 2008 13:06

ficar os resultados no ecra? nao entendi muito bem o que queres. geralmente quando o teu programa termina, é te dada uma mensagem a dizer que terminou. mas ha maneiras de criar pausas, se é isso que queres :P

fazer um programa que faça distinção entre numero pares e impares é facil. divide o numero que queres testar por 2. Se o resto for 0, é par.

tens este exemplo rapido de codigo a explicar como:
------------------------
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
div_t n; // define uma struct predefinida com os membros quot e rem

n = div(10, 3); // faz a divisao

printf("Quociente e resto: %d %d.\n", n.quot, n.rem); // mostra os varios membros da struct

return 0;
}
-------------------


o return 0 é facil de explicar. em C usa-se funcoes pra quase tudo e todas tem que devolver qualquer coisa (valor, etc) caso nada em contrario.

se estas a definir a tua função como um
int main()
estas a dizer que a tua função vai devolver um numero inteiro. Se depois durante a função nao tens nada que atribua um valor a função ele dá erro. pra contornar isso, define-se o valor a devolver com
return 0;

uma alternativa tambem é usar o
void main()
isto dispensa o return 0 porque ja tas a definir a função como uma função que nao devolve nada.
Imagem
Imagem
Kayn
Gurus
Gurus
 
Mensagens: 3038
Registado: Quarta Ago 04, 2004 3:34

Mensagempor bvmzinho » Terça Fev 12, 2008 14:42

se o que queres é que ao mostrar algo no ecrã o programa pause até pressionares alguma tecla, podes usar a função getch();

se não for isso, tb não entendi o que perguntas...

cumps
MacBook Pro 2.2GHz
bvmzinho
Membro de Prata
Membro de Prata
 
Mensagens: 362
Registado: Sábado Jan 15, 2005 17:25

Mensagempor Zé da Moca » Terça Fev 12, 2008 14:48

tens este exemplo rapido de codigo a explicar como:
------------------------
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
div_t n; // define uma struct predefinida com os membros quot e rem

n = div(10, 3); // faz a divisao

printf("Quociente e resto: %d %d.\n", n.quot, n.rem); // mostra os varios membros da struct

return 0;
}

_______________

épa ainda n vou tao avançado... vou msm msm no inicio

ainda n cheguei às structures, nem a essa coisa do void.


Estava a pensar fazer o seguinte, pedia para o utilizador digitar um numero, recolhia-o e depois dividia-o usando o operador módulo, se o resultado fosse =0 o numero era par se fosse != 0 era impar...


nao será mais fácil ou nao é viável?
Editado pela última vez por Zé da Moca em Terça Fev 12, 2008 14:51, num total de 3 vezes.
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor Zé da Moca » Terça Fev 12, 2008 14:49

bvmzinho Escreveu:se o que queres é que ao mostrar algo no ecrã o programa pause até pressionares alguma tecla, podes usar a função getch();

se não for isso, tb não entendi o que perguntas...

cumps



é isso msm mas a função getch() nem sempre funciona tal como o system("PAUSE")!!!
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor bvmzinho » Terça Fev 12, 2008 15:00

Zé da Moca Escreveu:
bvmzinho Escreveu:se o que queres é que ao mostrar algo no ecrã o programa pause até pressionares alguma tecla, podes usar a função getch();

se não for isso, tb não entendi o que perguntas...

cumps



é isso msm mas a função getch() nem sempre funciona tal como o system("PAUSE")!!!


nunca tive problemas!

nem a essa coisa do void.


essa coisa do void é das primeiras coisas que aprendes na linguagem C.

repara... tu nem no caso mais simples, onde não retorne nada, consegues compilar um programa que tenha simplesmente a main e um printf, sem teres o void:
EDIT: acho que isto depende do compilador... alguns deixam compilar sem o void. :oops:

Exemplo:

#include <xpto.h>
#include <xyz.h>

void main(void)
{
printf(\nSou mesmo bonito como a noite!\n);
}

cumps.
Editado pela última vez por bvmzinho em Terça Fev 12, 2008 15:37, num total de 1 vez.
MacBook Pro 2.2GHz
bvmzinho
Membro de Prata
Membro de Prata
 
Mensagens: 362
Registado: Sábado Jan 15, 2005 17:25

Mensagempor Zé da Moca » Terça Fev 12, 2008 15:02

bvmzinho Escreveu:
Zé da Moca Escreveu:
bvmzinho Escreveu:se o que queres é que ao mostrar algo no ecrã o programa pause até pressionares alguma tecla, podes usar a função getch();

se não for isso, tb não entendi o que perguntas...

cumps



é isso msm mas a função getch() nem sempre funciona tal como o system("PAUSE")!!!


nunca tive problemas!


nem a essa coisa do void.


essa coisa do void é das primeiras coisas que aprendes na linguagem C.

repara... tu nem no caso mais simples, onde não retorne nada, consegues compilar um programa que tenha simplesmente a main e um printf, sem teres o void:

Exemplo:

#include <xpto.h>
#include <xyz.h>

void main(void)
{
printf(\nSou mesmo bonito como a noite!\n);
}

cumps.



mas é concretamente o k???
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor bvmzinho » Terça Fev 12, 2008 15:17

sempre que tens uma função tens de lhe passar parâmetros. não esquecer que a main não é mais que uma função. apesar de ser a indispensável e principal de um programa em C.

contudo tu podes construir funções que não precisem de receber ou retornar informação alguma. nestas situações usa-se o void que não é nada mais que VAZIO, isto é, a informação que passas ou recebes é NADA.

Exemplo - Dentro da main chamas uma função que te vai imprimir uma frase fixa "Olá Mundo!", não precisas de passar nenhuma parâmetro:

void funcao(void)
{
printf("\nOlá Mundo!\n");
}

void main(void)
{
funcao();
}

O que acontece é que dentro da main está a chamar uma função exterior que só imprime a frase. (código redundante apenas a titulo de ex. :P)

Agora imagina que queres chamar uma função e passar-lhe um número que o utilizador insere e verificar se ele é par ou ímpar:

int num1, num2, x;

int funcao(int x)
{
if(x%2 == 0)
return 0;
else
return 1;
}

void main(void)
{
scanf("%d",&num1);
num2=funcao(num1);
if(num2 == 0)
printf("\nO numero inserido é par.\n");
else
printf("\nO numero inserido é impar.\n");
}

Neste caso já há passagem de parâmetros. Chamas a função e passas-lhe um inteiro. Ele analisa o numero e se este for par retorna 0 e se for impar retorna 1. Assim, tu recebes no num2 ou 0 ou 1, consoante a paridade do número.
Espero que tenhas ficado mais ou menos com a ideia.

P.S. poderão haver alguns erros na sintaxe, mas já não programo há alguns anos em C.

Cumps
MacBook Pro 2.2GHz
bvmzinho
Membro de Prata
Membro de Prata
 
Mensagens: 362
Registado: Sábado Jan 15, 2005 17:25

Mensagempor Zé da Moca » Terça Fev 12, 2008 15:26

acho que fiquei mais elucidado n so no void como nas funções... apesar de ainda haver umas coisitas que n entendi mas pronto.

No entanto ja consegui fazer um programa bem mais simples para determinar se o numero é par ou impar mais simples:

# include <stdio.h>
# include <stdlib.h>

main()
{

int n,x;

printf(" Digite um numero: ");
scanf("%d",&n);

x=n%2;

if (x!=0)
printf("\nO numero que digitou e impar");
else
printf("o numero e par ");

system("PAUSE");

}



e se eu quiser blindar o programa do tipo, se o user digitar um caracter ele madnar uma mensagem para introduzir num valido???
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor bvmzinho » Terça Fev 12, 2008 15:34

Zé da Moca Escreveu:acho que fiquei mais elucidado n so no void como nas funções... apesar de ainda haver umas coisitas que n entendi mas pronto.

No entanto ja consegui fazer um programa bem mais simples para determinar se o numero é par ou impar mais simples:

# include <stdio.h>
# include <stdlib.h>

main()
{

int n,x;

printf(" Digite um numero: ");
scanf("%d",&n);

x=n%2;

if (x!=0)
printf("\nO numero que digitou e impar");
else
printf("o numero e par ");

system("PAUSE");

}


fizeste o mesmo que eu. mas eu usei uma função para ver se é par ou impar. mesmo estando a começar agora, acho que não te faz mal começares a trabalhar com funções. organiza-te melhor o código e o raciocinio.
MacBook Pro 2.2GHz
bvmzinho
Membro de Prata
Membro de Prata
 
Mensagens: 362
Registado: Sábado Jan 15, 2005 17:25

Mensagempor Zé da Moca » Terça Fev 12, 2008 15:39

bvmzinho Escreveu:
fizeste o mesmo que eu. mas eu usei uma função para ver se é par ou impar. mesmo estando a começar agora, acho que não te faz mal começares a trabalhar com funções. organiza-te melhor o código e o raciocinio.


tens razão, vou seguir o teu conselho desde já!

vou começar a trabalhar com funções!

Gracias
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor vamosAeles » Terça Fev 12, 2008 22:37

Boas,
apenas um reparo em relação ao void main().
Essa declaração penso que seja não aceitável pelas normas ansi e ISO C x.x.x??

No caso da linguagem C, é retorno no main é importante (ou não, se não for usado para nada...) para indicar ao sistema operativo se o programa acabou "bem" return 0 (no main) (ou exit(0) noutra função), ou acabou mal (!= 0).

Esse valor tornar-se bem mais relevante quando o programa foi lançado por uma outra aplicação que controlamos e cujo valor pode ser importante para o seu comportamento.

No entanto muitas vezes apenas se coloca main() e funca, porque além de não se activarem as flags para o código estar de acordo com as normas que referi no início, quando o tipo de retorno é omisso, int é assumido como tal, assim como return 0 no fim das mesmas funcões.


[[[[]]]]
vamosAeles
Membro de Prata
Membro de Prata
 
Mensagens: 206
Registado: Quarta Jan 04, 2006 21:29
Localização: Lisboa/Proença

Mensagempor Zé da Moca » Quarta Fev 13, 2008 10:10

vamosAeles Escreveu:Boas,
apenas um reparo em relação ao void main().
Essa declaração penso que seja não aceitável pelas normas ansi e ISO C x.x.x??

No caso da linguagem C, é retorno no main é importante (ou não, se não for usado para nada...) para indicar ao sistema operativo se o programa acabou "bem" return 0 (no main) (ou exit(0) noutra função), ou acabou mal (!= 0).

Esse valor tornar-se bem mais relevante quando o programa foi lançado por uma outra aplicação que controlamos e cujo valor pode ser importante para o seu comportamento.

No entanto muitas vezes apenas se coloca main() e funca, porque além de não se activarem as flags para o código estar de acordo com as normas que referi no início, quando o tipo de retorno é omisso, int é assumido como tal, assim como return 0 no fim das mesmas funcões.
[[[[]]]]


Então nesse caso pk razão é que as vezes se declara o int main()??

Quando é que "classificamos" as funções e exactamente quando é usamos o return=0.

A outra coisa que me esta a picar, pk é que se usa void main(void)?? ja sei que o primeiro void indica uma função que n vai retornar valores/calculos agora o void dentro de parentesis!!!! Sei que tem a ver com os argumentos da função, mas um argumento nulo??? que é isso?
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Mensagempor vamosAeles » Quarta Fev 13, 2008 10:39

Zé da Moca Escreveu:Então nesse caso pk razão é que as vezes se declara o int main()??

Porque o main em C deve retornar um inteiro.
Quando fazes void main é diferente de main (sem void nem int no retorno), porque quando o retorno é omisso, normalmente 'int' é assumido pelos compiladores.

Zé da Moca Escreveu:Quando é que "classificamos" as funções

Não percebi.

Zé da Moca Escreveu:...e exactamente quando é usamos o return=0.

return=0, nunca :p
Agora return 0, quando queres retornar da função, ie, quando queres que e execução da função pare nesse ponto e a execução do programa prossiga onde esta foi chamada...

Zé da Moca Escreveu:A outra coisa que me esta a picar, pk é que se usa void main(void)?? ja sei que o primeiro void indica uma função que n vai retornar valores/calculos agora o void dentro de parentesis!!!! Sei que tem a ver com os argumentos da função, mas um argumento nulo??? que é isso?


main(void) ou funcao_qualquer(void) NÃO significa que o argumento é nulo, mas sim que a função não recebe parâmetros.

Pode haver é muitas situações em que os argumentos passados em execução sejam nulos. Ex:

void funcao(int *param){
if(param != NULL){
printf("%d",*param);
}

int * ponteiro_inteiro = NULL;

funcao(ponteiro_qualquer);

Agora, coisas como: funcao(int a, int b, char c, float f) nunca vao a NULL (pelo menos no sentido que lhe estás a dar, uma vez que em C NULL não é mais que uma 'mascara' para o 0 (zero):p )
vamosAeles
Membro de Prata
Membro de Prata
 
Mensagens: 206
Registado: Quarta Jan 04, 2006 21:29
Localização: Lisboa/Proença

Mensagempor Zé da Moca » Quinta Fev 14, 2008 18:10

boas pessoal, ca venho eu requerer mais uma vez a vossa sábia atenção.

1 - é o seguinte, tenho test online em que m perguntam se:

Os ciclos while e do while incrementam automáticamente a varável de controlo?? eu respondo não mas dá-me errado...

2 - sabendo que a variavel z=7 que significa !z? qual o seu valor?
na correcção dá-me 7... pk???

3 - num ciclo for(i=1; i<=20;i+=2) o i+=2 quer dizer o k, que incrementa de 2 em dois?

4 - considerando a instrução extern int idade=20 dentro da função Abc() esta é válida ou não??


Desculpem la o abuso, mas tenho um exame de c amanhã, sai esta matéria e as questões que coloco foram as que de um exame tipo que o stor nos colocou eu n consegui reolver ou tenho duvidas da sua resolução ja que a correcção desse msm exame foi-me dada por uma colega.
SmoKe another PiPE
Zé da Moca
Aprendiz
Aprendiz
 
Mensagens: 77
Registado: Quinta Mar 02, 2006 9:24

Próximo

Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 0 visitantes

cron