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

Hellblazzer

Tirar dados de um array de um tipo defenido

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.


Desaparecido.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
pedrosorio

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


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
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...

Share this post


Link to post
Share on other sites
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];

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

×

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.