Ir ao conteúdo

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


Ir à solução Resolvido por hekotes630,

Posts recomendados

Postado

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;
}

 

  • Solução
Postado

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
Postado

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
Postado

@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
Postado

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
Postado

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

Postado

@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
Postado
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

Postado
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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!