Ir ao conteúdo

Posts recomendados

Postado

Ola, sou iniciante em linguagem C, estou com um trabalho da faculdade para fazer, coloquei esses printf no meu codigo para debuggar, porém gostaria de saber porque o programa nao volta pro primeiro while sendo que a condicao de parada nao foi satisfeita.

 

Desde já agradeço a atencao dos senhores!

 

ENUNCIADO:

Trabalho Pratico 1 - União dos Bancos
Com a modernizacão dos sistemas bancários, é possível realizar transações financeiras de
maneira simples pela Internet. Geralmente cada banco recebe um código de identicação
que é utilizado pelos sistemas bancários.
Uma característica comum no mercado financeiro é a fusão de bancos, onde dois bancos
tornam-se um só. Logo, para manter a compatibilidade dos sistemas bancários
qualquer um dos códigos antigos pode ser utilizado para se referir ao novo banco. Como o
processo de fusão tem sido cada vez mais comum, muitas vezes é difícil identificar se dois
códigos estão se referindo ao mesmo banco ou não.
Tarefa
Escreva um programa que, dada uma série de fusões entre bancos, responde a várias
consultas informando se dois códigos bancários se referem ao mesmo banco.
Entrada
A primeira linha da entrada contém dois inteiros N e K, indicando o número de bancos
e o número de operações efetuadas (1 N 100:000, 1 K 100:000). Os códigos de
cada um dos N bancos, inicialmente, s~ao os inteiros de 1 até N.
Cada uma das K linhas seguintes descreve ou uma fus~ao entre bancos ou uma consulta.
• Uma fusão é descrita na entrada como uma linha que começa com o caractere `F', um
espaço, e dois códigos bancários, que se referem aos dois bancos que estão sofrendo
a fusão, separados por um espaço em branco;
• Uma consulta é descrita na entrada como uma linha que começa com o caractere
`C', um espaço, e os dois códigos a serem consultados, separados por um espaço em
branco. Os códigos bancários consultados são sempre distintos.
As fusões são sempre realizadas entre bancos diferentes, e todos os códigos bancários
fornecidos na entrada são válidos. A leitura da entrada deve parar quando N = 0 e
K = 0.
Exemplo de Entrada
3 5
C 1 2
F 1 2
C 1 2
F 1 3
C 1 3
4 5
F 1 2
F 2 3
C 1 3
F 2 4
C 1 4
4 4
F 1 2
F 3 4
F 1 3
C 2 4
0 0
Saída
Seu programa deve imprimir uma linha para cada consulta na entrada. Caso os dois
códigos bancários consultados se refiram ao mesmo banco, imprima uma linha contendo o
caractere `S'; caso contrário, imprima uma linha contendo apenas o caractere `N'. Ao final
das K consultas, imprima uma linha em branco. Não é necessário identificar cada
saída com `Teste i'.
Exemplo de Saída:
N
S
S


S
S


S
(esta saída corresponde ao exemplo de entrada acima)

 

//Trabalho_1

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

void adicionaFinalVetor(int vetor[],const int tamanho,int x){
    int *ponteiro;
    int *finalVetor = vetor+tamanho;
    int *aux= finalVetor++;
    *aux = x;
}

int existe(int vetor1[],int vetor2[],const int tamanho,int entrada1,int entrada2){
    int *ponteiro1,*ponteiro2;
    int *final1 = vetor1+tamanho;
    int *final2 = vetor2+tamanho;
    ponteiro1 = vetor1;
    ponteiro2 = vetor2;
    while(ponteiro1 < final1 && ponteiro2 < final2){
        if((*ponteiro1 == entrada1 && *ponteiro2 == entrada2) || (*ponteiro1 == entrada2 && *ponteiro2 == entrada1)){
            return 1;
        }
        ponteiro1++;
        ponteiro2++;
    }
    return 0;
}

int main(){

    int n=1,k=1;
    char saida[10000] = "\0";
    while((n!= 0) && (k!= 0)){
        printf("entra no primeiro while \n");
        scanf("%d %d",&n,&k);
        printf("n = %d k = %d \n",n,k);
        int fusao1[10000],fusao2[10000];
        int tamanho=0;
        while(k !=0){
            printf("entra segundo while \n");
            int banco1,banco2;
            char operacao[2];
            scanf("%s %d %d", &operacao,&banco1,&banco2);
            printf("op = %s \n", operacao);
            if(operacao[0] == 'F'){
                printf("banco1 = %d, banco2 = %d \n",banco1,banco2);
                adicionaFinalVetor(fusao1,tamanho,banco1);
                adicionaFinalVetor(fusao1,tamanho,banco2);
                tamanho++;
            }
            if(operacao[0] =='C'){
                printf("banco1 = %d, banco2 = %d \n",banco1,banco2);
                if(existe(fusao1,fusao2,tamanho,banco1,banco2) == 1){
                    strcat(saida,"S");
                }else{
                    strcat(saida,"N");
                }
            }
        k--;
        printf("k = %d \n",k);
        }
        strcat(saida,"\n");
        printf("n = %d",n);
    }
    printf("%s",saida);
    system("pause");
    return 0;
}

 

adicionado 41 minutos depois

RESOLVI!!

era apenas um and que devia ser or =s.

  • Curtir 1
  • Amei 1
Postado

@Cortella    isso mesmo , eu também uso esse método para testar o código , e esse código não está voltando para o primeiro while porque quando ele entra no segundo while a variável k vai decrescendo e recebe o valor zero , assim ele passa pelo segundo while , e como a variável k tem agora o valor zero a condição para sair do primeiro while é essa e ele termina o programa . então para que volte para o primeiro while , volte o valor da variável k para 1;

          }else{
                    strcat(saida,"N");
                }
            }
        k--;
        printf("k = %d \n",k);
        }
        k=1;/* <--- aqui oh ! */
        strcat(saida,"\n");
        printf("n = %d",n);
    }

 

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