remover coisas de um vector com shift left

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
 
NoMercy disse:
bit shift?? será??
tipo:
a <<= 5
ou
a << b

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
 
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 .
 
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:
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!
 
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
 
Back
Topo