Ir para o conteúdo
Hellblazzer

Tirar dados de um array de um tipo defenido

Mensagens Recomendadas

Hellblazzer    0
Hellblazzer

Boas pessoal.

Estou a fazer a primeira parte de um trabalho de Sistemas Operativos, C em Linux...

Armazena informação de várias equipas desportivas (SLB, SCP, FCP, etc)....

Tenho o seguinte código:

#include <stdio.h>
#include <string.h>
typedef struct _tipo {
    char  equipa[20];
    int jogos;
    int gmarcados;
    int gsofridos;
    int pontos;    
}
equipas;

equipas x[16]; //array de "equipas" com 16 elementos.

main() {
    int opcao;     //para o switch case
    int ne = 0;    //variavel para contar as equipas
    
    do {
    
    printf ("Escolha uma opção: \n");
    printf (" 1. Inserir \n 2. Lista \n 3. Apagar \n 4. Gravar e sair\n");
    int i = 0;
    char f[2];                                             //Não tem utilidade concreta, segundo o meu prof 
    scanf ("%d", &opcao); fgets (f, 2, stdin);   //é para "limpar" a scanf senão no case 1 não lê

    
    switch (opcao) {
    case 1: printf ("Insira o nome da equipa: \n ");
        char nomee[20];                        //Variável temporária
        fgets (nomee, 20, stdin);
        strcpy ( x[ne].equipa , nomee);
    
        printf ("Insira o nº de jogos da equipa:\n");
        scanf ("%d" , &x[ne].jogos);
        
        printf ("Insira o nº de golos sofridos pela equipa:\n");
        scanf("%d" , &x[ne].gmarcados );

        printf ("Insira o nº de golos sofridos pela equipa:\n");
        scanf("%d", &x[ne].gsofridos );

        printf ("Insira a pontuação da equipa:\n");
        scanf ("%d", &x[ne].pontos );

        ne++;             //a cada equipa inserida aumenta a contagem do número das mesmas

        break;
    case 2:    
        printf("Lista de equipas: %d \n", ne );   //somente para apresentar os nomes das equipas
            for ( i = 0; i < ne ; i++)
            printf ("%s", x[i].equipa ,"\n");
        break;    
    case 3:
        
    case 4: //Grava o nome das equipas num ficheiro e sai.
        printf("O programa vai guardar dados e sair.\n");
        FILE *f;
        f = fopen ("Tabela.txt", "w");
        int i = 0;
        fprintf (f, "%d" , ne);
        fprintf(f, "\n");
        for ( i = 0 ; i < ne ; i++ ) {
            fprintf(f, "%s %d %d %d %d ",  x[i].equipa, x[i].jogos, x[i].gmarcados, x[i].gsofridos, x[i].pontos  );
            fprintf (f , "\n");
        }
        fclose(f);
        break;
    }
    } while (opcao != 4);
    }

Qualquer sugestão é bem vinda.

Aqui:

printf (" 1. Inserir \n 2. Lista \n 3. Apagar \n 5. Gravar e sair\n");

A opção apagar, serve para eliminar uma equipa do array introduzindo o seu nome.

Já fiz isto em Java até... mas estou estupidamente esquecido  :-[

Alguém me dá uma dica?

Faço um for para precorrer o array à procura de um x.equipa = nome introduzido?

Tipo:

for (bla bla bla)
     if strcmp(x[i].equipa, nomeintroduzido) == 0 ;

E depois o código para apagar a respectiva equipa do array?

Que se alguém tivesse a gentileza, também agradecia imenso que me desse alguma dica.

Agradecia mesmo toda a ajuda que me pudessem dar.

Cumps[]

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

Tem que ser um array? Não podes fazer isso com listas ligadas?

É que com um array, se quiseres apagar a equipa na 3ª posição, vais ter que andar a copiar o resto das equipas para trás, e com uma lista era só alterar 1 ou 2 apontadores.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Para apagar uma equipa do array precisas de deslocar todas as seguintes uma posição para trás.

Se usasses apontadores, facilitava essa operação. Assim, tens que copiar a estrutura toda, e a forma mais simples deve ser usando um memcpy.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Hellblazzer    0
Hellblazzer

Exacto. Estamos a dar C agora. Já demos apontadores mas não usámos muito e ainda não pratiquei, daí perguntar como e se é a sintax que mete asteriscos. Ordinariamente falando...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Com os apontadores passas a ter que alocar o espaço dinamicamente, e só armazenas no array um apontador para a estrutura, em vez de colocares lá a estrutura.

Por exemplo, para inserir uma nova equipa começavas com:

equipas* tmp=(equipas*)malloc(sizeof(equipas));
x[ne]=tmp;

fgets(tmp->nome,20,stdin);

...

printf ("Insira o nº de jogos da equipa:\n");
scanf ("%d",&(tmp->jogos));

...

A vantagem seria depois quando quisesses mudar uma equipa de posição. Mudar uma equipa da posição p1 para a posição p2 resume-se a:

x[p2]=x[p1];

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade