Ir ao conteúdo

[Resolvido]Problemas e Duvida num programa em C q fiz.


Joee

Posts recomendados

Postado

È o seguinte pessoal, eu fiz um programa simples aqui, mas que nao estou entendendo muito a logica do mesmo, No programa, eu iria criar um vetor de 5 posições(num[4]), para ser preenchido pelos numeros digitados pelo usuário, caso o usuario quisesse parar de preencher-los, ele digitaria no caso a flag: '-999', para sair do loop, ou caso ele digitasse mais q 5 numeros, o proprio programa se encarregaria de sair do loop. O problema tá no fato q o "if(cont<4)", só deveria aceitar até 4 loops, no caso no meu programa está fazendo 5 loops e tem outro detalhe, caso eu tire o comando if do meu programa e deixo o usuario digitar quantos numeros ele quiser, quando o usuario digita a flag para sair do programa só aparece o primeiro printf, o segundo printf q era para mostrar os numeros digitados nao é impresso. Enfim, gostaria q alguém me desse alguma luz sobre esse assunto. De qualquer forma, o meu codigo é esse aqui:


#include <stdlib.h>
int main()
{
int num[4],i=0,totalnum,cont=0;
do{
printf("Digite um numero: <digite -999 para sair>");
scanf("%i",&num[i]);
i++;
cont++;
if(cont>4)
break;
}while(num[i-1]!=-999);
totalnum=num[i-1];
printf("\n\nOs numeros digitados são:\n");
for(i=0;i<totalnum;i++)
printf("\n%i\n",num[i]);
system("PAUSE");
return (0);
}
#include <stdio.h>

Postado

Salve, Joee.

Acho que o problema é na declaração do vetor.

Se você vai declarar um vetor de N posições, você precisa declarar realmente um vetor de N posições. No seu caso, se o vetor é de 5 posições, então você deve declará-lo com 5 posições:

int num[5];

Os ÍNDICES desse vetor é que vão de ZERO à 4 [0..4], mas, na memória, é um vetor de 5 posições.

Experimenta esta troca. Acho que o restante do código está correto.

[]'s

Postado
Salve, Joee.

Acho que o problema é na declaração do vetor.

Se você vai declarar um vetor de N posições, você precisa declarar realmente um vetor de N posições. No seu caso, se o vetor é de 5 posições, então você deve declará-lo com 5 posições:

int num[5];

Os ÍNDICES desse vetor é que vão de ZERO à 4 [0..4], mas, na memória, é um vetor de 5 posições.

Experimenta esta troca. Acho que o restante do código está correto.

[]'s

Po então, o programa esta funcionando corretamendo quando o proprio programa interrompe o loop com o break q eu fiz, já quando o usuario digita o flag para sair do loop, o programa nao imprime o ultimo printf q seria o de mostrar os numeros q o usuario digitou, ele suprime esse printf, nao sei porque, nao sei se é erro meu, ou bug do dev. E outra, qual a diferença entre 'exemplo++' e '++exemplo'?? E outro detalhe, no meu programa eu usei o cont=0, então, para se fazer um loop de 5 vezes no caso, eu coloco condição o (cont>4), nao é??? Daeee se eu colocasse no caso, o cont=1, daee sim eu colocaria a condição como (cont>5) para ele dar 5 loops, porque segundo a minha logica, se você começa com o cont=0, o programa vai começar como loop de "0-1-2-3-4", q no caso vai fazer 5 loops, se começar com cont=1, o programa ira fazer: "1-2-3-4" iria fazer 4 loops apenas na condição (cont>4).

Postado

#include <stdio.h>

#include <stdlib.h>

int main()

{

int num[4],i=0,totalnum;

static int cont=0;

do{

cont++;

printf("Digite um numero: <digite -999 para sair>");

scanf("%i",&num);

i++;

if(cont>=4)

break;

}

while(num[i-1]!=-999);

totalnum=cont-1;

printf("\n\nOs numeros digitados são:\n");

for(i=0;i<totalnum;i++)

printf("\n%i\n",num);

system("PAUSE");

return (0);

}

para a condição do if ser verdadeira o loop tem que "loopar" 5 vezes, pois quando era "variavel == 4" ainda era falso, então modifique para ">=4 || >3"

  • Membro VIP
Postado
Po então, o programa esta funcionando corretamendo quando o proprio programa interrompe o loop com o break q eu fiz, já quando o usuario digita o flag para sair do loop, o programa nao imprime o ultimo printf q seria o de mostrar os numeros q o usuario digitou, ele suprime esse printf, nao sei porque, nao sei se é erro meu, ou bug do dev.

E outra, qual a diferença entre 'exemplo++' e '++exemplo'?? E outro detalhe, no meu programa eu usei o cont=0, então, para se fazer um loop de 5 vezes no caso, eu coloco condição o (cont>4), nao é??? Daeee se eu colocasse no caso, o cont=1, daee sim eu colocaria a condição como (cont>5) para ele dar 5 loops, porque segundo a minha logica, se você começa com o cont=0, o programa vai começar como loop de "0-1-2-3-4", q no caso vai fazer 5 loops, se começar com cont=1, o programa ira fazer: "1-2-3-4" iria fazer 4 loops apenas na condição (cont>4).

Olá amigo, tudo bem? Eu encontrei um erro no seu código(além do já comentado por Maurício2006). Observe a linha destacada em vermelho mais abaixo:


