Ir ao conteúdo

Posts recomendados

Postado

Oi gente, boa noite! Eu estou estudando função recursiva em C e estou com dúvida numa questão que estou fazendo. O objetivo do programa é ler a quantidade de termos de uma série, inserir os 3 primeiros termos, e depois os termos da série são gerados pela soma e pela subtração dos 3 termos inseridos. No final, o compilador deve mostrar a sequência gerada e ela inversa.

#include<stdio.h>

void calcula_serie(int n, int a[]);
void inverte_serie(int n, int a[]);

int main()
{
  int n, *a[50], i = 0;
  printf("Insira a quantidade de termos da serie: ");
  scanf("%d", &n);
  printf("Digite o primeiro termo: ");
  scanf("%d", &a[0]);
  printf("Digite o segundo termo: ");
  scanf("%d", &a[1]);
  printf("Digite o segundo termo: ");
  scanf("%d", &a[2]);

  calcula_serie(n, a[50]);
  return 0;
}

void calcula_serie(int n, int a[]){
  int i;
    for (i = 3; i < n; i++){
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];

      }
    printf("\nOrdem Original:");
    printf("\n{");
    for (i = 0; i < n; i++)

            printf(" %d", a[i]);
    printf("}\n");

    inverte_serie(a[i]);

}

void inverte_serie(int n, int a[]){
  int i;
   printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
            printf(" %d", a[i]);
    printf("}\n");
}

Eu só fiz a parte da soma, mas meu código não roda no meu compilador, alguém pode me ajudar? :) 

  • Curtir 1
Postado

@mariaclara157    o que você está tentando fazer nessa Linhas aqui :

6 horas atrás, mariaclara157 disse:
int n, *a[50]

se está criando um vetor dinâmico , então não precisam de colchetes , mas vai precisar de malloc e depois free , 

e seu código apenas corrigido  para compilar :

#include<stdio.h>

int calcula_serie(int n, int* );  
int inverte_serie(int n, int* );  

int main()
{
    int n, a[50], i = 0;
    printf("quantidade de termos da serie: ");
    scanf("%d", &n);
    printf("primeiro termo: ");
    scanf("%d", &a[0]);
    printf("segundo termo: ");
    scanf("%d", &a[1]);
    printf("Terceiro termo: ");
    scanf("%d", &a[2]);

    calcula_serie(n, a);  // enviando um vetor por parametro
    return 0;
}

int calcula_serie(int n, int a[]) // recebendo um vetor por parametro
{
    int i;
    for (i = 3; i < n; i++) 
    {
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];
    }
    printf("\nOrdem Original:");
    printf("\n{");
    for (i = 0; i < n; i++)
        printf(" %d", a[i]);
    printf("}\n");

    inverte_serie(n,a);
    return 0;
}

int inverte_serie(int n, int a[]) 
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
        printf(" %d", a[i]);
    printf("}\n");
    return 0;
}

 

 

  • Obrigado 1
Postado
15 horas atrás, mariaclara157 disse:

Eu estou estudando função recursiva em C e estou com dúvida numa questão que estou fazendo. O objetivo do programa é ler a quantidade de termos de uma série, inserir os 3 primeiros termos, e depois os termos da série são gerados pela soma e pela subtração dos 3 termos inseridos. No final, o compilador deve mostrar a sequência gerada e ela inversa

 

Seu programa não está muito bom ainda.

 

Qual a sua dúvida?

 

Onde está a função recursiva?

 

Qual a série? É estranho ter que procurar por ela dentro do programa para entender o programa. Sem a definição da série como alguém vai saber se está certo o que escreveu??

 

Sobre o código

 

    int n, *a[50], i = 0;

 

 

Em especial se está aprendendo evite declarar mais de uma variável por linha. O preço é o mesmo. Mas é um inferno, em especial quanto seu programa cresce, ficar procurando declarações.

 

Sobre isso

 

    int *a[50];

 

Não era isso que você queria declarar. E se queria não devia declarar assim. Nunca. Em especial se está aprendendo. Eis a razão:

 

