Ir ao conteúdo

C++ posso utilizar 2 vetores em uma funcao em c++


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

estou com uma duvida de como usar a mesma funcao para 2 vetores diferentes, meu programa tem que colocar valores aleatorios em vetores sem que se repitam e de forma crescente

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>



bool Existe(int cartelaA[],int tam, int valor)
{
    for(int i = 0; i<tam; i++)
        {
            if(cartelaA[i]==valor)
                return true;
        }
    return false;
}

void GeraAleatorios(int cartelaA[],int Limite)
{
    srand(time(NULL));

    int v;
    for(int i=0; i<5; i++)
        {
            v = Limite+ rand() % 15;
            while(Existe(cartelaA,i,v))
                {
                    v = rand() % 15;
                }
            cartelaA[i] = v;
        }

}



int main()
{
    srand(time(NULL));
    int cartelaA[5];
    int cartelaB[5];
    GeraAleatorios(cartelaA,1);
    GeraAleatorios(cartelaB,16);

    for(int i = 0; i<5; i++)
        {
            cout<<cartelaA[i]<<" - ";
        }
    cout<<"\n";
    for(int i = 0; i<5; i++)
        {
            cout<<cartelaB[i]<<" - ";
        }



    return 0;
}

 

Postado

Olá

A resposta curta é sim. Você pode chamar a função com qualquer argumento e ir trocando as cartelas. 

 

Vou te mostrar uma outra maneira de criar isso, usando C++ no modo, digamos,  C++ mesmo, e não como C.

A vantagem de usar uma linguagem dessas para resolver problemas é sempre a possibilidade de usar objetos, classes no caso de C++. Pensando no caso das cartelas aqui, não seria difícil imaginar uma classe Cartela: com certeza ela teria:

  • um valor limite
  • um tamanho de cartela
  • os números teriam um limite, como entre 1 e 100. E estariam em ordem crescente sem duplicidade e a gente poderia passar para uma classe Bingo as cartelas e implentar o jogo e...

ok de volta ao tópico

 

  • Seria legal cada cartela ter um nome, tipo um nome do dono ou algo assim, para identificar cartelas iguais por exemplo.

Ao criar a cartela seria o momento de preencher a mesma com os números, já que a cartela vazia tem pouco sentido. Seria legal ter uma função para mostrar o que tem na cartela, ao menos para a gente ter uma confirmação de que os dados estão ok. E uma função existe() como a que você escreveu para poder pesquisar um número. E essas funções são claramente associadas a cada cartela, então fica claro como é vantagem ter métodos nas classes, funções que existem associadas às variáveis da classe.
A função que gera os números não é necessária: quando se cria uma variável de uma classe o C++ procura por o que se chama construtor, uma função que inicializa valores para a classe conforme necessário. E você pode ter até um destrutor, uma função que é chamada quando uma classe deixa de existir. Eles são apenas funções que tem o mesmo nome que a classe, com o destrutor tendo um til --- ~ --- na frente. Então para a classe Cartela teríamos Cartela(nome, tamanho, limite) para um construtor e ~Cartela() para um destrutor. E o compilar sabe quando e como chamar.


Com classes é mais --- muito mais --- simples.


Uma função main para tratar duas cartelas poderia ser assim:

int main(int argc, char** argv)
{
    Cartela c("Cartela A", 20, 100);
    c.mostra();

    Cartela d("Bingo", 10, 50);
    d.mostra();

    return 0;
}

declarar a cartela com o nome, o total de números e o limite faz com que seja alocada uma região de memória com o tamanho certo para conter os números da cartela. O limite e a capacidade da cartela vão orientar o construtor para criar e preencher a cartela de acordo. E ao final o destrutor libera a memória alocada inicialmente. Nada mal.

 

A função mostra, nesse caso um método da classe, ao ser chamada mostra os valores da cartela, bem como esperado. E sempre se refere à cartela correta porque faz parte da classe onde cada cartela está: se chamam instâncias.

Eis um código possível:

    int mostra()
    {
        cout <<
            "\n    Cartela '" << nome <<
            "' com " << tamanho << 
            " valores. Limite: " <<    limite 
            << endl;
        for (int i=0; i<tamanho; i++)
        {
            cout << valores[i] << "\t";
            if (i%5 == 4) cout << endl;
        }    // end for
        cout << endl;
        return 0;
    }    // end mostra()

e para as cartelas do exemplo acima mostraria 

