Ir ao conteúdo
  • Cadastre-se

C Dois menores números de um arquivo em c


muh.prog

Posts recomendados

Estou em duvida de como conseguir tirar os dois menores numeros de um arquivo em c , até acabei conseguindo mas após varias verificações comecou a ter falhas , alguem pode ajudar ?

só consegui isso até agora

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main() {
    setlocale(LC_ALL, "Portuguese");
    FILE *fp; 
    int duracao;
    int menor1=1,menor2=0;
    
        fp=fopen("Maq1.log", "r");     
        if(fp == NULL){
        printf("Erro ao abrir arquivo.");
        return 1;
        }
        
    while(!feof(fp)){
    fscanf(fp, "%i", &duracao);

        
    
       }
    }
     printf("%i , %i ",menor1,menor2);

      fclose(fp);
       return 0;
 }

 

Link para o comentário
Compartilhar em outros sites

@muh.prog O fluxo de entrada do aquivo está aberto e pronto?

 

Basta ler dois dados inicialmente A e B para servir de base no ciclo de verificações, antes de começar o clico verificamos qual de dois valores nas variáveis é o menor e ordenamos eles A > B então troque os valores delas.

Se A > B: TMP= A, A= B, B= A

 

No corpo do clico de leitura aplicamos a mesma lógica, mas acrescida de mais um termo; dessa vez o NOVO valor pode ser menor que A então caso isso se confirme passamos para o B o valor de A, e A recebe o NOVO. Se não é menor que  A ainda é possível que seja menor que B então testamos para B e trocamos de valor se confirma  menor que  B.

lógica para o ciclo:

SE NOVO < A: B= A, A= NOVO
SENAO_SE NOVO < B: B= NOVO

 

Parece óbvio notarmos que A sempre tem o menor valor, e B o vice-menor para todo Novo valor menor em A

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

A, B são nomes genéricos que no contexto de teu programa são: menor1, menor2, respectivamente. Suponho que os dados no arquivo  Maq1.log  estão codificados sobre texto e de conteúdo formatado num seguimento de números inteiros separados por espaço, como uma lista de números inteiros.

 

Antes precisa estabelecer o fluxo de comunicação entre arquivo e o programa.

 

FILE *fp= fopen("Maq1.log", "r");     
if (fp == NULL) {
        printf("Erro ao abrir arquivo.");
        return 1;
}

Penso que   Maq1.log   está na mesma pasta que o programa, pois essa é condição única para abrir fluxo apenas com nome no parâmetro   filename   da função fopen.

 

 

Agora que tem comunicação com os dados vamos pegar dois números (menor1, menor2).

FILE *fp= fopen( "Maq1.log", "r" );     
if (fp == NULL) {
        printf("Erro ao abrir arquivo.");
        return 1;
}
int menor1= 0, menor2= 0;
if (2 > fscanf( fp, " %d%d", &menor1, &menor2 )) {
        puts( "..." ); //<--- Mensagem para alertar de uma falha que impediu
                       //     a leitura de dois inteiros, inicialmente.
        return 1;
}
//...

Abaixo aplique o que tentei explicar-te...

 

2 horas atrás, mauro_b disse:

Basta ler dois dados inicialmente A e B para servir de base no ciclo de verificações, antes de começar o ciclo verificamos qual de dois valores nas variáveis é o menor e ordenamos eles A > B então troque os valores delas.

 

Se A > B: TMP= A, A= B, B= A

 

Depois prepare para fazer o mesmo com “loop” de leituras.

 

 

2 horas atrás, muh.prog disse:

mas como faço para definir estas 2 variaveis ?

 

ou como aplicar na prog

 

Caso sinta muita dificuldade de faze-lo é porque não entendeu essa lógica. Tudo bem! Outros membros fórum discutirão mais lógicas e de outras formas mais fáceis de fazer entender.

 

No aguardo.

 

 

 

Link para o comentário
Compartilhar em outros sites

ficaria assim ?

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

int main() {
    setlocale(LC_ALL, "Portuguese");
    FILE *fp; 
    int duracao;
    int i=0;    
        fp= fopen( "Maq1.log", "r" );     
        if (fp == NULL) {
        printf("Erro ao abrir arquivo.");
        return 1;
            }
            int menor1= 0, menor2= 0;
            if (2 > fscanf( fp, " %d%d", &menor1, &menor2 )) {
                puts( "nao consegue " ); //<--- Mensagem para alertar de uma falha que impediu
                     
}
    while(!feof(fp)){
    fscanf(fp, "%i",&duracao);
        if(menor1>menor2){
            duracao=menor1;
            menor1=menor2;
            menor2=menor1;
        }
            }
    }

          printf("%i\n",menor1);

      fclose(fp);
       return 0;
 }        
 

