Jump to content
Loismig

O Programa no fim deixa de funcionar

Recommended Posts

Loismig

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();
}

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
Loismig

A programação está assim tão má?

Quanto a parte dos arrays, quando os declaro tenho que meter = 0?

Share this post


Link to post
Share on other sites
GRSa

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

Share this post


Link to post
Share on other sites
Loismig

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
Loismig

struct dados inf [0];

Problema resolvido, obrigado!

Mas agora fiquei a pensar na minha programação, como poder melhorar o código?

Share this post


Link to post
Share on other sites
HappyHippyHippo

struct dados inf [0];

Problema resolvido, obrigado!

Mas agora fiquei a pensar na minha programação, como poder melhorar o código?

nop ... só pioraste ainda mais o problema ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Loismig

Pois, eu vi logo que não fazia muito sentido

É que o programa já não deixou de funcionar!

Share this post


Link to post
Share on other sites
GRSa

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

Share this post


Link to post
Share on other sites
Loismig

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!

Share this post


Link to post
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

×
×
  • 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.