• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

MarcelValente

duvida programa pontuacoes

6 mensagens neste tópico

Boa noite pessoal. tudo bem?

tenho uma duvida apenas numa parte do meu programa. Eu desenvolvi para um projecto um programa para gravar pontuacoes num jogo de sudoku.

tenho um ficheiro .txt chamado "tabela" que tem os seguintes dados:

mike 10

joel 20

jose 15

roberto 90

e o programa que fiz tem como objectivo pedir um nome e uma pontuacao, gravar no mesmo ficheiro (tabela.txt) e depois organizar por ordem crescente a informacao gravando num outro ficheiro.

O problema e que o programa quando vai gravar a informacao para o ficheiro tabela.txt nao grava bem a informacao que e introduzida pelo utilizador, na parte da pontuacao. Se puderem ver qual e o problema e dizer-me como corrigi-lo. E um pouco urgente..preciso disto para amanha.

obrigado.

o codigo e o seguint:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_REC 100
#define tam_nome 50

int main()
{
FILE *fp1;
FILE *fp2;

int scores[N_REC];
char nomes[N_REC][tam_nome+1];
char tmp[tam_nome+1];
int pontuacao, pontuacao2[50];
int contagem, i;
char nome2[50];

    fp1=fopen("tabela.txt", "a");

    printf("Introduza o seu nome:\n ");
    scanf("%s", &nome2);
    fgets(nome2,50,fp1);
    printf("Introduza a sua pontuacao:\n ");
    scanf("%d",&pontuacao2);
    fgets(pontuacao2,10,fp1);
    fprintf(fp1, "%s %d\n", nome2, pontuacao2);
    //fwrite(nome2 , 1 , sizeof(nome2) , fp1 );

    fclose(fp1);

// abrir ficheiro para leitura
fp1=fopen("tabela.txt","r");


// testar se o ficheiro esta bem aberto
if(fp1 == NULL) {
	printf("Falha na abertura do ficheiro!");
	return 1;
}

// ler todos os dados do ficheiro
for(contagem=0;!feof(fp1);contagem++){
	fscanf(fp1, "%s", tmp);
	fscanf(fp1, "%d", &pontuacao);

	strcpy(nomes[contagem], tmp);
	scores[contagem] = pontuacao;
}

// fechar o ficheiro
fclose(fp1);

// Ordenar registos
int flag = 1;
while(flag){
	flag = 0;
	for(i=0;i<contagem-1;i++){
		if(scores[i]>scores[i+1]){
			pontuacao = scores[i+1];
			scores[i+1] = scores[i];
			scores[i] = pontuacao;


			strcpy(tmp, nomes[i+1]);
			strcpy(nomes[i+1], nomes[i]);
			strcpy(nomes[i], tmp);
			flag = 1;
			break;
		}
	}
}

// abrir ficheiro para escrita
fp2=fopen("resultado.txt","w");

// testar se o ficheiro esta bem aberto
if(fp2 == NULL) {
	printf("Falha na abertura do ficheiro!");
	return 1;
}

// Imprimir resultado para o ficheiro
for(i=0;i<contagem;i++)
	fprintf(fp2, "%s %d\n", nomes[i], scores[i]);

fclose(fp2);
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o codigo e o seguint:

/* ... */
int main()
{
    FILE *fp1;
    FILE *fp2;

    int scores[N_REC];
    char nomes[N_REC][tam_nome+1];
    char tmp[tam_nome+1];
    int pontuacao, pontuacao2[50];
    int contagem, i;
    char nome2[50];

    fp1=fopen("tabela.txt", "a");

    printf("Introduza o seu nome:\n ");
    scanf("%s", &nome2);                              /* 1) */
    fgets(nome2,50,fp1);                              /* 2) */
    printf("Introduza a sua pontuacao:\n ");
    scanf("%d",&pontuacao2);                          /* 3) */
    fgets(pontuacao2,10,fp1);                         /* 4) */
    fprintf(fp1, "%s %d\n", nome2, pontuacao2);       /* 5) */
    /* ... */
}

1) O parametro para o scanf devia ser um `char *` (ou um `char []`). Como puseste lá o &, o que estás a passar é um `* char[]`.

O scanf "normalmenta" leva o & para especificar o endereço de memória onde guardar o valor lido.

Acontece que um array de char, quando especificado pelo seu nome, já representa o ponteiro para o primeiro valor do array -- e, muitas vezes, o & acaba por dar erro

2) Logo a seguir ao scanf, substituis o valor de `nome2` por outra coisa. Para que é o scanf?

3) O mesmo que 1)

4) O fgets não lê `int`s. pontuacao2 é um array de ints. Não o podes passar para o fgets. A opção de usar o scanf é boa, mas tem de ser corrigida.

5) `pontuacao2` é um array de ints. Quando usado sem nada á frente ou atrás (como no teu printf) o valor dele é o ponteiro para o primeiro elemento do array. O formato "%d" do printf espera receber um `int` e estás a passar-lhe um ponteiro.

A partir daqui, os dados que estão no ficheiro não são fiáveis.

Não estive com atenção a ler o resto do teu código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
o programa que fiz tem como objectivo pedir um nome e uma pontuacao, gravar no mesmo ficheiro (tabela.txt) e depois organizar por ordem crescente a informacao gravando num outro ficheiro.

Sugestão:

Separa o teu programa em diferentes funções

a) função para pedir um nome e pontuação

:P gravar nome e pontuação

c) organizar por ordem crescente

d) gravar noutro ficheiro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas. Eu tentei fazer essas alteracoes e usei apenas os scanf's. Mesmo assim da erro! ele grava bem o nome mas kando grava a pontuacao grava uma data d numeros tipo 2278564 em vez da pontuacao k e pedida. Pods ajudar-me a corrigir esse erro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não precisas da variável `pontuacao2` para nada.

Já tens uma variável `pontuacao` que é do tipo int. Podes usar essa para ler do ficheiro.

scanf("%d", &pontuacao);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim..ja alterei e funcionou..tive k fazr algumas alteracoes mas ja consegui.

obrigado pela ajuda!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora