Ir para conteúdo
Fórum Script Brasil
  • 0

Como criar função com vetor de tamanho indefinido?


MarlonS

Pergunta

Tentei fazer aqui um programa que pede números até que o utilizador introduza o número "-1", quando isso acontece, o computador calcula a média aritimética dos valores digitados (exceto o -1). Pois bem, para uma quantidade "n" pre-definida, no caso, coloquei "200", o programa roda. Mas, e se o usuário digitasse muito mais de duzentos valores? Como fazer um looping for "infitino" até que se digite -1?

Meu programa:

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

int ask_numbers(int vet[]);

int main (){
    int *p;
    p=malloc(200*sizeof(int));
    if(!p) {
           printf("falha na alocacao de memoria"); 
           exit(1);
           }       
    printf("A media aritimetica dos valores ditigados vale %d\n", ask_numbers(p));
    system("pause");
    free(p);
    return 0;
}

int ask_numbers(int vet[]){
    int i, soma=0, media=0;
    for (i=1;;i++){
        scanf("%d", &vet[i]); /*COMO FAZER PARA QUE O PROGRAMA FUNCIONE PARA n>200?*/
        soma+=vet[i];
        if (vet[i]==(-1)) {
        media=(soma+1)/i; 
        return media;
        } 
    }
}

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

cara, primeiro tenho umas sugestões a fazer com relação a organização do código e alguns aspectos da linguagem: primeiro, use endentação no seu código pra facilitar o entendimento de outras pessoas que forem lê-lo, só dando dois espaços a direita depois de cada estrutura de controle já deixa seu código legal pra se ler. Segundo, ainda sobre a legibilidade, quando possível separe declarações de variáveis locais dos comandos e de preferência, declare todas as variáveis no início do bloco da função. E por úlitmo, ainda por questão de legibilidade cole o seu código entre tags code. Desculpe pelos avisos, até porque não são avisos, são conselhos =]

Pelo que eu entendi, me corrija se eu estiver errado, você quer parar de ler os números quando o usuário exceder o limite de 200 números, certo? Se for só isso é só inserir a condição no seu laço for para i <= 200 ou então se você preferir inserir um if dentro do seu laço, enfim, tanto faz, mas seria melhor a condição, já que você economizaria uma linha =]

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

float ask_numbers(int vet[]);

int main (){
    int p[200];

    if(!p){
        printf("falha na alocacao de memoria");
        exit(1);
    }

    printf("A media aritimetica dos valores ditigados vale %.2f\n", ask_numbers(p));

    system("pause");
    return 0;
}

float ask_numbers(int vet[]){
    int i, soma = 0;

    for(i = 1; i <= 200; i++){
        printf("%do. numero: ", i);
        scanf("%d", &vet[i]); /*COMO FAZER PARA QUE O PROGRAMA FUNCIONE PARA n>200?*/
        if(vet[i] != -1)
            soma += vet[i];
        else
            break;
    }

    if(--i)
        return soma / i;
    else
        return 0;
}

Como o tamanho do seu vetor é fixo, então você pode usar alocação estática mesmo, sem precisar usar o malloc().

Se a sua dúvida era passar um vetor para uma função e a função saber qual o tamanho do seu vetor você pode passar outro parâmetro para a função indicando o tamanho do vetor que foi fornecido a ela ou então convencionar para que o primeiro elemento do vetor represente o tamanho dele.

Espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

  • 0
Arrk , voce olhou para o codigo dele e esqueçeu da duvida dele.

MarlonS

Voce deve especificar , é em C ou C++ ?

Eu tenho a mesma dúvida. Não é possível criar um vetor sem definir um valor. Então... Como fazer em uma situação onde não se sabe exatamente quantas posições do vetor serão necessárias?

Link para o comentário
Compartilhar em outros sites

  • 0

Eu sei fazer isso em C++ usando vetores , e o valor para encerrar a lista é -1

Código abaixo :

#include <iostream>
#include <vector>

using namespace std;

vector < int > W;

int main()
{
    int tp;
    do
    {
        cout << "Vetor[" << W.size() <<"], Valor = ";
        cin >> tp;
        W.push_back(tp);
    }
    while( tp != (-1));

    if(W.size() == 0)
    cout << "não foi encontrado nenhuma ocorrencia" << endl;
    else
    cout << "Encontradas " << W.size() << " Ocorrencias nas posicoes : ";
    for(int z=0;z < W.size();z++) cout << W[z] << ",";

return 0;
}

Comentem.

Link para o comentário
Compartilhar em outros sites

  • 0

Em ANSI-C existe a função "realloc", que como o nome diz realoca memória pro ponteiro, podendo aumentar ou diminuir o tamanho do bloco de memória que ele usa.

int *x;

...

x = malloc(sizeof(int)); //guarda 1 int

...

x = realloc(sizeof(int) * 2); //guarda 2 ints

Aqui tem um exemplo legal:

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Mas o melhor mesmo é usar vector.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...