Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal estou com um problema ao criar um programa que leia 15 numeros inteiros e ordene eles em um vetor de 15 posiçoes, primeiros os numeros pares e depois o impares, tentei usar aritmetica de ponteiro e agora apenas usando 2 variaveis aux, mas o sempre ocorre o mesmo erro, os impares separam certinho mas o par, ele separa e depois de separar coloca os resto dos numeros depois deles denovo, segue meu codigo pra quem puder me ajudar.
#include <stdlib.h>
#include <stdio.h>
int main(){
int vetor[30];
int i;
for(i=0;i<=29;i++)
{
vetor[i] = 0;
}
int auxpar = 0;
int auximpar = 29;
for(i=0;i<=14;i++)
{
printf("entre com um valor inteiro para a %d posicao do vetor: ",i+1);
scanf("%i",&vetor[i]);
if((vetor[i] % 2)==1){
vetor[auximpar] = vetor[i];
auximpar--;
}else{
vetor[auxpar] = vetor[i];
auxpar++;
}
}
printf("\n\n");
for(i=0;i<=29;i++)
{
printf("%d - %p\n",vetor[i],&vetor[i]);
}
}>
for(i=0;i<=29;i++) {
vetor[i] = 0;
}
A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset
http://www.lainoox.com/c-memset-examples/
Por que você está criando um array com 30 posições? Crie um com 15 posições, leia e depois execute um algoritmo de ordenação qualquer em cima dele mesmo.
Criei um array maior para a visualizaçao dos pares de uma lado e os impares de outro com numeroes zeros entre eles, so pra efeito de visualizaçao, depois voltaria a deixa-lo no tamanho 15
Criei um array maior para a visualizaçao dos pares de uma lado e os impares de outro com numeroes zeros entre eles, so pra efeito de visualizaçao, depois voltaria a deixa-lo no tamanho 15
Trabalho desnecessário.
Faça o que o exercício pede. Vai ter tempo suficiente no restante do curso p/ fazer coisas mais complicadas.
Você tem duas opções:
1- Ir separando os pares dos ímpares à medida que for lendo os inteiros e depois, ao final da leitura, utilizar um método de ordenação qualquer passando as posições iniciais e finais dos "sub-arrays".
2- Ir ordenando os "sub-arrays" à medida que for lendo (precisa de mais variáveis p/ dar conta do início e final de cada "sub-array")
#include <stdio.h>
#define MAX 10
void leitura(int array, int final_pares, int *inicio_impares) {
int i;
int tmp_leitura;
for(i=0; i<MAX; i++) {
printf("Informe o %dº inteiro:",i+1);
scanf("%d", &tmp_leitura);
if (!tmp_leitura) continue; // Evitando o zero.
if ((tmp_leitura % 2) == 0) { // Armazenamento dos pares.
array[(*final_pares)+1] = tmp_leitura;
(*final_pares)++;
} else {
array[(*inicio_impares)-1] = tmp_leitura;
(*inicio_impares)--;
}
}
}
void impressao(const int * array) {
int i;
for(i=0; i<MAX; i++) {
printf("%d%c", array[i], (i==MAX-1)?'\n':' ');
}
}
void ordenar(int * array, int inicio, int final) {
int i,j;
int tmp;
for(i=inicio+1; i<final; i++) {
tmp = array[i];
j = i-1;
while ((j>=inicio) && (tmp < array[j])) {
array[j+1] = array[j];
j--;
}
array[j+1] = tmp;
}
}
int main(void) {
int numeros[MAX];
int final_pares, inicio_impares;
final_pares = -1;
inicio_impares = MAX;
leitura(numeros, &final_pares, &inicio_impares);
puts("Array lido:");
impressao(numeros);
ordenar(numeros, 0, inicio_impares);
ordenar(numeros, inicio_impares, MAX);
puts("Array ordenado:");
impressao(numeros);
return 0;
}>
#include <stdio.h>
#define MAX 10
void leitura(int array, int final_pares, int *inicio_impares) {
int i;
int tmp_leitura;
for(i=0; i<MAX; i++) {
printf("Informe o %dº inteiro:",i+1);
scanf("%d", &tmp_leitura);
if (!tmp_leitura) continue; // Evitando o zero.
if ((tmp_leitura % 2) == 0) { // Armazenamento dos pares.
array[(*final_pares)+1] = tmp_leitura;
(*final_pares)++;
} else {
array[(*inicio_impares)-1] = tmp_leitura;
(*inicio_impares)--;
}
}
}
void impressao(const int * array) {
int i;
for(i=0; i<MAX; i++) {
printf("%d%c", array[i], (i==MAX-1)?'\n':' ');
}
}
void ordenar(int * array, int inicio, int final) {
int i,j;
int tmp;
for(i=inicio+1; i<final; i++) {
tmp = array[i];
j = i-1;
while ((j>=inicio) && (tmp < array[j])) {
array[j+1] = array[j];
j--;
}
array[j+1] = tmp;
}
}
int main(void) {
int numeros[MAX];
int final_pares, inicio_impares;
final_pares = -1;
inicio_impares = MAX;
leitura(numeros, &final_pares, &inicio_impares);
puts("Array lido:");
impressao(numeros);
ordenar(numeros, 0, inicio_impares);
ordenar(numeros, inicio_impares, MAX);
puts("Array ordenado:");
impressao(numeros);
return 0;
}
Nossa seu algoritmo ficou muito bem estruturado, vou levar um tempo analisando ele, muito obrigado pela ajuda!!
>
for(i=0;i<=29;i++) {
vetor[i] = 0;
} A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset
http://www.lainoox.com/c-memset-examples/
Pra inicializar tipos compostos, sugiro:
T a[i][j][k]... = { 0 };
Essa inicialização é bem-definida conforme 6.7.9 (n12570) ou 6.7.8 (n1256).
[/code]
A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset
http://www.lainoox.com/c-memset-examples/
Por que você está criando um array com 30 posições? Crie um com 15 posições, leia e depois execute um algoritmo de ordenação qualquer em cima dele mesmo.