Em C você declara uma variável dando a ela um tipo. Qual a variável aqui?

 

É a

 

E qual o tipo de a?

 

a é int*.

 

Quantos a declarou? 

 

50

 

 

Então declare 

 

        int*        a[50] = NULL;

 

SE a é int* é claro que *a é int. Mas não é isso que está declarando. Está declarando a.

 

    scanf("%d", &n);

 

Teste SEMPRE o retorno de scanf(). Leia o manual. É ingênuo não testar. Se não ler nada apenas cancele o programa. Essa é a beleza dos programas de estudantes: não precisa tratar os erros. Mas seguir adiante não é esperto porque vai cancelar na linha seguinte se tiver sorte. Mas iniciantes não costumam ter sorte e pode acabar ficando com um valor válido e gerando valores incompreensíveis depois. Só vai perder tempo.

 

E leia os 3 termos de uma vez. É muito para usar o programa ter que ficar digitando 3 valores e ENTER 3 vezes.

 

    printf("Digite o segundo termo: ");
    scanf("%d", &a[1]);
    printf("Digite o segundo termo: ");
    scanf("%d", &a[2]);

 

E o título está errado....

 

E a não é um vetor de ponteiros. Apenas um vetor de int para armazenar a série.

 

E avise o usuário sobre o limite de 50 termos...

 

Se 

 

    void inverte_serie(int n, int a[]);

 

Então

 

    inverte_serie(a[i]);

 

Está claro errado. Onde estão os dois parâmetros??

 

void inverte_serie(int n, int a[])

 

Se vai inverter a serie não mostre nada na tela.

 

Notou que esse codigo

 

void calcula_serie(int n, int a[])
{
    int i;
    for (i = 3; i < n; i++)
    {
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];
    }
    printf("\nOrdem Original:");
    printf("\n{");
    for (i = 0; i < n; i++) printf(" %d", a[i]);
    printf("}\n");

 

Tem algo deste:

 

void inverte_serie(int n, int a[])
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--) printf(" %d", a[i]);
    printf("}\n");
}

 

Use componentes.

 

Que tal uma função que mostra a série e que recebe a série e o título como parâmetros? Assim podia chamar 2 vezes e teria que escrever e testar menos código...

 

Considere

 

int calcula_serie(int n, int a[]);
int inverte_serie(int n, int a[]);
int le_serie(int a[]);
int mostra_serie(int n, int a[], const char* titulo);

 

E aí podia testar seu programa com ele mesmo porque CLARO que se inverter a serie duas vezes ela deve ficar igualzinho na saída...  E retornar algo para sinalizar um erro. Veja esse trecho

 

int main()
{
    int a[50];
    // resolve o tamanho e le os primeiros termos
    int n = le_serie(a);
    calcula_serie(n, a); // preenche o vetor
    mostra_serie(n, a, "Serie Original");
    inverte_serie(n, a);
    mostra_serie(n, a, "Serie Invertida");
    inverte_serie(n, a);
    mostra_serie(n, a, "Serie Invertida Novamente");
    return 0;
}

 

Não é mais simples de ler e escrever e testar?

 

Evite void.

 

Nunca declare a variável de controle de um loop fora dele

 

Nunca declare uma variável global assim com o nominho de 'i'. Só vai ter problema porque pode acabar reusando

 

 

 

 

 

 

 

 

 

 

  • Curtir 1
  • Obrigado 1
Postado
10 horas atrás, devair1010 disse:

@mariaclara157    o que você está tentando fazer nessa Linhas aqui :

se está criando um vetor dinâmico , então não precisam de colchetes , mas vai precisar de malloc e depois free , 

e seu código apenas corrigido  para compilar :

#include<stdio.h>

int calcula_serie(int n, int* );  
int inverte_serie(int n, int* );  

int main()
{
    int n, a[50], i = 0;
    printf("quantidade de termos da serie: ");
    scanf("%d", &n);
    printf("primeiro termo: ");
    scanf("%d", &a[0]);
    printf("segundo termo: ");
    scanf("%d", &a[1]);
    printf("Terceiro termo: ");
    scanf("%d", &a[2]);

    calcula_serie(n, a);  // enviando um vetor por parametro
    return 0;
}

