1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programa em C++. Struct (array) com o uso de pointers e atribuiçao dinamica de memóri

Discussão em 'Programação' iniciada por TheRieper, 14 de Janeiro de 2008. (Respostas: 10; Visualizações: 5834)

  1. TheRieper

    TheRieper Power Member

    Bem, caros amigos techzonianos, já cá não punha os pés faz um tempo...
    O caso é o seguinte. O meu brilhante (note-se o sarcasmo) professor pediu-nos para fazer um programa em C++ que usasse uma estrutura que guardasse o nome e nota de vários alunos, sobre a forma de array, usando ponteiros para operar com a struct.
    Ora, o problema é que ele diz-nos isto e manda-nos ir ler o livro. No livro nao tem coisa alguma com struct array + ponteiros.
    O que me está a incapacitar é o facto de que, não consigo por os ponteiros a funcionar para o array em completo. consigo por um para a primeira posiçao, outro para o segundo, e assim sucessivamente. Isto torna também difícil o uso de atribuição de memória dinâmica que queria implementar já para ter umas luzes na matéria visto que também já nos mandou ler isso.
    Não quero que o código, nem o trabalho feito por mim, ficava eu sem aprender. E aliás, sei que não o dão. Mas agradecia que me pudesse dar uma mão e umas luzes/exemplos de struct array+ponteiros.

    Abraço
     
  2. Baderous

    Baderous Banido

    É um array de structs ou uma struct com um array lá dentro?
     
  3. TheRieper

    TheRieper Power Member

    É um array de struct.

    Exemplo, para me explicar melhor:
    Código:
    struct alunos{
    char nome[40];
    int nota;}pos[3];
     
    Última edição: 14 de Janeiro de 2008
  4. Baderous

    Baderous Banido

    Então é melhor fazer assim:

    Código:
    typedef struct alunos{
        char nome[40];
        int nota;
    } Alunos, *pAlunos;
    e depois declaras um array:

    Código:
    pAlunos array[30];
    Quando quiseres criar um novo aluno e respectiva nota fazes:

    Código:
    pAlunos novo=NULL;
    novo=(pAlunos)malloc(sizeof(Alunos));
    novo->nome="Baderous";
    novo->nota=12;
    Para inserir no array:

    Código:
    array[i]=novo;
    Para aceder a qualquer campo:

    Código:
    array[i]->nome;
    array[i]->nota;
    Para libertar memória:

    Código:
    free(array[i]);
    Espero não me ter enganado em nada.
     
  5. TheRieper

    TheRieper Power Member

    Ou seja, deixa ver se entendi bem... e o que não percebi o que faz também:P(vou colocar a frente das linhas de código em itálico).
    Corrije-me se estiver errado por favor.
    Obrigadissimo pela ajuda.:D

    Abraço
     
  6. Baderous

    Baderous Banido

    Código:
    [COLOR=Red]//Declaração da estrutura "alunos" que também vai ficar a ser conhecida pelo programa por "Alunos", ou pelo apontador para a estrutura, denominado "pAlunos".[/COLOR]
    typedef struct alunos{
        char nome[40];
        int nota;
    } Alunos, *pAlunos;
    
    [COLOR=Red]Isto é equivalente a:
    
    [/COLOR]struct alunos{
        char nome[40];
        int nota;
    }
    
    typedef struct alunos Alunos;
    typedef struct alunos *pAlunos;
    
    e depois declaras um array:

    Código:
    pAlunos array[30];
    [COLOR=Red]//Isto é um array onde cada posição tem um apontador (pAlunos) para uma estrutura igual à previamente declarada[/COLOR]
    
    Quando quiseres criar um novo aluno e respectiva nota fazes:

    Código:
    [COLOR=Red]//Inicialização de um novo apontador para a estrutura[/COLOR]
    pAlunos novo=NULL;
    
    [COLOR=Red]//Alocação da memória necessária ao suporte da estrutura. São alocados (sizeof(Alunos)) bytes (tamanho da estrutura), ficando "novo" a apontar para o primeiro byte da estrutura. Faz-se um cast do apontador para (pAlunos) para evitar Warnings.[/COLOR]
    novo=(pAlunos)malloc(sizeof(Alunos));
    
    [COLOR=Red]//Introdução dos novos valores[/COLOR]
    novo->nome="Baderous";
    novo->nota=12;
    Para inserir no array:

    Código:
    array[i]=novo;
    Para aceder a qualquer campo:

    Código:
    array[i]->nome;
    array[i]->nota;
    Para libertar memória:

    Código:
    free(array[i]);
    Vê lá agora.
     
  7. TheRieper

    TheRieper Power Member

    Código:
    novo=(pAlunos)malloc(sizeof(Alunos));
    erro: novo undeclared (first use this function).

    Supostamente não é declarada logo acima?:S
     
  8. Baderous

    Baderous Banido

    Eu tenho isto:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    typedef struct alunos{
        char nome[40];
        int nota;
    } Alunos, *pAlunos;
    
    pAlunos cria(pAlunos a,char *name,int mark);
    
    int main () {
        pAlunos array[30];
        pAlunos novo=NULL;
        novo=cria(novo,"Baderous",12);
    
    ...
    
    }
    
    pAlunos cria(pAlunos a,char *name,int mark) {
        a=(pAlunos)malloc(sizeof(Alunos));
        strcpy(a->nome,name);
        a->nota=mark;
        return a;
    }
    e está a compilar. Mas também estou a fazer isto à pressa, posso ter dado algum erro...
     
  9. TheRieper

    TheRieper Power Member

    Eu tenho assim..:
    Código:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    typedef struct alunos{
    char nome[40];
    int nota;}Alunos, *pAlunos;
    
    main()
    {int i,maior, soma=0, media;
    pAlunos vec[30];
    for (i=1;i<=3;i++)
    pAlunos novo=NULL;
    novo=(pAlunos)malloc(sizeof(Alunos));
    {cout<<"Introduza o nome do aluno número "<<i<<": ";
    cin>>novo->nome;
    cout<<"Introduza a nota do respectivo aluno: ";
    cin>>novo->nota;
    soma+=novo->nota;
    vec[i]=novo;};
    media=soma/3;
    cout<<"A média da turma é: "<<media<<"."<<endl;
    for (i=1;i<=3;i++)
    {cout<<"O aluno número "<<i<<" cujo nome é :"<<vec[i]->nome<<". Teve a nota: ";
    if (vec[i]->nota>media)
    {cout<<vec[i]->nota<<" que superou a média da turma."<<endl;}
    {cout<<vec[i]->nota<<" que não superou a média da turma."<<endl;};
    free(vec[i]);};
    getche();}
    Abraço
     
  10. Baderous

    Baderous Banido

    Atenção às chavetas:

    Código:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    typedef struct alunos{
            char nome[40];
            int nota;
            }Alunos, *pAlunos;
    
    int main()
    {
        int i,maior, soma=0, media;
        pAlunos vec[30];
        for (i=1;i<=3;i++) [COLOR=Red]{[/COLOR]
            pAlunos novo=NULL;
            novo=(pAlunos)malloc(sizeof(Alunos));
            
               cout<<"Introduza o nome do aluno número "<<i<<": ";
               cin>>novo->nome;
               cout<<"Introduza a nota do respectivo aluno: ";
               cin>>novo->nota;
               soma+=novo->nota;
               vec[i]=novo;
               [COLOR=Red]}[/COLOR]
        media=soma/3;
        cout<<"A média da turma é: "<<media<<"."<<endl;
        for (i=1;i<=3;i++)
        {
            cout<<"O aluno número "<<i<<" cujo nome é :"<<vec[i]->nome<<". Teve a nota: ";
            if (vec[i]->nota>media)
            {
               cout<<vec[i]->nota<<" que superou a média da turma."<<endl;
            }
            [COLOR=Red]else[/COLOR]
            {
               cout<<vec[i]->nota<<" que não superou a média da turma."<<endl;
            }
        free(vec[i]);};
        getche();
        return 0;
        }
    
     
  11. TheRieper

    TheRieper Power Member

    apaguei-as sem querer... :lol: alias. tinha escrito isso fora de chavetas>.> que estúpidoT_T

    Agora já dá. Domo arigatu.
    Salvaste-me;D

    Abraço
     
    Última edição: 14 de Janeiro de 2008

Partilhar esta Página