проблема с получением моей программы на работу - PullRequest
1 голос
/ 27 марта 2011

У меня возникла проблема с моей программой для новичка ....

Я хочу напечатать список городов как в порядке возрастания, так и в порядке убывания, но пока выполняется только нисходящая часть.

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

int main(void) {
  int i, j, ch, sort=0;
  printf("HOW WOULD YOU LIKE TO SORT?\n\nASCENDING\n\nDESCENDING\n\n");
  ch=getc(stdin);
  if(toupper(ch)=='A'&&tolower(ch)=='a') sort=1;
  if(sort==1) printf("\nSORT ASCENDING...\n");
  else printf("\nSORT DESCENDING...\n");
  printf("\nHOW MANY CITIES WOULD YOU LIKE? : - \n");
  scanf("%d",&i);
  char NAMES[i][20];
  j=0;
  while(j<i) {
    printf("ENTER NAME ");
    scanf("%s",NAMES[j]);
    j++;
  }
  char swapNAME[20];
  int r,k;
  printf("THE ORIGINAL LIST WAS :\n");
  for(r=0;r<i;r++) printf("%s\n",NAMES[r]);
  for(r=0;r<i-1;r++) {
    for(k=r+1;k<i;k++) {
      if(strcmp(NAMES[k],NAMES[r])>0) {
         strcpy(swapNAME,NAMES[r]);
         strcpy(NAMES[r],NAMES[k]);
         strcpy(NAMES[k],swapNAME);
      }
    }
  }
  printf("\n THE SORTED LIST IS NOW : \n");
  for(r=0;r<i;r++) printf("%s\n",NAMES[r]);
  getc(stdin);

  system("pause");
  return 0;
}

Пожалуйста, любые усилия будут высоко оценены aganin Thankz

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

Если работает сортировка по убыванию, то все, что вам нужно, это дополнительное условие в операторе if для обработки в другом направлении:

 for(r=0;r<i-1;r++) {
    for(k=r+1;k<i;k++) {
      if((sort==0 && strcmp(NAMES[k],NAMES[r])>0)||
         (sort==1 && strcmp(NAMES[k],NAMES[r])<0)) {
         strcpy(swapNAME,NAMES[r]);
         strcpy(NAMES[r],NAMES[k]);
         strcpy(NAMES[k],swapNAME);
      }
    }
  }
0 голосов
/ 27 марта 2011

Во-первых, ваша сортировка выключена.Чтобы решить эту проблему, просто замените пузырьковую сортировку вызовом qsort, и это сразу же приведет к хорошему способу обратной сортировки.В частности, попробуйте:


int
rstrcmp( const char *s1, const char *s2 )
{
    return -strcmp( s1, s2 );
}


int main( int argc, char **argv ) {
    ...
    int (*compare)(const char *s1, const char *s2 );
    /* Based on user input, set 
    compare = rstrcmp;
    -- or --
    compare = strcmp;
    */
    ...
    qsort( NAMES, i, 20, compare );
    ...

В качестве рекомендации, не запрашивайте направление сортировки, но позвольте пользователю передать его как флаг в argv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...