Ir ao conteúdo
  • Cadastre-se

C EXERCICIO EM C - Seja a seguinte série: 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7,


Loris_mini
Ir à solução Resolvido por hekotes630,

Posts recomendados

Algúem poderia me ajudar?

Seja a seguinte série: 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7, ... Escreva um algoritmo em C que seja capaz de gerar N termos dessa série. Esse número N deve ser lido do teclado.

o programa deve ser escrito em C 

 

Fiz assim mas ta dando erro na linha 16.

 

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

int main()
{
    int n,valor=1,posicao=1,controle=1, i;

    printf("Informe ate qual posicao deseja gerar a lista\n");
    scanf("%d", &n);

    while (posicao <= n) {
            valor= controle;
        printf("%d", valor);
        posicao +=1;
        valor += 3;
        for (int i = 0, i<2, i++){
            printf("%d", valor);
            posicao += 1;
        }
    controle += 1;
    }
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

Em vez de vírgulas, coloque ponto e vírgula nos parâmetros da declaração forE não há necessidade em definir a variável i como int, pois já foi definida anteriormente. Tão pouco há necessidade em definir os valores das variáveis valor e posicao, pois são definidas por outras declarações.

Eu melhorei seu código por muitas vezes.

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

int main()
{
    int n, valor, posicao, controle=1, i;

    printf("Informe ate qual posicao deseja gerar a lista\n");
    scanf("%d", &n);

    while (posicao <= n) {
            valor = controle;
        printf("%d", valor);
        posicao += 1;
        valor += 3;
        for (i = 0; i < 2; i++) {
            printf("%d", valor);
            posicao += 0;
        }
    controle += 1;
    }
    return 0;
}

ivXHXVKxSO.gif.0538a8184cb839780d8c73447befef67.gif

  • Confuso 2
Link para o comentário
Compartilhar em outros sites

A propósito, caso queira aprender mais profundamente sobre a linguagem de programação C, há dois livros que recomendo:

The C Programming Language First Edition (primeira implementação, conhecida como K&R)

The C Programming Language Second Edition (segunda implementação, conhecida como ANSI C)

Apesar de ambos estarem escritos em inglês, são ótimas fontes de conhecimento sobre a linguagem de programação C. 

 

 

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

@Krush206 também acho que esses livros são muito bons, mas entenda que a primeira edição é de 1978 e a segunda de 1988. E assim não vai  "aprender mais profundamente sobre a linguagem de programação C"  apenas lendo esses livros. A linguagem mudou muito desde então. Muito mesmo.

 

@Laryssa Silva Em geral nesses forums se espera que o autor publique a resposta final para ajudar outros com o mesmo problema. 

 

Imagino que tenta corrigido o apontado por @Krush206 já que seu programa "deu certinho".

 

Sobre os programas postados...

 

Escreva seus programas em torno dos dados. SEMPRE.,

 

E aqui tem um exemplo da série, como você publicou:


Seja a seguinte série: 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7

E já teria um gabarito para N=12 ou algo menor, certo?

 

@Laryssa Silva  Seu programa ainda não rodava e não parecia certo de todo modo. Apenas corrigindo a sintaxe e rodando para 1, 2 e 12
 

C:\tst ./l
Informe ate qual posicao deseja gerar a lista
1
144
C:\tst ./l
Informe ate qual posicao deseja gerar a lista
2
144
C:\tst ./l
Informe ate qual posicao deseja gerar a lista
12
144255366477
C:\tst 

 

Então para 12 está parecido, mas para 1 e 2 nem tanto. E onde estão as vírgulas?

 

@Krush206

Considerando o programa como postou veja a saída:
 

C:\tst ./k 
Informe ate qual posicao deseja gerar a lista
0
144
C:\tst ./k 
Informe ate qual posicao deseja gerar a lista
1
144255
C:\tst ./k 
Informe ate qual posicao deseja gerar a lista
12
144255366477588699710108111191212101313111414121515131616
C:\tst 

 

Para k = 0 mostrou 144? Onde estão as vírgulas como aparecem no enunciado? Como aconteceu a saída para N=12?

 

Um exemplo, escrevendo em torno dos dados

 

Considere a série como descrita
 

Citação

1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7, ...

 

E entenda que se

  • não faz sentido N ser negativo, já que é uma série. Deixe o compilador trabalhar por você e declare n como unsigned
  • se N for 1 a saída é trivial: "1"
  • a partir daí são duas séries: 
    • a primeira mostra 4,5,6,7,8... e gera cada número duas vezes
    • a segunda gera 2,3,4,5,6... e gera cada número uma única vez
  • os números são separados por uma vírgula, está bem claro ali.
  • usando recortar e colar no próprio editor de texto, com o resultado copiado direto do enunciado, você não deveria ter dúvidas do que esperar para cada valor entre 1 e 12 ao menos...

    image.png.d4ca97cf93c9a0386803910902eaae9e.png

Ainda sobre os programas

  • não há razão para incluir headers que não usa, como stdlib.h nesse caso
     
  • não declare mais de uma variável por linha: só atrapalha
     
  • se acostume a usar a opção -Wall para compilar e ver todos os avisos do compilador. Assim veria por exemplo que declarou i fora do loop no #1
     
  • teste sempre o retorno de scanf(). É muito ingênuo deixar o programa seguir sem testar. Se o usuário digitar 'x' por engano acham que faz sentido seguir com o programa? Qual vai ser o valor de n? 
     
  • enquanto está testando não use um programa interativo: não leia do teclado. Só atrasa tudo. Porque não começar com
     
    	int 	n = 12;


    e continuar testando até ver a saída esperada? Que vai acrescentar ficar lendo toda vez se a lógica ainda não estiver boa?
     

  • Quando está testando um programa assim e vai mesmo ler do teclado, inicialmente mostre o valor lido. Se antecipe aos problemas.
     

  •  

Um exemplo afinal

 

Esse programa mostra uma maneira mais segura de escrever isso. Compare com o que escreveu.


Eis a saída para 0, 1, 2 e 12
 

C:\tst ./teste
Informe ate qual posicao deseja gerar a lista
0
Gerando sequencia com 0 elementos
C:\tst ./teste
Informe ate qual posicao deseja gerar a lista
1
Gerando sequencia com 1 elementos
1
C:\tst ./teste
Informe ate qual posicao deseja gerar a lista
2
Gerando sequencia com 2 elementos
1,4
C:\tst ./teste
Informe ate qual posicao deseja gerar a lista
12
Gerando sequencia com 12 elementos
1,4,4,2,5,5,3,6,6,4,7,7
C:\tst

 

E o programa

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

int main(void)
{
    unsigned n = 0;

    printf("Informe ate qual posicao deseja gerar a lista\n");
    int res = scanf("%u", &n);
    if ( res != 1 )
    {
        printf("Erro tentando ler o tamanho da lista\n");
        return -1;
    }
    printf( "Gerando sequencia com %d elementos\n", n);
    if ( n == 0 ) return 0; // sem numeros
    printf("1"); 

    // sao duas series:
    // primeira: 4,4, 5,5, 6,6, 7,7...
    // segunda: 2.3.4.5
    // e o resultado
    // 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7

    int     pos = 1;
    int     serie1 = 4;
    int     serie2 = 2;

    while ( pos < n )
    {
        printf( ",%d",serie1);
        pos += 1;
        if ( pos == n ) break;
        printf( ",%d",serie1);
        pos += 1;
        if ( pos == n ) break;
        printf( ",%d",serie2);
        pos += 1;
        if ( pos == n ) break;
        serie1 += 1;
        serie2 += 1;
    };  // while()
    printf("\n");
    return 0;
}

 

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

Eu resolvi assim:

 

#include <stdio.h>

int main()
{
    int n, s;
    
    printf("Informe ate qual posicao deseja gerar a lista: ");
    scanf("%d", &n);    
    
    for (int i = 0; i < n; i++){
        s = i/3 + (i%3 == 0 ? 1 : 4);
        printf("%d ", s);
    }
    printf("\n");

    return 0;
}

 

Que é o mesmo que isso:

 

#include <stdio.h>

int main()
{
    int n, s;
    
    printf("Informe ate qual posicao deseja gerar a lista: ");
    scanf("%d", &n);    
    
    for (int i = 0; i < n; i++){
        if (i % 3 == 0){
            s = i/3 + 1;
        }
        else {
            s = i/3 + 4;
        }
        printf("%d ", s);
    }
    printf("\n");

    return 0;
}

 

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

@isrnick Siim, no final das contas, o meu primeiro código não estava rodando por conta do erro que não estava achando.

Depois que o @Krush206  me mostrou onde tava, rodei o programa e vi os mesmo erros que o @arfneto mencionou no comentário dele. Só ai fui novamente fazer as alterações.

Link para o comentário
Compartilhar em outros sites

@isrnick s só é usado dentro do loop, provavelmente estaria melhor declarado lá dentro ou no próprio for, ou nem declarado, já que o valor não é usado para nada mais. Algo assim:

 

  • 1
#include <stdio.h>

int main()
{
    int n;
    
    printf("Informe ate qual posicao deseja gerar a lista: ");
    scanf("%d", &n);    
    
    for (int i = 0; i < n; i++)
    {
        int s = i/3 + (i%3 == 0 ? 1 : 4);
        printf("%d ", s);
    }
    printf("\n");

    return 0;
}
  • 2
     
    #include <stdio.h>
    
    int main()
    {
        int n;
        
        printf("Informe ate qual posicao deseja gerar a lista: ");
        scanf("%d", &n);    
        
        for (int i = 0, s; i < n; i++)
        {
            s = i/3 + (i%3 == 0 ? 1 : 4);
            printf("%d ", s);
        }
        printf("\n");
    
        return 0;
    }

 

  • 3
#include <stdio.h>

int main()
{
    int n;
    
    printf("Informe ate qual posicao deseja gerar a lista: ");
    scanf("%d", &n);    
    
    for (int i = 0, s; i < n; i++)
        printf("%d ", i/3 + (i%3 == 0 ? 1 : 4));
    printf("\n");

    return 0;
}
  • Teste sempre o resultado de scanf(). 
     
  • Faltaram as vírgulas na saída, como está no enunciado.
  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Citação

E assim não vai  "aprender mais profundamente sobre a linguagem de programação C"  apenas lendo esses livros. A linguagem mudou muito desde então. Muito mesmo.

Não vejo o porque, já que a maioria dos programas em C são escritos, na verdade, com base em implementações históricas da linguagem, por simplicidade e compatibilidade. Muitos compiladores C possuem compatibilidade com implementações históricas. ANSI C ainda remanesce sendo a implementação base para toda nova implementação da linguagem. 

Certamente, a linguagem mudou muito, mas implementações históricas ainda possuem um alto valor de significância à linguagem.

Citação

Para k = 0 mostrou 144? Onde estão as vírgulas como aparecem no enunciado? Como aconteceu a saída para N=12?

A série é composta por três números, sendo os dois últimos uma soma de três, contados a partir do primeiro número. As vírgulas não fazem parte da série, mas podem ser adicionadas, por conveniência.

Na minha implementação, pode-se dizer que dígito 0 = primeira série, portanto, primeira série = 144. A forma correta seria, dígito 0 = nenhuma série, portanto, nenhuma série = 0 ou dígito inválido. Fiz isto por simplicidade, mas, para se obter resultados mais convenientes, pode-se definir 1 à variável posicao e implementar um teste à declaração scanf. Também incluí vírgulas nesta nova implementação, mas, em vez de continuar a contagem, optei por quebrar a linha a cada série que é impressa:

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

int main()
{
    int n, valor, posicao=1, controle=1, i;

    printf("Informe até qual posição deseja gerar a lista:\n");
    scanf("%d", &n);

    if (n <= 0) {
            printf("Por favor, informe um número maior que zero e que não seja negativo.");
            return 1;
    }

    while (posicao <= n) {
            valor = controle;
        printf("%d", valor);
        posicao += 1;
        valor += 3;
        for (i = 0; i < 2; i++) {
            printf(",");
            printf("%d", valor);
            posicao += 0;
        }
    printf("...\n");
    controle += 1;
    }
    return 0;
}
Citação

Ainda sobre os programas

  • não há razão para incluir headers que não usa, como stdlib.h nesse caso

Omitir o header stdlib.h não faria diferença alguma ao programa. Realmente, não há necessidade em incluí-lo, mas qualquer programa real em C faz uso tanto do stdlib.h quanto do stdio.h. Ambos headers, stdlib.h e stdio.h, são essenciais para qualquer programa em C.

Apesar disso, em algum de meus testes, omitir o stdlib.h causaria output indesejável.

VtjIVFxEI8.gif

Link para o comentário
Compartilhar em outros sites

6 horas atrás, hekotes630 disse:

Omitir o header stdlib.h não faria diferença alguma ao programa

 

Ao programa não. Ao tempo de compilação sim.  E para um estudante só assusta, sem razão, a inclusão de uma longa série de headers que são muitas vezes desconhecidos e inúteis. E começar por isso induz a um vício ruim.

 

6 horas atrás, hekotes630 disse:

As vírgulas não fazem parte da série, mas podem ser adicionadas, por conveniência.

 

Considerando o título do tópico
 

Em 11/02/2021 às 20:15, Laryssa Silva disse:

Seja a seguinte série: 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7, ... Escreva um algoritmo em C que seja capaz de gerar N termos dessa série

 

talvez fosse interessante prover essa "conveniência" afinal...

 

6 horas atrás, hekotes630 disse:

Não vejo o porque, já que a maioria dos programas em C são escritos, na verdade, com base em implementações históricas da linguagem, por simplicidade e compatibilidade. Muitos compiladores C possuem compatibilidade com implementações históricas

 

Deve ter uma boa fonte desse tipo de conclusão...

 

Tente compilar algum pacote moderno com C como descrito na segunda edição de K&R e pode ter surpresas.

 

6 horas atrás, hekotes630 disse:

Apesar disso, em algum de meus testes, omitir o stdlib.h causaria output indesejável.

 

? Nos meus testes também, mas não é o caso aqui.

 

 

6 horas atrás, hekotes630 disse:

Na minha implementação, pode-se dizer que dígito 0 = primeira série, portanto, primeira série = 144. A forma correta seria, dígito 0 = nenhuma série

 

uma implementação bastante criativa... Não sei se isso iria ter bom reflexo na nota...

 

6 horas atrás, hekotes630 disse:

Fiz isto por simplicidade, mas, para se obter resultados mais convenientes, pode-se...

 

Mas se temos um enunciado em um forum para iniciantes porque não fazer o "mais conveniente" de uma vez? 

 

Leu a interpretação que eu descrevi para isso? Não parece mais conveniente? Porque não escrever em torno dos dados e deixar algo mais legível?
 

 Sobre a mesma série: 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7, uma outra maneira de descrever

 

data-centric diriam alguns
 

 

image.png.c4f18f830c9322ca2ad07116ca520f0c.png
  

 

Citação

Eu também escrevi isso por simplicidade...

 

Não estou dizendo que é bom, nem que é melhor.  Mas ao encarar o problema assim leva a implementar nesse sentido e tende a gerar um programa correto na primeira execução. Assim foi :) a menos que se ache um erro nisso:
 

 // sao duas series:
    // primeira: 4,4, 5,5, 6,6, 7,7...
    // segunda: 2.3.4.5
    // e o resultado
    // 1, 4, 4, 2, 5, 5, 3, 6, 6, 4, 7, 7

    int     pos = 1;
    int     serie1 = 4;
    int     serie2 = 2;

    while ( pos < n )
    {
        printf( ",%d",serie1);
        pos += 1;
        if ( pos == n ) break;
        printf( ",%d",serie1);
        pos += 1;
        if ( pos == n ) break;
        printf( ",%d",serie2);
        pos += 1;
        if ( pos == n ) break;
        serie1 += 1;
        serie2 += 1;
    };  // while()
    printf("\n");

 

E parece mais fácil de ler o programa e vincular com o algoritmo

image.png

Em 12/02/2021 às 00:41, hekotes630 disse:

(segunda implementação, conhecida como ANSI C)

 

Isso em 1988.

 

Entenda que a última edição disso, ANSI C, é de 2017. Acha mesmo que ainda se desenvolve com ANSI C de 1988? Não. Tente usar isso para compilar algum pacote moderno. Ou tente convencer algum desenvolvedor hoje a usar isso...

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

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!