Ordenação em C [RESOLVIDO]

1. Ordenação em C [RESOLVIDO]

Gustavo Boff
GustavoBDR

(usa Ubuntu)

Enviado em 16/04/2016 - 12:18h

Olá galera!!

Preciso ordenar um vertor de modo crescente. Fiz da seguinte forma:

for (i = 0; i < 10; i++) {
if (v_codigo[i] > v_codigo[i+1]) {
cod_aux = v_codigo[i];
v_codigo[i] = v_codigo[i+1];
v_codigo[i+1] = cod_aux;
cod_aux = 0;
}
for (i = 0; i < 10; i++) {
printf("Codigos: %d\n",v_codigo[i]);
}
}
Porém está dando errado, ele apenas imprime os valores do mesmo modo que foi lido pelo scanf.

Desde já obrigado!!!!! (Ele perde a identeção ao publicar o post, desculpem.)




Codigo completo:

#include <stdio.h>

int main(int argc, const char *argv[])
{
int v_opcao,j=0,i=0,c=0,cod_aux=0;
int v_codigo[10], v_qtd[10];
float v_preco[10];
char v_opcao2;

for (i = 0; i < 10; i++) {
v_codigo[i] = 0;
v_qtd[i] = 0;
v_preco[i] = 0.00;
}
i=0;


void fnc_inclui_produto()
{

printf("Digite o codigo que deseja incluir:\n");
scanf("%d",&v_codigo[c]);

printf("\nO numero digitado foi: %d\n",v_codigo[c]);
c = c+1;

}

void fnc_relatorio()
{
printf("Opcoes de relatorio:\n\n");
printf("a) Relatorio completo (cod)\n");
printf("b) Relatorio categoria (preco)\n");
printf("c) Relatorio estoque por categoria\n");
printf("d) Relatorio estoque baixo\n");
printf("d) Relatorio surpresa\n");
scanf(" %c",&v_opcao2);
system("clear");

switch (v_opcao2)
{
case 'a':
/*
for (i = 0; i < 10; i++) {
printf("Codigo: %d\n",v_codigo[i]);
}*/
for (i = 0; i < 10; i++) {

if (v_codigo[i] > v_codigo[i+1]) {
cod_aux = v_codigo[i];
v_codigo[i] = v_codigo[i+1];
v_codigo[i+1] = cod_aux;
cod_aux = 0;
}
for (i = 0; i < 10; i++) {
printf("Codigos: %d\n",v_codigo[i]);
}
}

break;
}
}

while (v_opcao != 6)
{
puts("Menu");
printf("Escolha a opcao desejada:\n\n");
printf("1)Incluir livro\n");
printf("2)Excluir livro\n");
printf("3)Alterar preco de um livro\n");
printf("4)Alterar estoque de um livro\n");
printf("5)Relatorios\n");
printf("6)Sair\n");
scanf("%d",&v_opcao);
system("clear");

switch (v_opcao)
{
case 1:
fnc_inclui_produto();
break;
case 5:
fnc_relatorio();
break;
}
}
return 0;
}



  


2. MELHOR RESPOSTA

Paulo Henrique
MrCrawl3r

(usa Ubuntu)

Enviado em 16/04/2016 - 17:49h

	for (i = 0; i < 10; i++) {
if (v_codigo[i] > v_codigo[i+1]) {
cod_aux = v_codigo[i];
v_codigo[i] = v_codigo[i+1];
v_codigo[i+1] = cod_aux;
cod_aux = 0;
}
for (i = 0; i < 10; i++) {
printf("Codigos: %d\n",v_codigo[i]);
}
}


Parece que está tentando implementar o bubble sort, tem um problema que não deve ter percebido em seu código é que ele começa da primeira posição até a ultima comparando de 2 em 2, mas quando ele chega no final você tem o ultimo elemento no lugar que deve estar e só. Ou seja, seu vetor está parcialmente ordenado. Para corrigir isso, faça a ordenação pela segunda vez (daí os dois ultimos estão na ordem certa), terceira vez... até estar tudo ordenado.