Criando cartela 'Cartela A' com 20 valores entre 1 e 100

    Cartela 'Cartela A' com 20 valores. Limite: 100
5       17      19      25      30
35      42      44      45      55
59      66      67      77      87
88      92      94      98      99

Criando cartela 'Bingo' com 10 valores entre 1 e 50

    Cartela 'Bingo' com 10 valores. Limite: 50
5       9       16      17      25
27      38      42      44      48

Como preencher a cartela

 

Há claro muitas maneiras, mas uma maneira simples está abaixo: ao invés de se preocupar com as duplicidades e a ordem crescente se pode antes de tudo preencher a cartela com valores grandes, qualquer coisa maior que o limite, como

        for (int i=0; i<tamanho; i++) valores[i] = limite+1;

Assim qualquer valor para a cartela vai ser menor que os que já estão lá. Bem mais prático do que começar todos com zero por exemplo. E aí um loop preenche a cartela toda, mas já colocando os números na ordem. Quando você pega o novo número já vai colocando no lugar definitivo, deslocando os demais se preciso. Algo assim

    Cartela(string n, int t, int l)
    {
        nome = n;
        tamanho = t;
        limite = l;
        cout << "Criando cartela '" <<
            nome <<
            "' com " << tamanho << " valores entre 1 e " << limite << endl;
        valores = new int[tamanho];
        int v;
        for (int i=0; i<tamanho; i++) valores[i] = limite+1;
        srand(time(NULL));
        for (int i = 0; i < tamanho;)
        {    // total de valores = tamanho
            v = rand() % limite + 1; // um valor entre 1 e o limite
            for (int n=0; n<tamanho; n++)
            {
                if (valores[n] > v)
                {    // achou o lugar: desloca todos pra abrir posicao
                    for (int j=tamanho-1; j>=n; j--)
                    {
                        if(valores[j]<limite+1)
                        {
                            valores[j+1] = valores[j];
                        }    // end if
                    }    // end for
                    valores[n] = v;
                    i++;
                    break;
                }
                if (valores[n] == v) break;
            }    // end for n
        }    // end for i
    }    // end Cartela()

E a cartela fica preenchida em ordem crescente, sem duplicidade.

Destruindo uma cartela

Apenas uma linha, sem contar com o cout

    ~Cartela()
    { 
        cout << 
            "Destruindo cartela '" << 
            nome <<
            "' com " << tamanho <<
            " valores entre 1 e " << limite
            << endl;
        delete [] valores;
    };


A função existe
Essa função retornava bool em seu código, mas é melhor retornar um int com a posição na lista, que pode ser usada no futuro, ao invés de só dizer que está lá, eu acho.

 

Pense nisso e compare com seu código quase-C e talvez ajude a entender a diferença e o valor desses conceitos de objetos, variáveis membro e métodos e tal.

 

Eis a saida de um programa de teste com esse código

Criando cartela 'Cartela A' com 20 valores entre 1 e 100

    Cartela 'Cartela A' com 20 valores. Limite: 100
5       17      19      25      30
35      42      44      45      55
59      66      67      77      87
88      92      94      98      99

Criando cartela 'Bingo' com 10 valores entre 1 e 50

    Cartela 'Bingo' com 10 valores. Limite: 50
5       9       16      17      25
27      38      42      44      48

Destruindo cartela 'Bingo' com 10 valores entre 1 e 50
Destruindo cartela 'Cartela A' com 20 valores entre 1 e 100

e um link para download do programa inteiro programa inteiro se necessário
download do programa
 

  • Solução
Postado
6 horas atrás, Felipe Hoffmeister disse:

eu entendi a forma que voce fez, porém meu professor quer que eu faca com subrotinas e passagem de parâmetros,

eu estou com duvida de como posso imprimir na tela as matrizes das cartelas 

 

Olá!

 

Você leu o programa de teste? O método mostra() não faz exatamente isso e não é isso que está bem acima? E tem um exemplo do resultado logo abaixo... Talvez tenha uma questão mais específica para perguntar, ou não entendeu que aquilo é exatamente "mostrar na tela as matrizes das cartelas"?

 

Subrotinas aqui são chamadas de funções, ou métodos. Um construtor é uma subrotina e tem um exemplo de um construtor com parâmetros ao ler 

Cartela c("Bingo Hoje", 25, 75);

