View Full Version : Problema em C
Boas!
Nao consigo meter o seguinte programa a funcionar por erros na indicacao do caminho para aceder aos dados da estrutura alguem em sabe dizer como resolver isso?http://el-teste.iscac.pt/moodle/pix/s/thoughtful.gif
//3.a
struct struct_dados
{
int num_aluno, ano;
char nome[50], curso[3];
};
//3.b
struct struct_dados pede_dados()
{
struct_dados aluno;
printf("Introduza o numero de aluno: ");
scanf("%d",&aluno.num_aluno);
printf("Introduza o nome do aluno: ");
gets(aluno.nome);
printf("Introduza o curso do aluno: ");
gets(aluno.curso);
printf("Introduza o ano do aluno: ");
scanf("%d",&aluno.ano);
return aluno;
}
//funcao nao pedida
mostra_alunos(struct struct_dados *alunof, int num)
{
int i;
for(i=0;i<num;i++)
printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i ).curso,*(alunof+i).ano);
}
//3.c
main()
{
int i,n;
struct struct_dados *alunos;
printf("Quantos alunos deseja introduzir?");
scanf("%d",&n);
if(!(alunos=(struct_dados*)malloc(n*sizeof(struct_ dados))))
{
printf("Memoria insuficiente!");
exit(1);
}
for(i=0;i<n;i++)
*(alunos+i)=pede_dados();
mostra_alunos(alunos,n);
free(alunos);
}
//3.a
typedef struct struct_dados
{
int num_aluno, ano;
char nome[50], curso[3];
};
//3.b
struct struct_dados pede_dados()
{
struct struct_dados aluno;
printf("\n###########\nIntroduza o numero de aluno: ");
scanf("%d",&aluno.num_aluno);
printf("Introduza o nome do aluno: ");
scanf("%s",aluno.nome);
printf("Introduza o curso do aluno: ");
scanf("%s",aluno.curso);
printf("Introduza o ano do aluno: ");
scanf("%d",&aluno.ano);
return aluno;
}
//funcao nao pedida
mostra_alunos(struct struct_dados *alunof, int num)
{
int i;
for(i=0;i<num;i++)
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
}
//3.c
main()
{
int i,n;
struct struct_dados *alunos;
printf("Quantos alunos deseja introduzir?");
scanf("%d",&n);
alunos = (struct struct_dados*) malloc( n * sizeof(struct struct_dados) );
if( alunos == 0 )
{
printf("Memoria insuficiente!");
exit(1);
}
for(i=0;i<n;i++)
alunos[i]=pede_dados();
mostra_alunos(alunos,n);
free(alunos);
}
Em principio isto deve funcionar :P
Para a proxima sê mais claro com o erro (faz copy paste do compilador) e tenta usar pontuação, caso contrário o que escreves pode tornar-se incompreensivel.
myth obrigado pela ajuda, mas n consigo correr o programa ah mesma!
o erro de compilacao foi:
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.num_aluno' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.nome' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.curso' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.ano' must have class/struct/union type
Que versão do VS estás a usar? Experimenta mudar a extenção de cpp, para c. É que, ficheiros com extenção cpp são compilados como se estivesses a usar C++ e não C, o que faz sentido. ;)
De qualquer das formas:
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
julgo que deveria ser alunof[i]->num_aluno uma vez que é ponteiro. Mas como há uns 10 anos que não uso structs (só uso classes), posso estar enganado. Estranhamente, o meu VS compila e corre bem com o '.' e com o -> dá erro de struct.
yap myth tinhas razao!
nao pode ser:
printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i ).curso,*(alunof+i).ano);
tem q ser:
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
Nao faz muito sentido uma vez q existem a notacao offset é mais utilizada e deveria funcionar com estruturas mas... quem manda é a maquina!
obrigado! e ja agora se alguem souber explicar a razao agradecia deste conflito agradecia
(...) obrigado! e ja agora se alguem souber explicar a razao agradecia deste conflito agradecia
A razão para isso acontecer é simples: o operador . tem mais prioridade que o operador * (ver http://www.cppreference.com/operator_precedence.html).
Para que funcionasse da maneira que querias fazer inicialmente, terias de ter assim:
printf("%d - %s - %s - %d\n",(*(alunof+i)).num_aluno,(*(alunof+i)).nome,(*(alu nof+i)).curso,(*(alunof+i)).ano);
Alternativamente, ainda poderias fazer assim:
printf("%d - %s - %s - %d\n",(alunof+i)->num_aluno,(alunof+i)->nome,(alunof+i)->curso,(alunof+i)->ano);
ok bugg3d (http://www.techzonept.com/member.php?u=7453) tas la! gracias
|
|