--------------------------------------------------
Att,
Mr Crawler.

O mundo depende dos computadores. Tenha total domínio sobre os computadores e domine o mundo!

3. Re: Ordenação em C [RESOLVIDO]

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 16/04/2016 - 16:27h

GustavoBDR escreveu:

Olá galera!!

Preciso ordenar um vertor de modo crescente. Fiz da seguinte forma:

for (i = 0; i < 10; i++) {
if (v_codigo[i] > v_codigo[i+1]) {
cod_aux = v_codigo[i];
v_codigo[i] = v_codigo[i+1];
v_codigo[i+1] = cod_aux;
cod_aux = 0;
}
for (i = 0; i < 10; i++) {
printf("Codigos: %d\n",v_codigo[i]);
}
}
Porém está dando errado, ele apenas imprime os valores do mesmo modo que foi lido pelo scanf.

Se o contexto for acadêmico, faça um teste de mesa no seu código para ver o que o seu algoritmo de fato faz, em seguida, estude mais lógica de programação e algoritmos de ordenação.
Se o contexto é profissional, procure por blibliotecas de ordenação prontas e bem testadas.



4. Re: Ordenação em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/04/2016 - 17:39h

No ato da criação da postagem, abaixo da palavra mensagem, há uns botões para dar uma incrementada na postagem.
Veja o botão </> que quando se clica nele aparecem duas tags code, abre e fecha.
Com elas você indenta o código.

Não aparecem os botões quando se tenta editar a postagem.
Daí code tem que ser colocado à mão.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: Ordenação em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/04/2016 - 20:25h

Um dos algoritmos de ordenação mais fáceis de entender se chama Bubble Sort.

O laço de repetição que você fez parece com uma parte do Bubble Sort, mas falta outro pedaço. E mesmo o pedaço que está presente tem um erro: na última iteração do laço de repetição, você compara o último elemento com um elemento que está depois do último (um array com 10 elementos tem índices de 0 a 9; mas quando você compara o elemento com índice nove com o elemento seguinte, comete um erro).


6. Ordenação bubble sort

Gustavo Boff
GustavoBDR

(usa Ubuntu)

Enviado em 17/04/2016 - 09:06h

Seguindo as dicas modifiquei o código.
Entendi a necessidade de dois "For" já que comparamos valores só de dois em dois, precisamos de uma verificação adicional de todo o vetor. Foi o que tentei fazer abaixo, porém ainda sem sucesso.

Vejam como ficou:

#include <stdio.h>

int main(int argc, const char *argv[])
{
int v_opcao,a=0,j=0,i=0,c=0;

int v_cod = 0; //auxiliares

int v_codigo[10], v_qtd[10];
float v_preco[10];
char v_opcao2;

for (i = 0; i < 10; i++) {
v_codigo[i] = 0;
v_qtd[i] = 0;
v_preco[i] = 0.00;
}
i=0;


void fnc_inclui_produto()
{

printf("Digite o codigo que deseja incluir:\n");
scanf("%d",&v_codigo[c]);

printf("\nO numero digitado foi: %d\n",v_codigo[c]);
c = c+1;

}

void fnc_relatorio()
{
printf("Opcoes de relatorio:\n\n");
printf("a) Relatorio completo (cod)\n");
scanf(" %c",&v_opcao2);
system("clear");


switch (v_opcao2)
{
case 'a':

for(i=0 ; i<10 ; i++){

for(j=0 ; j<10 ; j++){

if (v_codigo[j]>v_codigo[j+1]){

v_cod = v_codigo[j];
v_codigo[j] = v_codigo[j+1];
v_codigo[j+1] = v_cod;

}
}
}

for (i = 0; i < 10; i++) {
printf("Codigos: %d \n",v_codigo[i]);
}

break;
}
}

while (v_opcao != 6)
{
puts("Menu");
printf("Escolha a opcao desejada:\n\n");
printf("1)Incluir livro\n");
printf("5)Relatorios\n");
printf("6)Sair\n");
scanf("%d",&v_opcao);
system("clear");

switch (v_opcao)
{
case 1:
fnc_inclui_produto();
break;
case 5:
fnc_relatorio();
break;
}
}
return 0;
}


