Ir ao conteúdo

C Funçao com ponteiros, vetores, laços e condicionais. FAETERJ. 2018. FAC. AV2.


Ir à solução Resolvido por isrnick,

Posts recomendados

Postado

Boa tarde!

 

Poderiam me ajudar com a questão abaixo?

 

Fiz o código, funcionou, mas não gostei dele.

 

Como poderia ficar melhor?

 

Por exemplo:

 

Como parar assim que digitar "agência 0"?

 

Como fazer para não precisar colocar "agencia =1"?


Obrigado!

 

 

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

int somaAl (int num)
{
int t=0;
while ( num > 0){
t+=num%10;
num=num/10;
}
return t;
}


void calcDigitos(int *conta, int *agencia, int *dig1,int *dig2)
{
int i,age=1, n1;
int cta, n2;

printf("\nDigite a agencia:.... ");
scanf("%d",&age);

n1=somaAl (age);
*agencia=age;

printf("\nDigite a conta:...... ");
scanf("%d",&cta);

n2=somaAl (cta);
*conta=cta;

if(n1>n2)
{
*dig1=n1%9;
*dig2=n2%6;
}
else
if(n2>n1)
{
*dig1=n1%9;
*dig2=n2%7;
}
else
{
*dig1=n1%3;
*dig2=n2%5;
}

}


int main(void)
{
int agencia=1, dig1;
int conta, dig2;

while (agencia!=0)
{
calcDigitos(&conta,&agencia,&dig1,&dig2);

printf("\nAgencia:............. %d - %d",agencia,dig1);
printf("\nConta:............... %d - %d",conta,dig2);
}
return 0;
}

IMG_20181213_102021.jpg.f032ae0c365f1bcd2e36399929beba53.jpg

Postado

Não deveria pedir para o usuário digitar agência e conta dentro da função calcDigitos, como seu nome sugere ela deve apenas calcular os dígitos, nesse caso os valores da agência e conta seriam enviados via parâmetro para a função.

 

Assim esta leitura de dados digitados pelo usuário ficaria no main, e aí bastaria fazer um ciclo que continua rodando até o valor da agência digitado ser igual a 0.

adicionado 5 minutos depois
3 horas atrás, jcgs98 disse:

Como fazer para não precisar colocar "agencia =1"?

 

Em C qualquer valor diferente de 0 (zero) é VERDADEIRO, e o valor zero é igual a FALSO.

 

Sabendo dessa propriedade seria possível por exemplo fazer uma verificação assim:

if (agencia) {
    printf("Agencia eh diferente de 0 = VERDADEIRO\n");
}
else {
    printf("Agencia eh igua a 0 = FALSO\n");
}

(Isso é só um exemplo não é uma sugestão para o seu código.)

  • Curtir 1
Postado

Como isrnick sugeriu, lenha os dados fora da função

 

int main(void)
{
int agencia, dig1;
int conta, dig2;

while (1) // Loop infinito
{
//Botar aqui código para ler dados de entrada
if (!agencia) break; //se agencia == 0 sai do laço neste ponto
calcDigitos(&conta,&agencia,&dig1,&dig2);

printf("\nAgencia:............. %d - %d",agencia,dig1);
printf("\nConta:............... %d - %d",conta,dig2);
}
return 0;
}

 

  • Curtir 1
Postado

Eu sei, mas a professora exigiu que fosse na função.

adicionado 3 minutos depois

IMG_0172.JPG

adicionado 8 minutos depois

@isrnick Se eu não colocar "age=1", o while (agencia!=0) vai encerrar antes de começar.

Postado
21 minutos atrás, jcgs98 disse:

Eu sei, mas a professora exigiu que fosse na função.

adicionado 3 minutos depois

IMG_0172.JPG

 

Pela imagem ela exigiu que a somaAlg fosse calculada na função, não que os scanfs estivessem dentro da função. No seu código a soma está no lugar correto. Eu indiquei que a leitura dos dados é que não deveria estar dentro da função.

 

