Jump to content
  • 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

Recommended Posts

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

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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;
       }
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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;
}

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Edited by Dexter's Lab

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
    }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.