int calcula_serie(int n, int a[]) // recebendo um vetor por parametro
{
    int i;
    for (i = 3; i < n; i++) 
    {
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];
    }
    printf("\nOrdem Original:");
    printf("\n{");
    for (i = 0; i < n; i++)
        printf(" %d", a[i]);
    printf("}\n");

    inverte_serie(n,a);
    return 0;
}

int inverte_serie(int n, int a[]) 
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
        printf(" %d", a[i]);
    printf("}\n");
    return 0;
}

 

 

Obrigada! Agora entendi o que estava errando.

@arfneto

48 minutos atrás, arfneto disse:

 

Seu programa não está muito bom ainda.

 

Qual a sua dúvida?

 

Onde está a função recursiva?

 

Qual a série? É estranho ter que procurar por ela dentro do programa para entender o programa. Sem a definição da série como alguém vai saber se está certo o que escreveu??

 

Sobre o código

 

    int n, *a[50], i = 0;

 

 

Em especial se está aprendendo evite declarar mais de uma variável por linha. O preço é o mesmo. Mas é um inferno, em especial quanto seu programa cresce, ficar procurando declarações.

 

Sobre isso

 

    int *a[50];

 

Não era isso que você queria declarar. E se queria não devia declarar assim. Nunca. Em especial se está aprendendo. Eis a razão:

 

Em C você declara uma variável dando a ela um tipo. Qual a variável aqui?

 

É a

 

E qual o tipo de a?

 

a é int*.

 

Quantos a declarou? 

 

50

 

 

Então declare 

 

        int*        a[50] = NULL;

 

SE a é int* é claro que *a é int. Mas não é isso que está declarando. Está declarando a.

 

    scanf("%d", &n);

 

Teste SEMPRE o retorno de scanf(). Leia o manual. É ingênuo não testar. Se não ler nada apenas cancele o programa. Essa é a beleza dos programas de estudantes: não precisa tratar os erros. Mas seguir adiante não é esperto porque vai cancelar na linha seguinte se tiver sorte. Mas iniciantes não costumam ter sorte e pode acabar ficando com um valor válido e gerando valores incompreensíveis depois. Só vai perder tempo.

 

E leia os 3 termos de uma vez. É muito para usar o programa ter que ficar digitando 3 valores e ENTER 3 vezes.

 

    printf("Digite o segundo termo: ");
    scanf("%d", &a[1]);
    printf("Digite o segundo termo: ");
    scanf("%d", &a[2]);

 

E o título está errado....

 

E a não é um vetor de ponteiros. Apenas um vetor de int para armazenar a série.

 

E avise o usuário sobre o limite de 50 termos...

 

Se 

 

    void inverte_serie(int n, int a[]);

 

Então

 

    inverte_serie(a[i]);

 

Está claro errado. Onde estão os dois parâmetros??

 

void inverte_serie(int n, int a[])

 

Se vai inverter a serie não mostre nada na tela.

 

Notou que esse codigo

 

void calcula_serie(int n, int a[])
{
    int i;
    for (i = 3; i < n; i++)
    {
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];
    }
    printf("\nOrdem Original:");
    printf("\n{");
    for (i = 0; i < n; i++) printf(" %d", a[i]);
    printf("}\n");

 

Tem algo deste:

 

void inverte_serie(int n, int a[])
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--) printf(" %d", a[i]);
    printf("}\n");
}

 

Use componentes.

 

Que tal uma função que mostra a série e que recebe a série e o título como parâmetros? Assim podia chamar 2 vezes e teria que escrever e testar menos código...

 

Considere

 

int calcula_serie(int n, int a[]);
int inverte_serie(int n, int a[]);
int le_serie(int a[]);
int mostra_serie(int n, int a[], const char* titulo);

 

