Ir ao conteúdo
  • Cadastre-se

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


jcgs98
Ir à solução Resolvido por isrnick,

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Solução
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!