Jump to content

Ponteiros e passagem por referência


Dexter's Lab
 Share

Recommended Posts

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

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

... 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!

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

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.

Link to comment
Share on other sites

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
Link to comment
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
Link to comment
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
 Share

×
×
  • Create New...

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.