E aí podia testar seu programa com ele mesmo porque CLARO que se inverter a serie duas vezes ela deve ficar igualzinho na saída...  E retornar algo para sinalizar um erro. Veja esse trecho

 

int main()
{
    int a[50];
    // resolve o tamanho e le os primeiros termos
    int n = le_serie(a);
    calcula_serie(n, a); // preenche o vetor
    mostra_serie(n, a, "Serie Original");
    inverte_serie(n, a);
    mostra_serie(n, a, "Serie Invertida");
    inverte_serie(n, a);
    mostra_serie(n, a, "Serie Invertida Novamente");
    return 0;
}

 

Não é mais simples de ler e escrever e testar?

 

Evite void.

 

Nunca declare a variável de controle de um loop fora dele

 

Nunca declare uma variável global assim com o nominho de 'i'. Só vai ter problema porque pode acabar reusando

 

 

 

 

 

 

 

 

 

 

Criei essas funções e realmente ficou bem mais simples e claro (deixei as anotações do devair para me ajudar)

#include<stdio.h>
int le_serie(int*);
int calcula_serie(int n, int* );
int inverte_serie(int n, int* );
int serie_invertida(int n, int* );

int main()
{
    int n=0, a[50], i = 0;
    while(n < 4){
    printf("quantidade de termos da serie: ");
    scanf("%d", &n);
    }
    le_serie(a);
    calcula_serie(n, a);
    serie_invertida(n, a);  // enviando um vetor por parametro
    return 0;
}

int le_serie(int a[]){

   printf("primeiro termo: ");
    scanf("%d", &a[0]);
    printf("segundo termo: ");
    scanf("%d", &a[1]);
    printf("Terceiro termo: ");
    scanf("%d", &a[2]);

    return a[0], a[1], a[2];
}

int calcula_serie(int n, int a[]) // recebendo um vetor por parametro
{
    int i;

        for (i = 3; i < n; i++)
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];

      return a[i];

    inverte_serie(n,a);
}

int inverte_serie(int n, int a[], int inv[])
{
    int i;
    for (i = n; i > 0; i--)
        inv[i] = a[i];

    return inv[i];
}

int serie_invertida(int n, int inv[]){
  int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
      printf(" %d", inv[i]);
    printf("}\n");
}

 a minha ordem inversa acaba saindo com 1 digito a mais que não deveria estar ali, o que poderia ser?

E pensando agora sobre a questão de fazer a subtração (ordem sendo criada a partir das 3 ultima somas e depois subtração intercalando entre elas), eu poderia criar um outro vetor para receber o a[] e fazer a subtração? ou esse jeito estaria errado?

image.png

  • Curtir 1
Postado
1 hora atrás, mariaclara157 disse:

a minha ordem inversa acaba saindo com 1 digito a mais que não deveria estar ali, o que poderia ser?

 Tem-se acesso fora do limite lógico, está fora de limite mais tem capacidade.

 

Isole o problema, forneça a informação da função.

[c]

#include"stdio.h"
int
serie_invertida (int n, int termos[]) {
  int i;
  printf("\nOrdem inversa:"
         "\n{");
    
  for (i = n; i >= 0; i--)
      printf(" %d", termos[i]);
    
  printf("}\n");
  return 0;
}
int
main (void) {
  #define n (8)
  int termos[50] = {1, 2, 3, 
  [n - 5] = termos[0] + termos [1] + termos [2],
  [n - 4] = termos[1] + termos [2] + termos [3],
  [n - 3] = termos[2] + termos [3] + termos [4],
  [n - 2] = termos[3] + termos [4] + termos [5],
  [n - 1] = termos[4] + termos [5] + termos [6],
    
    [n] = 10000,
  };
  (void) serie_invertida (n, termos);
}

 

SAÍDA

2030059772_Semttulo.png.267afad0125a130d72f994f0f65763c0.png

 

n (8) é numero de termos e último n - 1 (7)

[:)] Isso ajudou a reparar o código

 

  • Curtir 2
  • Triste 1
Postado

