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

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
 
É um array de struct.

Exemplo, para me explicar melhor:
Código:
struct alunos{
char nome[40];
int nota;}pos[3];
 
Última edição:
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.
 
Então é melhor fazer assim:

Código:
typedef struct alunos{  //t[I]ypedef faz o que exactamente?[/I]
    char nome[40];
    int nota;
} Alunos, *pAlunos;
//aqui declaro a variável alunos, e o respectivo ponteiro, né?

e depois declaras um array:

Código:
pAlunos array[30];
//aqui defino o array a ser apontado por pAlunos, certo?

Quando quiseres criar um novo aluno e respectiva nota fazes:

Código:
pAlunos novo=NULL; //[I]aqui não percebi :/[/I]
novo=(pAlunos)malloc(sizeof(Alunos)); //[I]aqui igualo a variável novo ao ponteiro e atribuo-lhe um bloco de memória do tamanho necessário para a struct alunos né?[/I]
 
novo->nome="Baderous";
novo->nota=12; //[I]nestas duas linhas é introduzido os valores e o resto tudo é básico..[/I]

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.

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
 
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.
 
Código:
novo=(pAlunos)malloc(sizeof(Alunos));
erro: novo undeclared (first use this function).

Supostamente não é declarada logo acima?:S
 
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...
 
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
 
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;
    }
 
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:
Back
Topo