Ir ao conteúdo

Posts recomendados

Postado

oi galera, to com uma dúvida mt grande em relação a LÓGICA de uma questão, eu cheguei a fazer o código mas acredito que realmente não entendi o que é pedido, alguém me ajuda? 

a questão:

 

Crie um programa C para ler uma sequência S de n números inteiros positivos x1, x2, x3, ...,
xn não repetidos e, em seguida ler um número inteiro k. Por fim, verifique se existem pelo
menos dois segmentos de números consecutivos de comprimento k, onde os números do
segundo segmento são o quadrado dos números do primeiro segmento, obedecendo a
ordem. O programa deverá imprimir as posições iniciais dos dois segmentos na sequência S
e os próprios segmentos; ou "não encontrado", caso os segmentos não existam.

 

a) n >= 4.
b) 2 ≤ k < n
c) Considere a primeira posição de S como 0 (zero).
d) Deverão ser implementadas, pelo menos, as seguintes funções:
• void le_sequencia(int sequencia[], int n): para ler a sequência de n números.
• bool procura_segmento(int sequencia[], int n, int k, int &pos_seg1, int &pos_seg2):
para retornar as posições dos segmentos 1 e 2. A função deve retornar verdadeiro se
encontrou os segmentos; ou falso, caso contrário.

  • Curtir 1
Postado
2 horas atrás, nagatonie disse:

eu cheguei a fazer o código mas acredito que realmente não entendi o que é pedido

 

Isso é interessante. Como "chegar a fazer um código" sem entender o que é pedido?

 

Ao contrário, recomendo nem tentar isso. Não comece a escrever um código antes de entender o que é pedido.

 

Escreva em torno dos dados. Tem várias coisas aí que deve já saber fazer... 

Faça então, e vá se acostumando com os dados. É só o que importa. Só depois escreva "um código".

 

Um jeito de tratar isso.

 

2 horas atrás, nagatonie disse:

uma sequência S de n números inteiros positivos x1, x2, x3, ...,
xn não repetidos

 

E não é só isso...

 

2 horas atrás, nagatonie disse:

a) n >= 4.

 

Comece por uma sequencia dessas, claro. Então tem uma sequência de inteiros não repetidos. O comprimento é n e no mínimo n vale 4...

 

Não sabe como fazer isso?

Vou te ajudar com uma sequencia dessas, em um sofisticado programa de 3 comandos:

 

#include <stdio.h>
int main(void)
{
    unsigned S[] = {1, 2, 3, 4, 5, 6};
    unsigned n   = sizeof S / sizeof S[0];
    printf("S[%u] = ",n);
    for (unsigned i = 0; i < n-1; i += 1) printf("%u, ", S[i]);
    printf("%u\n", S[n-1]);
    return 0;
}

 

Que mostra

S[6] = 1, 2, 3, 4, 5, 6

 

n = 6, inteiros, positivos, sem repetição...

É assim. só o tempo de copiar um programa anterior e escrever em cima.

 

3 horas atrás, nagatonie disse:

verifique se existem pelo
menos dois segmentos de números consecutivos de comprimento k, onde os números do
segundo segmento são o quadrado dos números do primeiro segmento

 

E não é só isso:

 

3 horas atrás, nagatonie disse:

b) 2 ≤ k < n

 

É claro, porque

  • se k fosse maior que n a sequência maior não ia caber na menor
  • se k fosse igual a n não teria como repetir a sequência

Note que:

  • aceitar números negativos seria problema pra pensar porque x e -x tem o mesmo quadrado
  • excluir números repetidos também ajuda porque 1,1,1,1 seria um problema por exemplo
  • se k for maior que (n-k) não cabe a segunda repetição então a condição b) devia ser
     
        b)    2<=k <= (n-k)

     

E se pode dizer que o enunciado está errado... Mas sua função não precisa estar. Basta parar a busca no valor certo de n

 

Uma sequência mínima seria de que tamanho? 4. Está escrito lá. Como arrumar duas sequências dentro de uma sequência de 4? Só podem ser 2 sequências de 2. Que tal
 

    4,6,16,36


Então se fossem 6...
 

    unsigned S[] = {1, 2, 3, 4, 9, 16};

 

3x3 é 9, 4x4 = 16... Então essa deve dar positivo...

 

E as funções?

 

void        le_sequencia(int[], int);
bool        procura_segmento(int[],int,int,int&,int&);

 

Citação

Note que procura_segmento() é uma declaração em C++ e não C.

 

Vai escrever isso em C ou C++???

 

Em C ou C+= ou C# zero é falso, o resto é verdadeiro. bool é uma bobagem afinal. Em C bool é até oferecido através de um header. 

 

int& declara uma referência em C++. Não há isso em C.

 

Supondo que seja em C e usando o programa que mostrei antes, o de 3 comandos, e as duas sequências

 