@mariaclara157    sua função le_serie , não está funcionando bem ,  pois Dos dados lido nela apenas um será retornado para dentro da função main  ,  pois o return só pode retornar um valor , e esse vetor tem muitos valores nele ,  e mesmo especificando cada valor separado não funciona assim  ,  então você pode enviar o endereço do vetor para essa função , e os dados serão gravados no vetor que está lá dentro da função main

#include <stdio.h>
#include <stdlib.h>
int le_serie(int*);
int main()
{
    int n = 0;
    int a[50]; // o endereco do vetor comeca a partir da posicao zero
    int i = 0;
    while (n < 4) 
    {
        printf("quantidade de termos da serie: ");
        scanf("%d", &n);
    }
    le_serie(&a[0]);  // envia o endereco da primeira posicao do vetor
                      // e assim pode gravar dados nele la na outra funcao
    printf("\nconderindo se os numeros estão mesmo vetor:\n");
    printf("vetor a[0]= %d\n", a[0]);
    printf("vetor a[1]= %d\n", a[1]);
    printf("vetor a[2]= %d\n", a[2]);
    calcula_serie(n, a);
    serie_invertida(n, a);  // enviando um vetor por parametro
    return 0;
}
int le_serie(int a[]) // recebe um vetor por parametro , e esse 
                      // vetor tem o mesmo endereco do que foi enviado
{
    printf("primeiro termo --: ");
    scanf("%d", &a[0]);
    printf("segundo termo ---: ");
    scanf("%d", &a[1]);
    printf("Terceiro termo --: ");
    scanf("%d", &a[2]);   
    return a[0];         // a[1], a[2] não serao retornados
                         // só poDe Retornar um valor
                         //  e vetor tem muitos valores
    // alem disso você ao colocou nenhuma variavel la na main para receber nenhum valor .
    // aqui nessa funcao não precisa retornar nada , pois os dados 
    // serao gravados no endereco do vetor a que esta la da funcao main
    // pois o endereco dele foi enviado para caa
}

int calcula_serie(int n, int a[]) // recebendo um vetor por parametro
{
    int i;

    for (i = 3; i < n; i++)
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];

    return a[i];

    inverte_serie(n, a,a);
}

int inverte_serie(int n, int a[], int inv[])
{
    int i;
    for (i = n; i > 0; i--)
        inv[i] = a[i];

    return inv[i];
}

int serie_invertida(int n, int inv[]) 
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
        printf(" %d", inv[i]);
    printf("}\n");
    return 0;
}

 

 

  • Curtir 1
Postado
14 horas atrás, mariaclara157 disse:
int inverte_serie(int n, int a[], int inv[])
{
    int i;
    for (i = n; i > 0; i--)

 

Mas na outra

 

4 horas atrás, devair1010 disse:
    for (i = n; i >= 0; i--)
        printf(" %d", inv[i]);

 

As duas não podem estar certas ao mesmo tempo, já que a série tem um mesmo tamanho...

 

De i=0 até i<0 são n+1 valores e só tem n no vetor

 

14 horas atrás, mariaclara157 disse:
int le_serie(int*);
int calcula_serie(int n, int* );
int inverte_serie(int n, int* );
int serie_invertida(int n, int* );

 

mas depois 

 

14 horas atrás, mariaclara157 disse:
int calcula_serie(int n, int a[]) // recebendo um vetor por parametro

 

por exemplo.

 

Não escreva assim. Um vetor pode ser visto como um ponteiro mas um ponteiro NÃO é um vetor. Não comece assim. Só vai ter problemas.

 

Se é um vetor declare int[]. Deixe o compilador ajudar você.

 

Sugiro corrigir tudo que eu te expliquei. Não mudou nada.

 

Como está o programa agora?

 

  • Curtir 1
  • Obrigado 1
Postado
15 horas atrás, arfneto disse:

De i=0 até i<0 são n+1 valores e só tem n no vetor

 

De i - n até i<0 são n+1 valores. Digitei errado...
 

Sobre o programa

 

Não mudou nada do que eu disse que estava errado, e inseriu novos erros.

 

Em 05/02/2022 às 11:31, mariaclara157 disse:

Criei essas funções e realmente ficou bem mais simples e claro (deixei as anotações do devair para me ajudar)

 

Que pretende com isso:

 

    while(n < 4){
    printf("quantidade de termos da serie: ");
    scanf("%d", &n);
    }

 

?

 

Esse loop vai ler n até alguém digitar 4. Não seria muito mais simples escrever

 

    n = 4;

 

Como eu te disse, é ingênuo não testar o retorno de scanf(). E continua não testando.

 

E por isso seu programa pode ser pior: se o cara digitar um 'e' por engano ao invés de 4 seu programa vai entrar em loop e encher a tela de mensagens. Ou qualquer letra, claro. Testou isso?

 

image.png.58ced4ddaa9fa82c91dc0fb587ff540b.png

 

 

l

 

Pois é...

 

 

sobre isso:

 

int calcula_serie(int n, int a[]) // recebendo um vetor por parametro
{
    int i;

    for (i = 3; i < n; i++)
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];

    return a[i];

    inverte_serie(n, a,a);
}

 