24 minutos atrás, jcgs98 disse:

@isrnick Se eu não colocar "age=1", o while (agencia!=0) vai encerrar antes de começar.

Não encerra não, o scanf para obter o valor inicial de agencia deve vir antes de fazer a primeira comparação para checar se agencia!=0 .

  • Curtir 1
Postado
6 minutos atrás, isrnick disse:

 

Pela imagem ela exigiu que a somaAlg fosse calculada na função, não que os scanfs estivessem dentro da função.

 

 

Será????

adicionado 3 minutos depois
6 minutos atrás, isrnick disse:

 

Não encerra não, o scanf para obter o valor inicial de agencia deve vir antes de fazer a primeira comparação para checar se agencia!=0 .

Se eu não fizer "age=1" acontece isso:

 

Capturar.PNG

  • Solução
Postado
24 minutos atrás, jcgs98 disse:

Será????

 

Sim, tem uma linha vermelha apontando para o somaAl, não para o scanf... E fazer a soma na função faz sentido.

adicionado 9 minutos depois
24 minutos atrás, jcgs98 disse:

Se eu não fizer "age=1" acontece isso:

 

Como falei se o scanf estiver fora da função você pode fazer um scanf para obter o primeiro valor de agência antes do while por exemplo...

 

int main(void)
{
    int agencia, dig1;
    int conta, dig2;
   
    printf("\nDigite a agencia:.... ");
    scanf("%d",&agencia);

    while (agencia!=0)
    {
        printf("\nDigite a conta:...... ");
        scanf("%d",&conta);
        
        calcDigitos(conta,agencia,&dig1,&dig2);

        //...código que imprime os resultados aqui...
  
        printf("\nDigite a agencia:.... ");
        scanf("%d",&agencia);
    }
    
    return 0;
}

 

 @jcgs98 Outra opção seria fazer um loop infinito e interromper com um break como o  @Flávio Pedroza indicou.

  • Curtir 1
Postado
12 minutos atrás, isrnick disse:

Como falei se o scanf estiver fora da função você pode fazer um scanf para obter o primeiro valor de agência antes do while por exemplo...

Sim, achei que tivesse outro jeito para não ter que repetir as linhas no código.

Pelo que vocês falaram, o código ficaria assim:

#include <stdio.h>


int somaAl (int num){
int t=0;
while (num>0){
t+=num%10;num=num/10;
}return t;}


void calcDigitos(int conta, int agencia, int *dig1,int *dig2){

int n1,n2;

n1=somaAl(agencia);n2=somaAl(conta);

if(n1>n2){
*dig1=n1%9;*dig2=n2%6;
}
else
if(n2>n1){
*dig1=n1%9;*dig2=n2%7;
}
else{
*dig1=n1%3;*dig2=n2%5;}}


int main(void){
	
int agencia, dig1, conta, dig2;

	printf("\nDigite a agencia:.... ");
	scanf("%d",&agencia);

while (agencia!=0){
	
	printf("\nDigite a conta:...... ");
	scanf("%d",&conta);	

	calcDigitos(conta,agencia,&dig1,&dig2);

	printf("\nAg: %d-%d cta: %d-%d\n\n",agencia,dig1,conta,dig2);
	
	printf("\nDigite a agencia:.... ");
	scanf("%d",&agencia);
	
}return 0;}

Os ponteiros estão corretos?

  • Curtir 1
Postado
10 minutos atrás, jcgs98 disse:

Os ponteiros estão corretos?

 

Sim.

 

11 minutos atrás, jcgs98 disse:

Sim, achei que tivesse outro jeito para não ter que repetir as linhas no código.

Pelo que vocês falaram, o código ficaria assim:

 

25 minutos atrás, isrnick disse:

 

 @jcgs98 Outra opção seria fazer um loop infinito e interromper com um break como o  @Flávio Pedroza indicou.

 

Do modo como o @Flávio Pedroza  indicou não repete linhas de código.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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