Jump to content

O Programa no fim deixa de funcionar


Loismig
 Share

Recommended Posts

Boas malta, estou com alguns problemas.

Eu estou a dar ponteiros em C e neste programa estou com um problema.

Ele faz o que é necessário mas quando chega ao fim deixa de funcionar.

Alguém me sabe dizer porquê?

#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 1
struct dados {
int numero, dia_nasc, mes_nasc, ano_nasc, dia_entrada, mes_entrada, ano_entrada;
char nome[30], morada[50], sexo;
};
void inserir_dados (struct dados d[] ) {
printf("Introduzir Nome: ");
gets(d[N].nome);

printf("Introduzir Morada: ");
gets(d[N].morada);

printf("Intrdozir Numero: ");
scanf("%d", &d[N].numero);

do {
 printf("Sexo [M] ou [F]: ");
 scanf("%c", &d[N].sexo);
} while (d[N].sexo != 'M' && d[N].sexo != 'F');

do {
 printf("Dia de Nascimento: ");
 scanf("%d", &d[N].dia_nasc);
} while (d[N].dia_nasc > 31);

do {
 printf("Mes de Nascimento: ");
 scanf("%d", &d[N].mes_nasc);
} while (d[N].mes_nasc > 12);

do {
printf("Ano de Nascimento: ");
scanf("%d", &d[N].ano_nasc);
} while (d[N].ano_nasc > 2015);

do {
 printf("Dia de Entrada: ");
 scanf("%d", &d[N].dia_entrada);
} while (d[N].dia_entrada > 31);

do {
 printf("Mes de Entrada: ");
 scanf("%d", &d[N].mes_entrada);
} while (d[N].mes_entrada > 12);

printf("Ano de Entrada: ");
scanf("%d", &d[N].ano_entrada);
}
void mostrar_dados (struct dados d[] ) {
char *ptr_nome, *ptr_morada, *ptr_sexo;
int *ptr_numero, *ptr_dia_nasc, *ptr_mes_nasc, *ptr_ano_nasc, *ptr_dia_entrada, *ptr_mes_entrada, *ptr_ano_entrada;

ptr_nome = d[N].nome;
ptr_morada = d[N].morada;
ptr_sexo = &d[N].sexo;
ptr_numero = &d[N].numero;
ptr_dia_nasc = &d[N].dia_nasc;
ptr_mes_nasc = &d[N].mes_nasc;
ptr_ano_nasc = &d[N].ano_nasc;
ptr_dia_entrada = &d[N].dia_entrada;
ptr_mes_entrada = &d[N].mes_entrada;
ptr_ano_entrada = &d[N].ano_entrada;

printf("Nome: %s\n", ptr_nome);
printf("Morada: %s\n", ptr_morada);
printf("Numero: %d\n", *ptr_numero);
printf("Sexo: %c\n", *ptr_sexo);
printf("Data de Nascimento: %d-%d-%d\n", *ptr_dia_nasc, *ptr_mes_nasc, *ptr_ano_nasc);
printf("Data de Entrada: %d-%d-%d\n", *ptr_dia_entrada, *ptr_mes_entrada, *ptr_ano_entrada);

}
main () {
struct dados inf [N];
inserir_dados(inf);
mostrar_dados(inf);
getch();
}
Link to comment
Share on other sites

HappyHippyHippo

não faço a mínima ideia de quem te ensinou a programar dessa maneira, no entanto, vamos ver se chegas a razão do problema se eu disser:

"os arrays em C tem como base de indexação o valor de 0, isto quer dizer que para obter o primeiro elemento do array, é necessário dar o valor de indireccionamento o valor numérico de zero (0)"

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

OMG! Que código BIZARRO é esse? Pra quê esse array se você vai fazer um único registro? Reza meu amigo. Anyway, parece-me que devia ao menos funcionar. Deixe-me compilar.

Ok. Esses ponteiros são o teu problema. Tira dali. Aliás não vejo qualquer motivo para usá-los.

Edited by GRSa
Link to comment
Share on other sites

Estão a querer dizer que era desnecessário usar a estrutura?

De facto pensei o mesmo quando comecei a fazer o programa.

Quanto aos ponteiros, nós começamos a dar ponteiros agora, ou seja, penso que esses exercícios ainda sejam básicos ou algo do género e o objetivo é mesmo perceber como utilizar os ponteiros.

Visto que o código está assim tão mau, poderiam-me dar a vossa opinião/dicas e explicar o porquê disso e por fim fazer o vosso código?

O exercício é este:

Capturar.png

Edited by Loismig
Link to comment
Share on other sites

HappyHippyHippo

Anyway, parece-me que devia ao menos funcionar. Deixe-me compilar.

muito pelo contrário.

Ok. Esses ponteiros são o teu problema. Tira dali. Aliás não vejo qualquer motivo para usá-los.

não, já foi dito que o código não faz muito sentido, mas isso é algo que mais tarde ou mais cedo, ele irá perceber.

agora dizer que o problema são os ponteiros é algo completamente errado.

o problema já foi referenciado:

"os arrays em C tem como base de indexação o valor de 0, isto quer dizer que para obter o primeiro elemento do array, é necessário dar o valor de indireccionamento o valor numérico de zero (0)"

o que falta aqui é a percepção que na declaração do array é necessário dar o número de elementos que o array tem

mas a referencia ao elemento do array é feito pelo índice que tem como valor inicial o valor numérico 0.

trocado por miúdos:

se declaras um array com 1 elemento:


struct dados inf [N];
[/Code]

então para aceder a esse elemento necessitas de dar o primeiro índice do array que é [b]zero (0)[/b]

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Não faça isso amigão. LOL

Let's break it down.

1 - Quando se declara

//#define N 1
struct dados inf[N]

um array de 1 posição é criado.

2 - No C o primeiro índice de um array é sempre 0.

3 - Logo, quando você quiser fazer referência à primeira (e a única) posição do array que você criou, tem de se fazer da seguinte maneira:

inf[0]

Não assim:

//#define N 1
inf[N] //Aqui a posição 1 não existe

Exemplo:

gets(d[0].nome);
Edited by GRSa
  • Vote 1
Link to comment
Share on other sites

Não faça isso amigão. LOL

Let's break it down.

1 - Quando se declara

//#define N 1
struct dados inf[N]

um array de 1 posição é criado.

2 - No C o primeiro índice de um array é sempre 0.

3 - Logo, quando você quiser fazer referência à primeira (e a única) posição do array que você criou, tem de se fazer da seguinte maneira:

inf[0]

Não assim:

//#define N 1
inf[N] //Aqui a posição 1 não existe

Exemplo:

gets(d[0].nome);

Muito obrigado, consegui compreender!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.