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

Hellblazzer

Tirar dados de um array de um tipo defenido

8 mensagens neste tópico

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[]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, tem. Ainda não demos listas ligadas nesta cadeira...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a ter uma cadeira de sistemas operativos e a usar C, sem nunca teres tido uma cadeira de C antes?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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];

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