+ Responder ao Tópico



  1. #1

    Padrão Passagens de vetores para a funcao

    Galera eu tenho um certo problema com passagens de informacoes para funcoes.


    segue um exemplo pratico da faculdade, eu entreguei meu trabalho assim, mas se voces puderem me ajudar e dividir em funcoes. detalhe tah para windows.

    valeu

    //Funcao principal
    int main()
    {
    //Declaracao de variaveis tipo char apontando para a memoria
    char *nome[53];
    char *snome[46];
    //variaveis usadas para contador e rand
    int i,j,k,l;
    //Lista de Nomes
    nome[0]="Adilson";
    nome[1]="Amanda";
    nome[2]="Bernardo";
    nome[3]="Bianca";
    nome[4]="Charles";
    nome[5]="Camila";
    nome[6]="Dionisio";
    nome[7]="Diana";
    nome[8]="Ernesto";
    nome[9]="Ester";
    nome[10]="Floriano";
    nome[11]="Fernanda";
    nome[12]="Gevasio";
    nome[13]="Gabriela";
    nome[14]="Helber";
    nome[15]="Helena";
    nome[16]="Ivan";
    nome[17]="Ivanir";
    nome[18]="Juliano";
    nome[19]="Jandira";
    nome[20]="Kervin";
    nome[21]="Karina";
    nome[22]="Luzimar";
    nome[23]="Leila";
    nome[24]="Mario";
    nome[25]="Mercedes";
    nome[26]="Nilson";
    nome[27]="Nadia";
    nome[28]="Oscar";
    nome[29]="Olivia";
    nome[30]="Paulo";
    nome[31]="Patricia";
    nome[32]="Quincas";
    nome[33]="Quiteria";
    nome[34]="Raul";
    nome[35]="Rosana";
    nome[36]="Salvio";
    nome[37]="Samanta";
    nome[38]="tadeu";
    nome[39]="Talita";
    nome[40]="Ubirajara";
    nome[41]="Ursula";
    nome[42]="Vladimir";
    nome[43]="Viviane";
    nome[44]="Xavier";
    nome[45]="Xenia";
    nome[46]="Yuri";
    nome[47]="Yasmin";
    nome[48]="Wilson";
    nome[49]="Wilma";
    nome[50]="Zacarias";
    nome[51]="Zaira";
    //Lista de Sobrenomes
    snome[0]="Alvares";
    snome[1]="Almeida";
    snome[2]="Bernardes";
    snome[3]="Bortoletto";
    snome[4]="Camargo";
    snome[5]="Cicarelli";
    snome[6]="Damasco";
    snome[7]="Dirceu";
    snome[8]="Ernesto";
    snome[9]="Elali";
    snome[10]="Fernades";
    snome[11]="Ferreira";
    snome[12]="Garcia";
    snome[13]="Germano";
    snome[14]="Honda";
    snome[15]="Haussen";
    snome[16]="Ivo";
    snome[17]="Iwer";
    snome[18]="King";
    snome[19]="Korch";
    snome[20]="Lima";
    snome[21]="Leite";
    snome[22]="Massarenti";
    snome[23]="Martinez";
    snome[24]="Nogueira";
    snome[25]="Nunes";
    snome[26]="Oliveira";
    snome[27]="Otto";
    snome[28]="Passos";
    snome[29]="Pedroso";
    snome[30]="Quercia";
    snome[31]="Queiros";
    snome[32]="Rosa";
    snome[33]="Rincon";
    snome[34]="Silva";
    snome[35]="Silveira";
    snome[36]="Teixeira";
    snome[37]="Torres";
    snome[38]="Uber";
    snome[39]="Unser";
    snome[40]="Vargas";
    snome[41]="Vaz";
    snome[42]="Walter";
    snome[43]="Willy";
    snome[44]="Xavier";
    snome[45]="Zannata";
    snome[46]="Zoratto";
    printf("Teste do gerador de nomes aleartorios\n\n");
    //contador para o rand
    for(i=0; i<10; i++)
    {
    j=rand()%51;
    k=rand()%46;
    l=rand()%46;
    printf(" %d %s %s %s\n",i,nome[j],snome[k],snome[l]);
    }
    printf("\n\n\n");
    system("PAUSE");
    return 0;
    }

  2. #2

    Padrão

    Eu estou um pouco enferrujado em C/C++, mas assim que chegar em casa eu vou responder sua pergunta. Até deixei um bookmark aqui.

  3. #3

    Padrão

    cara eu entreguei esse meu trabalho mas se você puder me responder informando sobre isso como eu faço as funcoes passandos o vetores.


    abraços


    Nilson

  4. #4

    Padrão

    Cara uma forma de fazer isso seria assim...
    Cria uma variável global nome e sobre nome, uma função que retorne os nomes aleatórios dado um limite e o main...
    Código :
    //Variáveis Globais;
    char *nome[53];
    char *snome[46];
    //Lista de nomes
    void inicia_nomes(){
        nome[0]="Adilson";
        nome[1]="Amanda";
        nome[2]="Bernardo";
        nome[3]="Bianca";
        nome[4]="Charles";
        nome[5]="Camila";
        nome[6]="Dionisio";
        nome[7]="Diana";
        nome[8]="Ernesto";
        nome[9]="Ester";
        nome[10]="Floriano";
        nome[11]="Fernanda";
        nome[12]="Gevasio";
        nome[13]="Gabriela";
        nome[14]="Helber";
        nome[15]="Helena";
        nome[16]="Ivan";
        nome[17]="Ivanir";
        nome[18]="Juliano";
        nome[19]="Jandira";
        nome[20]="Kervin";
        nome[21]="Karina";
        nome[22]="Luzimar";
        nome[23]="Leila";
        nome[24]="Mario";
        nome[25]="Mercedes";
        nome[26]="Nilson";
        nome[27]="Nadia";
        nome[28]="Oscar";
        nome[29]="Olivia";
        nome[30]="Paulo";
        nome[31]="Patricia";
        nome[32]="Quincas";
        nome[33]="Quiteria";
        nome[34]="Raul";
        nome[35]="Rosana";
        nome[36]="Salvio";
        nome[37]="Samanta";
        nome[38]="tadeu";
        nome[39]="Talita";
        nome[40]="Ubirajara";
        nome[41]="Ursula";
        nome[42]="Vladimir";
        nome[43]="Viviane";
        nome[44]="Xavier";
        nome[45]="Xenia";
        nome[46]="Yuri";
        nome[47]="Yasmin";
        nome[48]="Wilson";
        nome[49]="Wilma";
        nome[50]="Zacarias";
        nome[51]="Zaira";
        //Lista de Sobrenomes
        snome[0]="Alvares";
        snome[1]="Almeida";
        snome[2]="Bernardes";
        snome[3]="Bortoletto";
        snome[4]="Camargo";
        snome[5]="Cicarelli";
        snome[6]="Damasco";
        snome[7]="Dirceu";
        snome[8]="Ernesto";
        snome[9]="Elali";
        snome[10]="Fernades";
        snome[11]="Ferreira";
        snome[12]="Garcia";
        snome[13]="Germano";
        snome[14]="Honda";
        snome[15]="Haussen";
        snome[16]="Ivo";
        snome[17]="Iwer";
        snome[18]="King";
        snome[19]="Korch";
        snome[20]="Lima";
        snome[21]="Leite";
        snome[22]="Massarenti";
        snome[23]="Martinez";
        snome[24]="Nogueira";
        snome[25]="Nunes";
        snome[26]="Oliveira";
        snome[27]="Otto";
        snome[28]="Passos";
        snome[29]="Pedroso";
        snome[30]="Quercia";
        snome[31]="Queiros";
        snome[32]="Rosa";
        snome[33]="Rincon";
        snome[34]="Silva";
        snome[35]="Silveira";
        snome[36]="Teixeira";
        snome[37]="Torres";
        snome[38]="Uber";
        snome[39]="Unser";
        snome[40]="Vargas";
        snome[41]="Vaz";
        snome[42]="Walter";
        snome[43]="Willy";
        snome[44]="Xavier";
        snome[45]="Zannata";
        snome[46]="Zoratto";     
    }
     
     
     
    char *nome_rand(int limite, bool primeiro){
    	int x = rand()%limite;
    	if(primeiro)
    		return nome[x];
    	else
    		return snome[x];
    }
     
     
    int main(int argc, char *argv[])
    {
        srand ( time(NULL) );
        inicia_nomes();
        printf("Teste do gerador de nomes aleartorios\n\n");
    	for(int i=0; i<10; i++)
    	{
    		printf(" %d %s %s %s\n",i,nome_rand(51,true),nome_rand(46,false),nome_rand(46,false));
    	}
    	printf("\n\n\n");
    	system("PAUSE");
        return 0;
    }

    Se as variáveis nome e snome forem colocadas dentro da função nome_rand elas serão criadas e destruídas toda vez que chamar a função... Isso gasta tempo e gera lixo na memória... Por isso as coloquei como globais.

    Só mais uma última coisa, a função rand não é muito confiável...Ela geralmente cria números aleatórios repetidos devido a semente utilizada... Uma boa ideia é mudar essa semente utilizando a função srand. Por isso aquela linha srand ( time(NULL) ). Ela atribui os segundos da hora naquele instante como sendo a semente... Dessa forma a função rand se torna mais, digamos, randômica!

    Espero que seja o suficiente...

  5. #5

    Padrão

    Olha, continuo não tendo tempo para rever uns conceitos sobre C, mas eu vou fazer alguns comentários sobre o seu código-fonte.

    1 - Você não precisa se castrar para declarar todos esses elementos dessa forma. Seria bem interessante fazer desta forma, não?

    Código :
    #include <stdio.h>
    #include <stdlib.h>
     
    #define LIM 5	// Quantidade de nomes/sobrenomes
    #define LEN 50	// Tamanho da string
     
    void main(){
    	char nomes[LIM][LEN]={"Joaozinho","Mariazinha","Joaninha","Fulaninho","Viadinha"};
    	char sobrenomes[LIM][LEN]={"Silva","Sauro","Souza","Cruz","Martins"};
    }

    Existe uma forma de otimizar esse código, mas de cabeça eu não lembro, utilizando matrizes de strings e fazendo o apontamento por ponteiros. Desta forma, é alocada menos memória (embora seja mais sacal de fazer).

    Se bem me lembro também, strings são tratadas de uma maneira um pouco diferente dos outros tipos de variáveis, a partir do momento que uma string é, na prática, quase um vetor de caracteres. E um vetor nada mais é que um elemento built-in da linguagem C onde é apontado o endereço do primeiro elemento e então ele vai fazendo o salto N bits depois do último elemento de memória (Onde N é o tamanho de memória que o tipo de variável ocupa). Sendo assim, acho que se passarmos uma string para uma função, a linguagem já altera os elementos dentro, sem ter que fazer uso de ponteiros, porque strings já são ponteiros por natureza. Corrijam-me se eu estiver errado, por favor. Faz alguns meses que eu não mexo com C e eu não tenho um compilador em mãos para fazer os devidos testes.

    Mas se o seu intuito de primeira era demonstrar a utilização dos argumentos para funções e efetivamente alterá-los, eu recomendaria que você começasse pelo mais fácil, que seria trabalhar com inteiros apenas. Lembre-se que quando passamos argumentos para funções em C, na verdade passamos seus valores para uma outra variável, não alterando o conteúdo da variável original. Para alterarmos o conteúdo da variável original, você deve saber que fazemos uso de ponteiros.

    Mas, como eu disse, eu estou enferrujado na linguagem. Novamente: CORRIJAM-ME SE EU ESTIVER ERRADO!

    Abraços!