7. Consegui!!!

Gustavo Boff
GustavoBDR

(usa Ubuntu)

Enviado em 17/04/2016 - 12:25h

Galera obrigado!!

Graças a todas as ajudas eu consegui. Era só colocar o segundo for até 9:

for(i=0 ; i<10 ; i++){

for(j=0 ; j<9 ; j++){

if (v_codigo[j]>v_codigo[j+1]){

v_cod = v_codigo[j];
v_codigo[j] = v_codigo[j+1];
v_codigo[j+1] = v_cod;

}
}
}




8. RESOLVIDO

Paulo Henrique
MrCrawl3r

(usa Ubuntu)

Enviado em 17/04/2016 - 12:58h

Fico feliz em ter ajudado!
Já que conseguimos resolver sua dúvida, marque o tópico como RESOLVIDO, isso ajuda na organização do Fórum.

Vou deixar algumas considerações que achei interessante mencionar neste tópico:

Existem muitos algorítmos de ordenação, este que você pediu ajuda se chama bubble sort, não é um dos melhores, mas já cumpre sua função com o numero de movimentaçõe aceitável.

(Como assim Mr. Crawl3r, um nº de comparações aceitável?)
Se você estudar mais a fundo os algorítmos de ordenação, vai perceber que cada um possui sua ordem de complexidade (alguns como o shellsort ainda não possui). A ordem de complexidade do Bubble Sorte é O(n) no melhor caso, ou seja, se seu vetor possuir 1024 elemento e cair neste melhor caso, ele irá fazer 1024 operações relevantes quando for ordenado. Entretanto, no pior caso do Bubble Sort, ele faz O(n²) operações relevantes, ou seja ele vai fazer mais ou menos 1.048.576 dessas operações.

(Então se eu tiver um arranjo muito grande e cair no pior caso ele vai demorar muito?)
Em relação a alguns outros algoritmos este número é realmente muito grande. Quer um exemplo? Um dos algoritmos que eu mais curto é o Heap Sort. A ordem de complexidade dele é no melhor caso e no pior caso a mesma: O(n * log(n)). Ou seja, um array com 1024 dados, independente de como os dados estejam organizados nele, ele irá fazer 12288 operações relevantes para ordenar tudo.

(Mas o Bubble Sort faz muito menos operações que o Heap Sort para ordenar a mesma coisa, então onde está a vantagem?)
Como eu disse, existem vários tipos de algoritmos de ordenação. O melhor caso do Bubble Sort se dá quando ele já está ordenado, então ele só faz a pesquisa no array e se tiver tudo ordenado ele não faz nada. Já o Heap Sort tem que montar uma estrutura que se chama Heap Invertido e fazer um monte de operações, mas quando o arranjo está todo desordenado, ele é melhor que o Bubble Sorte. Então a resposta está neste fato. Mas isso depende muito de o que você está fazendo, se for pra trabalhar com números aleatórios, o melhor seria é o Heap, mas se você tem uma lista de uns clientes por exemplo que ele se desordena em algumas ocasiões, mas você sabe que ele está mais ou menos ordenado, compensa usar mais o Bubble em relação ao Heap. MAAAAS, existém vários algoritmos que em situações expecíficas são melhores que o Bubble. Então estude-os. =]

--------------------------------------------------
Att,
Mr Crawler.

O mundo depende dos computadores. Tenha total domínio sobre os computadores e domine o mundo!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts