Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ricardo gomes araujo

Operações com vetores

Recommended Posts

Boa noite,

 

Estou tendo problemas para construir o seguinte programa:

 

O usuário seleciona por exemplo a opção 1 e o programa deverá inserir um valor na primeira posição do vetor

se o usuário selecionar a opção 2 o programa deverá inserir um valor na última posição do vetor.

 

Preciso também excluir o último elemento do vetor.

 

E o usuário deverá ir selecionando somente as opções 1 e 2 para preencher todo o vetor.

Se o vetor for completamente preenchido deverá informar ao usuário que o vetor está completamente cheio com todas

as posições inseridas.

 

No entanto não posso utilizar listas somente vetores e funções. Não posso utilizar as estruturas de dados mais conhecidas como fila ou lista.

 

Segue o que consegui fazer

 

Alguém poderia me ajudar nesse algoritmo?


#include <stdio.h>
#include <stdlib.h>
 
int menu(void);
void opcao(int op);
void inicio(int *v, int t); 
void final(int *v, int t); 
void mostrar(int t, int *v);
int excluir(int n, int *t, int *v); 
void ordena(int t, int *v);
 
int main(){
    int op;
 
    do{
op = menu();
opcao(op);
}while(op);
 
        system("cls");
        printf("\n\n");
        system("pause");
 
}
 
int menu(void){
int op;
 
printf("Escolha uma opcao\n");
printf("1. Adicionar no inicio\n");
printf("2. Adicionar no final\n");
printf("3. Exibir\n");
printf("4. Ordena\n");
printf("5. Excluir valor fim\n");
printf("0. Sair\n");
printf("Opcao: ");
    scanf("%d", &op);
 
return op;
}
 
void opcao(int op) {
    int t;
    int vetor[10];
    int tam = 10 - 1;
 
    t = 0;
 
    switch(op){
 
        case 1:
            inicio(vetor, t);
break;
        case 2:
            final(vetor, t);
break;
        case 3:
mostrar(t,vetor);
break;
case 4:
   ordena(t,vetor);
break;
        case 5:
if(excluir(tam,&t, vetor) == 1) {
                 printf("Ultimo elemento do vetor foi excluido");
            } else {
                 printf("Nao foi possivel excluir o ultimo elemento");
             }
            break;
   case 0:
break;
 
default:
printf("Operacao invalida\n\n");
}
}
 
void inicio(int *v, int t) {
 
    int i, n, aux, pos, c;
    int *p;
 
    aux = 20;
 
    p = malloc(aux*sizeof(int));
 
    if(!p) {
        printf("Memoria insuficiente!!!\n");
        return;
    }
 
    printf("Informe um valor para inserir\n");
    scanf("%d", &n);
    printf("Informe a posicao do elemento\n");
    scanf("%d", &pos);
 
    printf("Vet");
    for (c = n - 1; c >= pos - 1; c--) {
      p[c+1] = p[c];
   }
 
   p[pos-1] = n;
 
   printf("Vet com valor \n");
 
   for (c = 0; c <= n; c++) {
      printf("%d\n", p[c]);
   }
 
    free(p);
 
}
 
void final(int *v, int t) {
    int i, n, aux, pos, c;
    int *p;
 
    aux = 20;
 
    p = malloc(aux*sizeof(int));
 
    if(!p) {
        printf("Memoria insuficiente!!!\n");
        return;
    }
 
    printf("Informe um valor para inserir\n");
    scanf("%d", &n);
    printf("Informe a posicao do elemento\n");
    scanf("%d", &pos);
 
    printf("Vet");
    for (c = n - 1; c >= pos - 1; c--) {
      p[c+1] = p[c];
   }
 
   p[pos-1] = n;
 
   printf("Vet com valor \n");
 
   for (c = 0; c <= n; c++) {
      printf("%d\n", p[c]);
   }
 
    free(p);
 
}
 
void mostrar(int t, int *v){
    int i;
    for(i = 0; i < t; i++){
        printf("%d ", v[i]);
    }
    printf("\n");
}
 