Link para o comentário
Compartilhar em outros sites

Depois que lê menor1 e menor2, é preciso garantir que o valor em menor1 < menor2

Aplique a lógica

SE A > B:
         TMP= A
         A= B
         B= TMP

Assim garante que os valores em (menor1 e menor2) estão em ordem crescente (do menor para vice-menor)

 

Dentro do ciclo verifique com a mesma lógica aplicada a um novo valor

while (!feof(fp)) {
		fscanf(fp, "%i",&duracao);
		SE A > duracao:
			B= A
			A= duracao;
               
		SENAO_SE B > duracao:
			B= duracao;
}

 

Link para o comentário
Compartilhar em outros sites

//a) Qual as duas operações que tiveram maior duração e que terminaram sem erro?

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

int main() {
    setlocale(LC_ALL, "Portuguese");
    FILE *fp; 
    int duracao;
    int i=0;    
        fp= fopen( "Maq1.log", "r" );     
        if (fp == NULL) {
        printf("Erro ao abrir arquivo.");
        return 1;
            }
            int menor1= 0, menor2= 0;
            if (2 > fscanf( fp, " %d%d", &menor1, &menor2 )) {
                puts( "nao consegue " );} //<--- Mensagem para alertar de uma falha que impediu
             if(menor1>menor){
                 duracao=menor1;
                 menor1=menor2;
                 menor2=duracao;}
             
        

    while(!feof(fp)){
    fscanf(fp, "%i",&duracao);
        if(menor1>menor2){
            duracao=menor1;
            menor1=menor2;
            menor2=duracao;
        }
            }
    

          printf("%i\n",menor1);

      fclose(fp);
       return 0;
 }        
 

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, muh.prog disse:

while(!feof(fp)){
    fscanf(fp, "%i",&duracao);
        if(menor1>menor2){
            duracao=menor1;
            menor1=menor2;
            menor2=duracao;
        }
            }

Essa parte difere dessa

19 minutos atrás, mauro_b disse:

Dentro do clico verifique com a mesma lógica aplicada a um novo valor


while (!feof(fp)) {
		fscanf(fp, "%i",&duracao);
		SE A > duracao:
			B= A
			A= duracao;
               
		SENAO_SE B > duracao:
			B= duracao;
}

 

No contexto de seu programa A é menor1 e B é menor2, e duracao é duracao mesmo.

senao_se é else if

Link para o comentário
Compartilhar em outros sites

esta dando que nao consegue ler menor 1 e menor 2 tambem


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

int main() {
    setlocale(LC_ALL, "Portuguese");
    FILE *fp; 
    int duracao;
    int i=0;    
        fp= fopen( "Maq1.log", "r" );     
        if (fp == NULL) {
        printf("Erro ao abrir arquivo.");
        return 1;
            }
            int menor1= 0, menor2= 0;
            if (2 > fscanf( fp, " %d%d", &menor1, &menor2 )) {
                puts( "nao consegue " );} //<--- Mensagem para alertar de uma falha que impediu
             if(menor1>menor2){
                 duracao=menor1;
                 menor1=menor2;
                 menor2=duracao;}
    while(!feof(fp)){
    fscanf(fp, "%i",&duracao);
        if(menor1 > duracao){
            menor2= menor1;
            menor1= duracao;
        }else{
            if(menor2>duracao){
                menor2=duracao;
            }
        }
               
    
}
    
    

          printf("%i\n",menor1);

      fclose(fp);
       return 0;
 }        
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

entendi! Vou compilar aqui também.

Não há problemas além da indentação de código.

Faça mais testes e compartilha as falhas do código abaixo:

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

int main( ){
        setlocale(LC_ALL, "Portuguese");
        FILE *fp= NULL; 
        int duracao= 0;
        int i= 0;    
        fp= fopen( "Maq1.log", "r" );     
        if (fp == NULL) {
                printf("Erro ao abrir arquivo.");
                return 1;
        }
        int menor1= 0, menor2= 0;
        if (2 > fscanf( fp, " %i%i", &menor1, &menor2 )) {
                puts( "Nao consegue ler 2 numeros." );
                return 1;
                
        } //<--- Mensagem para alertar de uma falha que impediu
        if (menor1 > menor2) {
                duracao= menor1;
                menor1= menor2;
                menor2= duracao;
                        
        }
        while (!feof(fp)) {
                fscanf(fp, " %i", &duracao);
                if (menor1 > duracao) {
                        menor2= menor1;
                        menor1= duracao;
                }else{
                        if(menor2 > duracao) {
                                menor2= duracao;
                        }
                }
        }
        printf("1. Menor valor: %d\n", menor1);
        printf("2. Menor valor: %d\n", menor2);
        fclose(fp);
        return 0;

}
 
 
 

 

No aguardo.

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