Isso é o que chama de subrotina, e tem 3 do que chama de parâmetros: o nome da cartela, o total de números e o limite. E vai criar a cartela com esses critérios, já preenchida com os números ordenados e nas faixas. Em menos de 30 linhas de programa.Fez o download do programa de exemplo? 

 

Mas ninguém precisa usar construtores: pode esquecer as classes e chamar o construtor de função ou subrotinas e ir declarando em seu programa e pronto. Mas vai trabalhar muito, muito mais. Basta ler o exemplo e comparar com seu código.

 

Como sabe, postei hoje um exemplo mais completo, que inclui uma classe Bingo que agrupa um número arbitrário de cartelas, usando essa classe e essas "subrotinas" associadas às cartelas. Sugiro baixar aquele programa e dar uma lida, ou talvez rodar em sua máquina e entender a mecânica. É um programa simples em C++ e o link para o tópico está logo aqui:

 

De todo modo, essa função mostra() mostra os dados da cartela

    int mostra()
    {
        cout <<
            "\n    Cartela '" << nome <<
            "' com " << tamanho << 
            " valores. Limite: " <<    limite 
            << endl;
        for (int i=0; i<tamanho; i++)
        {
            cout << valores[i] << "\t";
            if (i%5 == 4) cout << endl;
        }    // end for
        cout << endl;
        return 0;
    }    // end mostra()

Assim

    Cartela 'cartela3' com 25 valores. Limite: 75
1       2       7       11      15
23      26      28      29      30
33      37      41      42      44
46      47      54      55      59
62      65      69      74      75

E tem os 3 parâmetros como seu professor quer...

 

Claro que o programa que postei tem muitas mensagens a mais pra ajudar a entender, é só um exemplo. E muitas funções a menos que o que seria preciso para o jogo, mas em especial com a classe Bingo você deve perceber que é muito mais fácil controlar tudo sem repetir tanto código como no exemplo que mostrou para apenas 5 cartelas, em especial considerando que no exemplo lá teria que criar funções e vetores PARA CADA CARTELA.

 

Talvez eu não esteja mesmo entendendo a sua dúvida. Escreva de novo. E naquele outro tópico talvez. Porque tem dois tópicos com o mesmo tema? 

 

Eis o link para o programa de teste. tem um botão de download lá.

 

main() naquele programa, que tem 9 linhas só:

int main(int argc, char** argv)
{
    cout << "\nCriando uma classe Bingo...\n" << endl;
    Bingo    bingo(3);
    cout << "\nMostra resumo...\n" << endl;
    bingo.mostra();
    cout << "\nMostra as cartelas todas...\n" << endl;
    bingo.mostra_detalhes();
    cout << "\nMostra a terceira cartela...\n" << endl;
    (bingo.pCartelas+2)->mostra();
    return 0;
}    // end main()

Essa linha aqui

    (bingo.pCartelas+2)->mostra();

mostra na tela a terceira cartela, por exemplo, como está logo acima

 

Como funciona? Voltando ao código

	int mostra()
	{
		cout <<
			"\n    Cartela '" << nome <<
			"' com " << tamanho << 
			" valores. Limite: " <<	limite 
			<< endl;
		for (int i=0; i<tamanho; i++)
		{
			cout << valores[i] << "\t";
			if (i%5 == 4) cout << endl;
		}	// end for
		cout << endl;
		return 0;
	}	// end mostra()

O cout inicial imprime o nome da cartela, o total de números e o limite porque a classe Cartela opera com 3 parâmetros e pode ter outro limite e outro tamanho e tal...

O loop for imprime os números um por vez, já que tamanho é o tamanho da cartela. E os valores estão em... valores

A chamada a cout no loop mostra na tela o próximo número, valores

O comando  

           if (i%5 == 4) cout << endl;

simplesmente muda de linha a cada 5 números mostrados.

Não está fixo como mostrou, porque eu preferi escrever a Cartela com parâmetros. Então Cartela opera com 3 parâmetros: o nome da Cartela, o total de números e o limite deles. Seu programa por outro lado usa fixas 5 cartelas com 25 números entre 1 e 75 e sem nome. Isso seria no caso do meu exemplo usar

Cartela cartela_comum("",25,75);

De volta ao exemplo, mostra isso na tela

    Cartela 'cartela3' com 25 valores. Limite: 75
2       4       6       12      15
16      18      20      25      28
35      36      41      42      44
46      48      54      56      57
62      65      66      68      74

 

 

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