Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dexter's Lab

Ponteiros e passagem por referência

Mensagens Recomendadas

Dexter's Lab

Boas,

estou a dar ponteiros na escola. Apesar de já ter uma ideia, ainda me confundem um pouco, nomeadamente na passagem por referência.

Alguém me pode dizer porque o output está errado?

#include <stdio.h>

/*65) Faca um programa que calcule o produto de 2 numeros inteiros lidos (num1 e num2) atraves do metodo de somas sucessivas.
Suponha que num1 e num2 sao positivos. Exemplo:
Valores lidos: 3 4
Saída do programa: 12
Dica: 3 x 4 = 3 + 3 + 3 + 3 = 12*/

void SOMAS_SUCESSIVAS(int *num1, int *num2);

int main (void) {
int a, b;

printf ("NUM1: "); scanf("%d", &a);
printf ("NUM2: "); scanf("%d", &b);

printf("%d\n", a);

SOMAS_SUCESSIVAS(&a, &b);

printf("%d", a);

getch();
return 0;
}
void SOMAS_SUCESSIVAS(int *num1, int *num2)
{
int cont;

for (cont = 0; cont <= (*num1) * (*num2); cont++) {
    *num1 += *num1;
    }
}

Agradeço a atenção

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

Resolvido! Obrigado pela chamada de atenção, HHHippo.

Se puderes chatear-me com este código (o que posso melhorar, tal como a validação do scanf - que não sei bem como fazê-la) agradecia imenso. O meu objetivo é aprender.

#include <stdio.h>
/*65) Faca um programa que calcule o produto de 2 numeros inteiros lidos (num1 e num2) atraves do metodo de somas sucessivas.
Suponha que num1 e num2 sao positivos. Exemplo:
Valores lidos: 3 4
Saída do programa: 12
Dica: 3 x 4 = 3 + 3 + 3 + 3 = 12*/
int SOMAS_SUCESSIVAS(int *num1, int *num2);
int main (void) {
   int a, b;

   printf ("NUM1: ");  scanf("%d", &a);
   printf ("NUM2: ");  scanf("%d", &b);

   printf("%d\n", a);

   SOMAS_SUCESSIVAS(&a, &b);

   printf("%d", a);

   getch();
   return 0;
}
int SOMAS_SUCESSIVAS(int *num1, int *num2)
{
   int cont;
   int produto = (*num1) * (*num2);

   for (cont = 0; *num1 < produto; cont++) {
       *num1 += *num1;
       }
}

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

... validação do scanf ...

A funcao scanf() devolve um valor.

Para validares o que o scanf() fez, usa esse valor devolvido.

O valor devolvido representa, basicamente, o numero de variaveis as quais foi atribuido um valor. No teu caso, como cada scanf() afecta apenas uma variavel, o valor nao pode ser maior que 1.

Se for 1 => esta tudo correcto

Se for 0 => algo estranho aconteceu

Se for < 0 (EOF) => o input terminou antes de qualquer atribuicao

Um exemplo, para perceberes melhor:

if (scanf("%d%d%d", &i, &j, &k) == 3) {
   /* ok */
} else {
   /* erro */
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

na realidade não estás a fazer "exactamente" como o pedido no enunciado

é certo que o resultado é o correcto, mas filosóficamente não é o pedido:

for (cont = 0;
    cont < *num2; // para 3*4 => 3+3+3+3 => 4 somas => cont de 0 até 3 => {0, 1, 2, 3} 
    cont++)
{
 *num1 += *num1;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Na tua segunda listagem do codigo alteraste as asinaturas da funcao SOMAS_SUCESSIVAS() de forma para que retorna-se um inteiro, e nao o estas a fazer! Apesar do C permitir que uma funcao que retorne um inteiro omita a instrucao return considero uma ma pratica omiti-lo. E apesar da tua funcao SOMAS_SUCESSIVAS() nao ser complexa recomendava-te continua-se com a mesma assinatura e retornasses 0 em caso de sucesso e um valor maior que 0 em caso de sucesso.


Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

Ola pessoal, já tinha corrigido os erros mas hoje decidi retificar todos os programas que escrevi das duas ultimas semanas e percebi que algo estava mal:

void SOMAS_SUCESSIVAS(int *num1, int *num2)
{
int cont;
for (cont = 1; cont <= *num2; cont++) {
	*num1 += *num1;
	}
}

Ora, por lógica isto parece-me bem, mas o output não está correto, (input 2, 4 - output 32).

Já pus parentesis pela hipótese de serem os asteriscos que estivessem a prejudicar na soma (embora me fosse improvavel), mas como de esperado, dá a mesma coisa.

Ando um bocado cansado nos últimos tempos, e estes erros de distração estão cada vez mais frequentes. Por isso peço desculpa pela desatenção

Editado por Dexter's Lab

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

vou desenrolar o teu código for para o exemplo de 2, 4

void SOMAS_SUCESSIVAS(int *num1, int *num2)
{
 int cont;

 cont = 1;              // inicialização do ciclo "for"

 // verificação da primeira iteração do ciclo
 // >>> cont <= *num2 >>> 1 <= 4
 if (!(cont <= *num2))
   return
 // incremento do valor de num1
 // >>> *num1 += *num1 >>> *num1 += 2 >>> *num1 = 2 + 2 >>> *num1 = 4
 *num1 += *num1;
 // execução das instruções finais do ciclo "for"
 // >>> cont += 1 >>> cont = 1 + 1 >>> cont = 2
 cont++;

 // verificação da segunda iteração do ciclo
 // >>> cont <= *num2 >>> 2 <= 4
 if (!(cont <= *num2))
   return
 // incremento do valor de num1
 // >>> *num1 += *num1 >>> *num1 += 4 >>> *num1 = 4 + 4 >>> *num1 = 8
 *num1 += *num1;
 // execução das instruções finais do ciclo "for"
 // >>> cont += 1 >>> cont = 2 + 1 >>> cont = 3
 cont++;

 // verificação da terceira iteração do ciclo
 // >>> cont <= *num2 >>> 3 <= 4
 if (!(cont <= *num2))
   return
 // incremento do valor de num1
 // >>> *num1 += *num1 >>> *num1 += 8 >>> *num1 = 8 + 8 >>> *num1 = 16
 *num1 += *num1;
 // execução das instruções finais do ciclo "for"
 // >>> cont += 1 >>> cont = 3 + 1 >>> cont = 4
 cont++;

 // verificação da quarta iteração do ciclo
 // >>> cont <= *num2 >>> 4 <= 4
 if (!(cont <= *num2))
   return
 // incremento do valor de num1
 // >>> *num1 += *num1 >>> *num1 += 16 >>> *num1 = 16 + 16 >>> *num1 = 32
 *num1 += *num1;
 // execução das instruções finais do ciclo "for"
 // >>> cont += 1 >>> cont = 4 + 1 >>> cont = 5
 cont++;

 // verificação da quarta iteração do ciclo
 // >>> cont <= *num2 >>> 5 <= 4
 if (!(cont <= *num2))
   return

 // sai no último "if"
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

Obrigado, HHHippo.

void SOMAS_SUCESSIVAS(int *num1, int *num2)
{
   int cont, temp = *num1;
   for (cont = 1; cont < (*num2); cont++) {
    *num1 += temp;
    }
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.