1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

remover coisas de um vector com shift left

Discussão em 'Programação' iniciada por S|N, 15 de Abril de 2005. (Respostas: 8; Visualizações: 1178)

  1. S|N

    S|N Power Member

    Olá a todos. Alguem sabe como faço para remover coisas de um vector com ponteiros? Este é o exercício:



    void main(void)
    {
    int nalunos;
    int numero[Max_Alunos];
    int opcao;
    nalunos=0;
    carregar_ficheiro();
    do
    {
    menu();
    scanf("%d",&opcao);
    switch (opcao)
    {
    case 1: op_inscrever_aluno(&nalunos,numero); break;
    case 2: op_remover_aluno(&naluno,numero); break;
    case 3: op_listar_alunos(nalunos,numero); break;
    }
    while(opcao!=0);
    guardar_ficheiro();
    }
    }

    void remover_aluno(int *nalunos, int numero[])
    {
    fflush(stdin);
    printf("Qual o numero do aluno?");
    scanf("%d",&numero[*nalunos]);
    }

    O prof disse: "percorre o vector ate encontrares o numero dele. pois apaga fazendo um shift left..." depois desenhou um boneco no meu caderno :|
    Não percebi grande coisa.
    Alguem ajude-me
     
  2. S|N

    S|N Power Member

    É no

    void remover_aluno(int *nalunos, int numero[])

    que tenho dificuldades

    Obrigado!
     
  3. NoMercy

    NoMercy Power Member

    bit shift?? será??
    tipo:
    a <<= 5
    ou
    a << b
     
  4. S|N

    S|N Power Member

    Não sei. Sei que há qq coisa assim: (*nalunos)--; -> isto encolhe o vector.
    agora a parte de remover o que quero é que não sei comom fazer.
    A ideia é:

    - O utilizador diz o numero do aluno que quer remover;
    - O programa vai ao vector e "encontra" o tal aluno;

    -a) O programa remove o aluno e depois encolhe o vector: (*nalunos)--;
    ou
    -b)O programa remove o aluno encolhendo o vector (por esmagamento) (acho que é esta mesmo q o prof quer)

    Please help. Thanks
     
  5. Karmack

    Karmack Power Member

    Um vector tem sempre o mesmo tamanho. O que podes fazer é:
    - Usar listas ligadas
    - Alocar um novo vector na heap, copiar o velho vector para o novo e deitar fora o velho caso esteja na heap.


    O melhor é guardares o numero de alunos. Se o aluno a remover não está na ultima posição então copias as posições seguintes à posição do aluno a remover para a posição anterior.
    Se calhar é isso que o professor quer.
    Mas se queres surpreender o homem usa listas ligadas :D .
     
  6. PrOdG

    PrOdG Power Member

    Concordo com o Karmack, o teu professor não deve querer que "encolhas" o vector, para isso usavas listas. Em relação ao código, eu faria qualquer coisa do género:
    Código:
    void remove_aluno(int nalunos, int numero[] ) {
        int i = 0 ;
        while (numero[i] != nalunos) 
            i++ ;
        
        while (i != (VECTOR_SIZE - 1)) {
            numero[i] = numero[i+1] ;
            i++ ;  
        }
        
        numero[i] = NULL ;
    } 
    Não testei o código, portanto pode haver erros a solucionar, mas encara isto como um possível guideline. A ideia é posicionar o counter i na posição do número nalunos, depois a partir daí ires fazendo shift-left.
    VECTOR_SIZE é o tamanho do vector numero.
    A última posição fica a NULL (se o vector não estiver cheio esta parte do código não funciona a 100%, mas com uma variável que contém o número de casas cheias do vector numero arranjas isso facilmente :P).
     
    Última edição: 15 de Abril de 2005
  7. S|N

    S|N Power Member

    Muito Obrigado pelos vossos replies. Vou testar as vossas ideias :D
     
  8. S|N

    S|N Power Member

    Podes-me explicar como funcionam os apontadores como parametros de funções?

    Iniciamente o programa funcionaria com vectores globais, mas o prof já n quer isso. Agora iniciou-nos aos apontadores...

    Como faria o procedimento para ler do ficheiro (para preencher os vectores)?
    Tenho um exemplo muito bom e que funciona (fui eu que fiz tb com a vossa ajuda) mas era feito com vectores globais:

    void carregar_struct(void)
    {
    FILE *fich;
    fich=fopen("galeria.txt","r");
    int indice;
    while(!feof(fich))
    {
    for (indice=0;(indice<dimensaoQ);indice++)
    {
    fgets(nomeQuadro[indice],dimensaoC+1,fich);
    nomeQuadro[indice][strlen(nomeQuadro[indice])-1]='\0';
    fgets(nomePintor[indice],dimensaoC+1,fich);
    nomePintor[indice][strlen(nomePintor[indice])-1]='\0';
    fscanf(fich,"%d",&transacao[indice]);
    fscanf(fich,"%d",&mercado[indice]);
    fscanf(fich,"%d\n",&falecido[indice]);
    }
    }
    fclose(fich);
    }


    É certo q tambem poderia usar scanf("%['\n']") para o obrigar a ler tudo menos os \n mas usei o fgets e tirei-lhe o '\n' no fim esmagando com o '\0'.

    Mas aqui o problema é outro. Eu não tou acostumado a usar vectores como parametros de entrada.. :(

    Sei que int *p significa dizer que a variavel p aponta para um inteiro.
    Sei que p=&c significa que p aponta para o espaço em memória de c.
    *p dá-me o valor de c.

    Mas no caso dos vectores como parametros algo diferente se passa.
    Alguem pode-me explicar isto de modo simples?
    Como ficaria a função para ler do ficheiro no caso de ter que se usar apontadores e não vectores globais?
    Mais uma vez Obrigado!
     
  9. HiGhVoIcE

    HiGhVoIcE Power Member

    caso p seja vector definido noutro lado, podes sempre recebe-lo assim:

    void funcao(int *p, int max) /* funçao generica de exemplo */

    em que 'int *p' é o vector e 'int max' é o comprimento do vector

    Atençao: sempre que passas um vector por apontador tens que passar tambem o seu comprimento maximo senao nunca vais saber onde este acaba :P
     

Partilhar esta Página