Ir ao conteúdo
  • Cadastre-se
Eduardo_Braz

C Sequência ordenada em C

Posts recomendados

Não estou conseguindo completar a minha ideia é usar vetor só que eu não estou conseguindo concluir o pensamento..

 

Entrada
Para cada sequência numérica há na entrada duas linhas: uma com, apenas um valor inteiro, indica o
número de valores reais que deve ocorrer na próxima linha. A linha seguinte contém tantos valores quanto
indicado na linha anterior. Entre dois valores há apenas um espaço e após o último valor há um caractere
de quebra de linha. A última linha da entrada contém um tamanho de sequência igual a zero e serve apenas
para indicar término do processamento. Não há uma linha com sequência de valores após a ocorrência de
uma linha com valor zero.
 

Saída
Para cada seqüência da entrada o seu programa deve emitir uma das seguintes respostas: ORDENADA,
se a sequência estiver em ordem crescente de valores ou DESORDENADA, em caso contrário. Após cada
palavra impressa deve haver apenas um caractere de quebra de linha.
 

Exemplo

Entrada

10
2.98 16.42 18.0 23.67 31.99 38.50 42.30 61.782000.00 2000.10
5

4.51 4.32 4.90 56.70 150.80
6

0.00 2.56 4.00 80.4 100.98 100.97
0

Saída

ORDENADA
DESORDENADA
DESORDENADA

 

Código

 

 

#include <stdio.h>

 

int main(){

    int t;

    double n;

 

    scanf("%d", t);

 

    while (t--)

    {

        

    }

    

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá

 

Não precisa de vetor nem nada. Apenas

  • marque ao iniciar cada linha:
  • Enquanto estiver aumentando o valor lido tudo certo, pode ser que esteja ORDENADA
  • Ao ler um fim de linha então está ORDENADA e tenta ler outra
  • Mas se encontrou na linha um valor menor que o anterior, imprime DESORDENADA e continua lendo e desprezando o que tiver até o fim da linha. E tenta ler outra

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Eu faria isso com o For? exemplo eu irei ler a entrada e armazenando em uma varável auxiliar? 

adicionado 25 minutos depois

@arfneto

Só não está funcionando com números que tem casas decimais  

 

#include <stdio.h>

int main(){
    int t, i;
    double n, aux, sequencia,n2;

    scanf("%d", &t);

    for (i = 0; i < t; i++)
    {
        scanf("%lf", &n);
        if(n > n2) {
            sequencia++;
        }
        n2 = n;
    }
    if(n == sequencia){
        printf("ODERNADA");
    }
    else{
        printf("DESORDENADA");
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imprimiu os valores conforme lê pra conferir se está lendo certo? 

 

adicionado 1 minuto depois

Porque le dos valores inicialmente? 

adicionado 2 minutos depois

:D lli errado. Esqueça 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Tranquino, verdade eu tinha feito o teste da entrada vou fazer aqui eu já lhe falo se está recebendo corretamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas tem que continuar lendo até : acabar a linha ou achar um elemento menor

 

E n2 tem que começar bem pequeno ou leia o primeiro da linha fora do loop

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei 

Aí o primeiro é negativo e seu programa já era 

 

Teste antes de tudo con duas línhas de um número só... 

Assim saberá que o loop está ok

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo assim 

2

-1234.5678

1234.5678

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto O erro é só com o primeiro mesmo o resto está funcionando perfeitamente

adicionado 0 minutos depois

@arfneto

3 minutos atrás, arfneto disse:

Algo assim 

2

-1234.5678

1234.5678

 

Okay

adicionado 1 minuto depois
4 minutos atrás, arfneto disse:

Algo assim 

2

-1234.5678

1234.5678

 

Essa deu DESORDENADA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Escreva uma função pra ler da entrada até achar um \N. Vai precisar dela de todo modo para quando precisar desprezar o resto de uma linha desordenada 

 

Aí você chama essa função após ler o primeiro valor, o número de linhas. 

 

Isso é chato mesmo

 

adicionado 2 minutos depois

Então... Com um valor só está ordenada por definição, certo? 

Sai duas linhas

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... Com um valor só está ordenada por definição, certo? 

Sai duas linhas

 

Sem funções vai ter que repetir o código. Mas é só um loop e só vai usar duas vezes 

 

adicionado 0 minutos depois

Funções são blocos de código que você chama por um nome 

adicionado 2 minutos depois

Pra não ter que escrever toda hora a mesma coisa. 

 

Tipo le_ate_fim_da_linha() :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Assim por exemplo terei que criar uma para encontra o \n

para a criação de função usarei o void?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em C fgetc() que é uma função, lê um carácter de um arquivo, como o teclado. Então um loop chamando fgetc()  até ler um \N le até o fim da linha... 

adicionado 4 minutos depois

Do

{

    Char c = fgetc(stdin) ;

} while (c! ='\n') ;

 

 

Serve

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Vou tentar aqui

adicionado 11 minutos depois

@arfneto Assim?

 

 

#include <stdio.h>

int main(){
    int t, i;
    double n, sequencia,n2;
    n2 = 0;
    sequencia = 0;
    
    scanf("%d", &t);

    for (i = 0; i < t; i++)
    {
        scanf("%lf", &n);
        while((n = fgetc(stdin)) != '\n'){
            printf("%lf ", n);        
            if(n > n2 || n < n2){
                sequencia++;
            }
            n2 = n;
        }
    }
    if(n == sequencia){
        printf("\nODERNADA");
    }
    else{
        printf("\nDESORDENADA");
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poder escrever em uma linha só 

 

char c;

 do { c = fgetc(stdin);} while ( c!!='\n') ;

adicionado 0 minutos depois

Ou usar um #define

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Muito obrigado pela a diga eu não sabia que eu poderia fazer isso

adicionado 2 minutos depois
7 minutos atrás, arfneto disse:

Poder escrever em uma linha só 

 

char c;

 do { c = fgetc(stdin);} while ( c!!='\n') ;

adicionado 0 minutos depois

Ou usar um #define

 

Está tando loop infinito

adicionado 3 minutos depois
3 minutos atrás, Eduardo_Braz disse:

@arfneto Muito obrigado pela a diga eu não sabia que eu poderia fazer isso

adicionado 2 minutos depois

Está tando loop infinito

#include <stdio.h>

int main(){
    int t, i;
    double n, sequencia,n2;
    char c;
    n2 = 0;
    sequencia = 0;
    
    scanf("%d", &t);

    for (i = 0; i < t; i++)
    {
        scanf("%lf", &n);
        do { c = fgetc(stdin);} while ( c!='\n') ;
            printf("%lf ", n);        
            if(n > n2 || n < n2){
                sequencia++;
            }
            n2 = n;
    }
    if(n == sequencia){
        printf("ODERNADA");
    }
    else{
        printf("DESORDENADA");
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda falta algo. Tem que continuar lendo na linha até 

1) ela acabar ou

2) encontrar algo fora de ordem

 

Teste primeiro com o que te mostrei

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@arfneto Teria que colocar mais um Scanf depois da função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando precisar desprezar a linha use aquele comando 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem um loop pra let cada linha. Vai usar aquilo apenas quando encontrar uma sequência desordenada. Ou seja, dentro do loop que le as linhas tem um loop que processa as linhas lendo até o fim da linha ou até descobrir que está fora de ordem. É nesse caso usa aquele comando pra desprezar o resto da linha

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...