void        le_sequencia(int seq[], int n)
{
    // comente uma das sequencias
    unsigned S[] = {1, 2, 3, 4, 9, 16}; // [1]
    // unsigned S[] = {2, 3, 4, 5, 6, 7}; // [2]

    // copia os caras e retorna
    unsigned n = sizeof S / sizeof S[0];
    for (int i = 0; i < n; i += 1) seq[i] = S[i];
}

 

Se comentar [1] a segunda função deve retornar falso, se comentar a primeira deve retornar verdadeiro e com a sequencia 1 em 2 e a sequencia 2 em 4, já que está escrito lá
 

3 horas atrás, nagatonie disse:

c) Considere a primeira posição de S como 0 (zero).

 

que o primeiro índice é 0.

 

É claro que vai querer mostrar a sequência lida e uma terceira função não seria assim segredo: basta pegar as 3 linhas do programa lá de cima e colocar numa função...

 

void mostra_sequencia(int S[], int n)
{
    printf("S[%u] = ", n);
    for (unsigned i = 0; i < n - 1; i += 1) printf("%u, ", S[i]);
    printf("%u\n", S[n - 1]);
}

 

Não é só isso? E claro que pode usar a mesma função para mostras as duas sub-sequências, certo?

 

Uma função fake para procura_segmento()

 

Em alguns círculos se chama placeholder, ou stub, ou dummy, mas é só isso: uma função que retorna algo que faça sentido para poder testar o programa como um todo.

 

int procura_segmento(int S[], int n, int k, int* seq1, int* seq2)
{
    seq1 = 2;
    seq2 = 4;
    if (S[0] == 1) return 0;
    return 1;
};

 

E já pode juntar tudo num programa só. 3 funções de 3 linhas e um programa de teste de umas 10:

 

int main(void)
{
    unsigned S[100];
    unsigned n    = 6;
    unsigned k    = 2;
    unsigned pos1 = 0;
    unsigned pos2 = 0;

    le_sequencia(S, n);      // le os caras
    mostra_sequencia(S, n);  // mostra
    if (procura_segmento(S, n, k, &pos1, &pos2))
    {
        printf("\
para k = %u as sequencias estão em %u e %u!\n",
            k, pos1,pos2);
        mostra_sequencia(S+pos1, k);
        mostra_sequencia(S+pos2, k);
    }
    else
        printf("\
não ha sequencias nas condicoes pedidas\n");
    return 0;
}

 

Isso é praticamente o programa todo. 

 

Escrevi assim para tentar mais uma vez mostrar o lance de escrever em torno dos dados e não tentar escrever nada interativo nem nada antes da hora...

 

Eis o "programa" todo

 

#include <stdio.h>

void le_sequencia(int[], int);
void mostra_sequencia(int[], int);
int  procura_segmento(int[], int, int, int*, int*);

int main(void)
{
    unsigned S[100];
    unsigned n    = 6;
    unsigned k    = 2;
    unsigned pos1 = 0;
    unsigned pos2 = 0;

    le_sequencia(S, n);      // le os caras
    mostra_sequencia(S, n);  // mostra
    if (procura_segmento(S, n, k, &pos1, &pos2))
    {
        printf("\
para k = %u as sequencias estão em %u e %u!\n",
            k, pos1,pos2);
        mostra_sequencia(S+pos1, k);
        mostra_sequencia(S+pos2, k);
    }
    else
        printf("\
não ha sequencias nas condicoes pedidas\n");
    return 0;
}

void le_sequencia(int seq[], int n)
{
    // comente uma das sequencias
    //unsigned S[] = {1, 2, 3, 4, 9, 16};  // [1]
    unsigned S[] = {2, 3, 4, 5, 6, 7}; // [2]
    // copia os caras e retorna
    for (int i = 0; i < n; i += 1) seq[i] = S[i];
}

void mostra_sequencia(int S[], int n)
{
    printf("S[%u] = ", n);
    for (int i = 0; i < n - 1; i += 1) printf("%d, ", S[i]);
    printf("%u\n", S[n - 1]);
}

int procura_segmento(int S[], int n, int k, int* seq1, int* seq2)
{
    *seq1 = 2, *seq2 = 4;
    if (S[0] == 1) return 1;
    return 0;
};

 

Que mostra

 

S[6] = 1, 2, 3, 4, 9, 16
para k = 2 as sequencias estão em 2 e 4!
S[2] = 3, 4
S[2] = 9, 16

 

Ou 
 

S[6] = 2, 3, 4, 5, 6, 7
não ha sequencias nas condicoes pedidas

 

conforme a linha em uso na função stub.

 

Para que isso "tudo"?

 

Porque ainda não se programou nada mas já testamos nos primeiros minutos.

As condições já estão certas

Já mostra a sequência de entrada e até as de saída

 

E agora?

 

Por ter escrito assim agora basta escrever uma procura_segmento() funcional e testar com as sequências S que temos e depois criar a rotina que lê os valores e encerrar o programa.

 

Escreva em torno dos dados

 

 

 

 

 

 

 

 

 

 

 

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!