int excluir(int n, int *t, int *v){
    int i;
    for (i = 0; i < *t; i++ ){
        if (v[i] == n) {
            *t -= 1;
            while (i < *t){
                v[i] = v[i + 1];
                i++;
            }
            return 1;
        }
    }
 
    return 0;
}
 
void ordena(int t, int *v) {
 
   int fim,i;
 
    for (fim = t-1; fim > 0; fim--) {
 
    int troca = 0;
 
        for (i=0; i<fim; i++)
            if (v[i]>v[i+1]) {
                int temp = v[i];
                v[i] = v[i+1];
                v[i+1] = temp;
                troca = 1;
            }
            if (troca == 0)
                return;
    }
 
}
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando tento inserir no início o programa não funciona só insere na posição que informo.

 

Já tentei fazer desta maneira também tanto para inserir no inicio quanto no final e não funciona.

 

 

int inicio(int i, int numero, int n, int v[]) {   int j;    for (j = n; j > i; j--)        v[j] = v[j-1];      v[i] = numero;    return n + 1;    } 

Inserir final

 

 

int inicio(int i, int final, int n, int v[]) {   int j;    for (j = n; j > i; j--)        v[j] = v[ji];      v[i] = numero;    return n - 1;    } 

Poderia me ajudar? Já estou tentando terminar este programa por completo a algum tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê uma olhada na função inserir.
A ordenação eu usei uma pronta que existe na stdlib.h (em livros você vai encontrar o assunto de ponteiros p/ funções listado nas coisas avançadas)

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#define MAX 5

void menu(void) {
	puts("1- Inserir valor na primeira posição.");
	puts("2- Inserir valor na última posição.");
	puts("3- Exibir vetor.");
	puts("4- Ordenar vetor.");
	puts("5- Excluir último elemento.");
	puts("0- Sair.");
}

int localizar_primeira_posicao_vazia(int * vetor, int elementos_ctn) {
	int i;
	for(i=0; i<elementos_ctn && vetor[i] != INT_MIN; i++);
	return i;
}

void inserir(int opcao, int elemento, int * vetor, int * elementos_ctn) {
	int aux;

	if ((*elementos_ctn) == MAX) {
		puts("Vetor cheio.");
	} else {
		aux = localizar_primeira_posicao_vazia(vetor, (*elementos_ctn));

		if (opcao == 1) {
			for(int i=aux; i>0; i--) {
				vetor[i] = vetor[i-1];
			}
			vetor[0] = elemento;

		} else {
			vetor[aux] = elemento;
		}

		(*elementos_ctn) = (*elementos_ctn) + 1;
	}
}

void exibir(int * vetor) {
	for(int i=0; i<MAX; i++) {
		if (vetor[i] != INT_MIN)
			printf("%d ", vetor[i]);
	}
	puts("");
}


void excluir_ultimo(int * vetor, int * elementos_ctn) {
	vetor[(*elementos_ctn)-1] = INT_MIN;
	(*elementos_ctn) = (*elementos_ctn) - 1;
}

int compare_function(const void * a, const void * b) {
	return ( *(int*)a - *(int*)b );
}

int main(int argc, char const *argv[]) {
	int opcao;
	int vetor[MAX];
	int elementos_ctn = 0;

	for(int i=0; i<MAX; vetor[i]=INT_MIN, i++);

	while (1) {
		menu();
		printf("Opção: ");
		scanf("%d", &opcao);

		if (opcao == 1 || opcao == 2) {
			int elemento;
			printf("Informe o elemento: ");
			scanf("%d", &elemento);

			if (elemento == INT_MIN) {
				puts("Informe outro elemento. Este número está reservado.");
			} else {
				inserir(opcao, elemento, vetor, &elementos_ctn);
			}

		} else if (opcao == 3) {
			printf("Vetor (dados válidos): ");
			exibir(vetor);

		} else if (opcao == 4) {
			qsort(vetor, elementos_ctn, sizeof(int), compare_function); // http://www.cplusplus.com/reference/cstdlib/qsort/

		} else if (opcao == 5) {
			excluir_ultimo(vetor, &elementos_ctn);

		} else if (!opcao)
			break;
	}
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.