#include <stdlib.h>
int main()
{
int num[4],i=0,totalnum,cont=0;
do{
printf("Digite um numero: <digite -999 para sair>");
scanf("%i",&num[i]);
i++;
cont++;
if(cont>4)
break;
}while(num[i-1]!=-999);
[COLOR=Red]totalnum=num[i-1];[/COLOR]
printf("\n\nOs numeros digitados são:\n");
for(i=0;i<totalnum;i++)
printf("\n%i\n",num[i]);
system("PAUSE");
return (0);
}
#include <stdio.h>

No caso você disse que o valor de totalnum é o valor do último elemento inserido no array, ou seja, se a pessoa digitar 500, seria como se houvesse 500 elementos no array, então quando a pessoa digita -999 pra sair do primeiro loop, a condição do segundo loop não é satisfeita, já que i<-999(o valor de totalnum), então para corrigir isto tente usar:

totalnum=cont;

Quanto à sua dúvida do 'exemplo++' e '++exemplo', é bem simples. No primeiro caso ele faz as operações a serem feitas e só depois incrementa, no segundo o incremento ocorro primeiro, e depois são feitas as operações.

Por exemplo, se for um printf com o seguinte código:


int exemplo = 0;
printf("%d\n",++exemplo);
int exemplo = 0;
printf("%d\n",exemplo++);

Será impresso na tela:

1

0

Isso porque no primeiro caso ele primeiro incrementou a variável antes de realizar a impressão, e no segundo caso primeiro foi feita a impressão, e depois a variável foi incrementada. O mesmo vale no caso de um loop, se você ao invés de usar

for(i=0;i<totalnum;i++)

usasse

for(i=0;i<totalnum;++i)

Aconteceria o seguinte: a primeira verificação do loop seria com i = 1 e não com i = 0, então o primeiro elemento do array seria pulado. Logo, tome cuidado com essas diferenças.

Quanto à sua segunda dúvida, acho que você quis dizer (cont<4) ou (cont<5), e sim, a ideia basicamente é esta que você disse.

Abraço.

Postado

valeu pelas explicações Golithvv, entendi td!!! agora detalhe, eu fiz lá a substituição e coloquei o cont, só q agora o programa finalmente mostrou o ultimo printf, só q no caso tá louco!!!, tipo, eu coloquei esses numeros de entrada: 1,2 e -999 para sair do loop.

O programa imprimiu como saída tais numeros:

1

2

-999

37814108

2009263717

Eu desconfio q os 2 ultimos numeros sejam os endereços na array, mas endereço de q??? E como se faz para suprimir esse "-999"???? Poutz, esse programinha ta complicado!! abraço!

Postado
#include <stdio.h>

#include <stdlib.h>

int main()

{

int num[4],i=0;

static int cont=0;

do{

cont++;

printf("Digite um numero: <digite -999 para sair>");

scanf("%i",&num);

i++;

if(cont>=4)

break;

}

while(num[i-1]!= -999);

printf("\n\nOs numeros digitados são:\n");

for(i=0;i<cont;i++)

{

if(num == -999)

break;

printf("\n%i\n",num);

}

system("PAUSE");

return (0);

}

Reformulei sem mais galhos, "eu acho!":D

Postado
Reformulei sem mais galhos, "eu acho!":D

EDITADO- é melhor colocar o i++ e o c++ juntos, um embaixo do outro, pra nao se enrolar, porque qual razao tu vai querer incrementar um na frente de outro??? é melhor incrementar os 2 juntos.

Postado

Fiz aqui o programa e deu td certo, tá aee:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int num[5],i=0,cont=0,tnum;
do{
printf("Digite um numero: <digite -999 para sair>");
scanf("%i",&num[i]);
cont++;
i++;
if(cont>=5)
break;
}while(num[i-1]!=-999);
printf("\n\nOs numeros digitados sao:\n");
if(num[i-1]==-999){
tnum=cont-1;
for(i=0;i<tnum;i++)
printf("\n%i\n",num[i]);
}
else{
tnum=cont;
for(i=0;i<tnum;i++)
printf("\n%i\n",num[i]);
}
system("PAUSE");
return (0);
}

:)

Postado

A logica do programa foi simples, num if eu suprimi a ultima posição, já q essa teria sido a flag de saída(-999) e no else eu nao suprimi nada, ja q o usuario nao teria usado nenhuma flag de saida e sim o proprio programa q se encarregou de sair do loop.

Postado
Interessante como tu fez, tu usou o break quando o numero fosse -999, e assim fez com q ele nao fosse imprimido na tela, só uma duvida, porque tu usou o cont++ no inicio e nao no fim??? qual a diferença??? Acho q a diferença, é pra nao ter q usar o num[i-1](posição anterior), ja q com o cont++ em cima, ele nao incremetaria e portanto nao seria preciso localizar a posição anterior, certo??

EDITADO- é melhor colocar o i++ e o c++ juntos, um embaixo do outro, pra nao se enrolar, porque qual razao tu vai querer incrementar um na frente de outro??? é melhor incrementar os 2 juntos.

a principio e pensei em uma outra alternativa que seria necesario modificar a ordem de atribuição(exatamente o que você penssou), mas depois eu descartei a possibilidade mas deixei o cont++ por que eu esqueci de descer:wacko::wacko:.

você quis dizer cont++ e i++ ,certo? rsrs

Postado
a principio e pensei em uma outra alternativa que seria necesario modificar a ordem de atribuição(exatamente o que você penssou), mas depois eu descartei a possibilidade mas deixei o cont++ por que eu esqueci de descer:wacko::wacko:.

você quis dizer cont++ e i++ ,certo? rsrs

Sim, isso!^_^

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!