Porque está chamando uma função dentro da outra? Nada tem a ver calcula_serie com inverte_serie.

 

Está limitando seu próprio programa. Assim sempre vai inverter a serie. Qual o proposito? Já pensou que não vai dar tempo sequer de ver a série original?

Mais ainda: 

  • porque está retornando um elemento da série?
  • Se está retornando antes de chamar inverte_serie não acha que está errado? Nunca vai executar aquilo
  • Seu compilador avisou sobre isso. Ignorou a mensagem?
  • entendeu o que eu disse sobre não usar uma variável com o singelo nome de i global na função? Não teria errado se tivesse feito isso

 

20 horas atrás, devair1010 disse:
 inverte_serie(n, a,a);

 

Se está invertendo a em a não acha que vai se perder algo?

 

Vai acabar copiando algo que já inverteu...

 

Sobre isso, @devair1010

 

int le_serie(int a[]) // recebe um vetor por parametro , e esse 
                      // vetor tem o mesmo endereco do que foi enviado
{
    printf("primeiro termo --: ");
    scanf("%d", &a[0]);
    printf("segundo termo ---: ");
    scanf("%d", &a[1]);
    printf("Terceiro termo --: ");
    scanf("%d", &a[2]);   
    return a[0];         // a[1], a[2] não serao retornados
                         // só poDe Retornar um valor
                         //  e vetor tem muitos valores
    // alem disso você ao colocou nenhuma variavel la na main para receber nenhum valor .
    // aqui nessa funcao não precisa retornar nada , pois os dados 
    // serao gravados no endereco do vetor a que esta la da funcao main
    // pois o endereco dele foi enviado para caa
}

 

Que significa o comentário "recebe um vetor por parametro , e esse vetor tem o mesmo endereco do que foi enviado" ?

 

A função recebe o endereço de um vetor como parâmetro. Só isso.

 

    return a[0];         // a[1], a[2] não serao retornados
                         // só poDe Retornar um valor
                         //  e vetor tem muitos valores
    // alem disso você ao colocou nenhuma variavel la na main para receber nenhum valor .
    // aqui nessa funcao não precisa retornar nada , pois os dados 
    // serao gravados no endereco do vetor a que esta la da funcao main
    // pois o endereco dele foi enviado para caa

 

Sim. Só pode retornar um valor. Mas porque a[0]?  Não é muito mais simples retornar n para poder escrever em main

 

    int n = le_serie(a);

 

?

 

Escreva em torno dos dados

 

Os dados são os dois vetores de tamanho n. 

 

Sobre isso

 

int serie_invertida(int n, int inv[]) 
{
    int i;
    printf("\nOrdem inversa:");
    printf("\n{");
    for (i = n; i >= 0; i--)
        printf(" %d", inv[i]);
    printf("}\n");
    return 0;
}

 

A função só mostra a série na tela. Como saber se ela é invertida? Se chamar com a ou com inv tanto faz. E porque não passar um titulo como parâmetro como eu expliquei? Se fizer isso pode escrever main assim:

 

