Why Does My Function Bubblebest Doesn’t Rotate?

Asked

Viewed 66 times

0

I’m wanting to call the bubbleSort code but it does not appear to run and I can’t figure out the problem since it shows no error.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
/*
Ordenacao bubblesort melhorada, selection sort, insertion sort, busca binária e sequencial 
*/


#define MAX 30
#define MUL 900

void bubbleSortMelhorado(int *matriz);
void bubbleSort(int matriz[][MAX]);
void leValidaInt(int *opcao, char *msg, char *msgErro);
void leValidaOpcao(char *opcao, char *msgErro);
void chamaFuncoesMenu();
void chamaMenu();
int main(int argc, char *argv[]) {  
    //chamaMenu();
    chamaFuncoesMenu();

    return 0;
}
void chamaMenu(){
    printf("(1)-Bubble Sort\n");
    printf("(2)-Bubble Sort Melhorado\n");
    printf("(3)-Selection Sort\n");
    printf("(4)-Insertion Sort\n");
    printf("(5)-Pesquisa Binária\n");
    printf("(6)-Pesquisa Sequencial\n");
    printf("(s)- Sair\n\n");

}
void chamaFuncoesMenu(){

    int matriz[MAX][MAX];
    int i, j;
    srand(time(NULL));
    for(i=0;i<30;i++){
        for(j=0;j<30;j++){
            matriz[i][j]=1+(rand()%900);
        }
    }   

    char opcao=' ';

    do{
        chamaMenu();
        leValidaOpcao(&opcao, "\nOpcao invalida!\n");
        switch(opcao){
            case '1':
                bubbleSort(matriz);
                break;
            case '2':
                bubbleSortMelhorado(&matriz[0][0]);
                break;
            case '3':
                break;
            case '4':
                break;
            case '5':
                break;
            case '6':
                break;
            case 's':
                exit(0);
                break;
        }
        getch();
        system("cls");
    }while(opcao!='s');
}
void leValidaOpcao(char *opcao, char *msgErro){
    int flag=1;
    do{
        scanf(" %c", &*opcao);
        *opcao=tolower(*opcao);
        if((*opcao<49||*opcao>54)&&*opcao!='s'){
            printf("%s", msgErro);
            flag=0;
        }else{
            flag=1;
        }
    }while(!flag);
}
void bubbleSort(int matriz[][MAX]){
    int i, j, k, l=0;
    int tmp=0;
    int opcao=0;

    do{

        for(i=0;i<MAX;i++){
            for(j=0;j<MAX;j++){
                tmp=matriz[i][j];
                l=j+1;
                for(k=i;k<MAX;k++){
                    while(l<MAX){
                        if(tmp<matriz[k][l]){
                            tmp=matriz[k][l];
                            matriz[k][l]=matriz[i][j];
                            matriz[i][j]=tmp;
                        }
                        l++;
                    }
                    l=0;
                }
            }
        }


        for(i=0;i<MAX;i++){
            for(j=0;j<MAX;j++){
                printf("%d\t", matriz[i][j]);
            }
            printf("\n");
        }
        getch();
        leValidaInt(&opcao, "\n(1)- Ordenar novamente\n(2)-Voltar ao menu\n", "\nOpcao invalida!\n");
        if(opcao==2){
            getch();
            return; 
        }

    }while(opcao==1);

}
void leValidaInt(int *opcao, char *msg, char *msgErro){
    int flag=1;
    do{
        printf("%s", msg);
        scanf("%d", &*opcao);
        if(*opcao<1||*opcao>2){
            printf("%s", msgErro);
            flag=0;
        }else{
            flag=1;
        }

    }while(!flag);
}
void bubbleSortMelhorado(int *matriz){
    int i, j, troca, tmp, opcao=0;
    do{
        for(i=1; i<MAX;i++){
            troca=0;
            for(j=MAX-1;j>=1;j--){
                if(matriz[j-1]<matriz[j]){
                    tmp=matriz[j-1];
                    matriz[j-1]=matriz[j];
                    matriz[j]=tmp;
                    troca=1;
                }
            }
            if(!troca){
                return;
            }
        }

        getch();
        for(i=0;i<MUL;i++){
            printf("%d\t", matriz[i]);
            printf("\n");
        }

        leValidaInt(&opcao, "\n(1)- Ordenar novamente\n(2)-Voltar ao menu\n", "\nOpcao invalida!\n");
        if(opcao==2){
            getch();
            return; 
        }

    }while(opcao==1);


}

1 answer

1


A quick visual inspection shows no problems, but as your code is a bit long (tip: see this here) and uses features specific to Windows (getch, cls), I made a minimal example that runs on Linux (and probably on Windows too) showing a simplified menuzinho. Another tip: don’t leave the code all glued, no spaces, gets loaded and more difficult to understand: for example, prefer char opcao = ' ' instead of char opcao=' '.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

static void leValidaOpcao(char *opcao);
static void chamaFuncoesMenu();
static void mostraMenu();

int main()
{
  chamaFuncoesMenu();
  return 0;
}

void mostraMenu()
{
  printf("\n");
  printf("(1) - opcao 1\n");
  printf("(2) - opcao 2\n");
  printf("(s) - fim\n");
  printf("\n");
  printf("digite opcao: ");
}

void chamaFuncoesMenu()
{
  char opcao = ' ';

  for (;;)
  {
    leValidaOpcao(&opcao);

    switch (opcao)
    {
      case '1':
        printf("\n* opcao 1 ok\n");
        break;
      case '2':
        printf("\n* opcao 2 ok\n");
        break;
      case 's':
        printf("\n* fim\n\n");
        exit(0);
        break;
      default: // redundante
        printf("\n* opcao invalida");
    }
    getchar();
  }
}

void leValidaOpcao(char* opcao)
{
  for (;;)
  {
    mostraMenu();
    scanf(" %c", opcao);
    *opcao = tolower(*opcao);
    if ((*opcao >= '1' && *opcao <= '2') || *opcao == 's')
      return;
    printf("\n* opcao %c invalida!\n", *opcao);
  }
}

Example of use:

[zv@localhost Misc]$
[zv@localhost Misc]$ ./so337770

(1) - opcao 1
(2) - opcao 2
(s) - fim

digite opcao: 1

* opcao 1 ok

(1) - opcao 1
(2) - opcao 2
(s) - fim

digite opcao: 2

* opcao 2 ok

(1) - opcao 1
(2) - opcao 2
(s) - fim

digite opcao: x

* opcao x invalida!

(1) - opcao 1
(2) - opcao 2
(s) - fim

digite opcao: s

* fim

[zv@localhost Misc]$

Browser other questions tagged

You are not signed in. Login or sign up in order to post.