int main(void)
{
    int a[50];
    int inv[50];
    int n = le_serie(a); // le serie e retorna o tamanho
    mostra_serie(3, a, "Termos Iniciais:");
    calcula_serie(n, a); // preenche o resto
    mostra_serie(n, a, "Serie Calculada:");
    inverte_serie(n, a, inv);
    mostra_serie(n, inv, "A serie invertida:");
    return 0;
}

 

E usa a mesma função mostra_serie com 3 propósitos. E fica muito mais simples, ou ao menos parece...

 

O resto de um exemplo

 

int calcula_serie(int n, int a[])
{
    for (int i = 3; i < n; i++)
        a[i] = a[i-1] + a[i-2] + a[i-3];
    return 0;
}

 

note que como n é declarado int pode ser negativo e vai dar erro. Evite void. Essa serie uma razão para retornar um código de erro. Claro que n deveria ser declarado unsigned.

 

int inverte_serie(int n, int a[], int inv[])
{
    for (int i = n - 1; i >= 0; i--) inv[i] = a[n - 1 - i];
    return 0;
}

 

O simples. Note que se a for igual a inv o código não vai funcionar. Uma opção seria testar e retornar erro. Evite void. 

 


int mostra_serie(int n, int a[], const char* titulo)
{
    if (titulo != NULL) printf("%s\n\t", titulo);
    for (int i = 0, col = 5; i < n; i += 1)
    {
        printf("%10d  ", a[i]);
        if (i % col == col - 1)
            printf("\n\t");
    }
    printf("\n");
    return 0;
}

 

imprime a série e o título se tiver. Só 5 colunas por linha.

 

int le_serie(int a[])
{   // leria o tamanho da serie e os
    // primeiros 3 elementos
    // retornando o tamanho
    a[0] = 1, a[1] = 1, a[2] = 1;
    return 11;
}

 

Pois é: ler ou não os dados não vai fazer diferença então antes de o programa estar pronto basta algo assim

 

O exemplo 

 

#include <stdio.h>

int calcula_serie(int n, int a[]);
int inverte_serie(int n, int a[], int inv[]);
int le_serie(int a[]);
int mostra_serie(int n, int a[], const char* titulo);

int main(void)
{
    int a[50];
    int inv[50];
    int n = le_serie(a); // le serie e retorna o tamanho
    mostra_serie(3, a, "Termos Iniciais:");
    calcula_serie(n, a); // preenche o resto
    mostra_serie(n, a, "Serie Calculada:");
    inverte_serie(n, a, inv);
    mostra_serie(n, inv, "A serie invertida:");
    return 0;
}

int calcula_serie(int n, int a[])
{
    for (int i = 3; i < n; i++)
        a[i] = a[i-1] + a[i-2] + a[i-3];
    return 0;
}

int inverte_serie(int n, int a[], int inv[])
{
    for (int i = n - 1; i >= 0; i--) inv[i] = a[n - 1 - i];
    return 0;
}

int le_serie(int a[])
{   // leria o tamanho da serie e os
    // primeiros 3 elementos
    // retornando o tamanho
    a[0] = 1, a[1] = 1, a[2] = 1;
    return 11;
}

int mostra_serie(int n, int a[], const char* titulo)
{
    if (titulo != NULL) printf("%s\n\t", titulo);
    for (int i = 0, col = 5; i < n; i += 1)
    {
        printf("%10d  ", a[i]);
        if (i % col == col - 1)
            printf("\n\t");
    }
    printf("\n");
    return 0;
}

 

A saída

 

Termos Iniciais:
                 1           1           1
Serie Calculada:
                 1           1           1           3           5
                 9          17          31          57         105
               193
A serie invertida:
               193         105          57          31          17
                 9           5           3           1           1
                 1

 

É mais simples escrever assim.

  • Pode reaproveitar o código de mostra_serie()
  • Cada função faz exatamente uma coisa
  • Pode testar em separado
  • Não tem nada global.

 

 

  • Curtir 1
  • 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!