让我的程序工作的问题

时间:2011-03-27 14:18:58

标签: c

我的程序在这里遇到了新手问题......

我希望它以升序和降序打印城市列表,到目前为止我只是实现了降序部分。

#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 个答案:

答案 0 :(得分:2)

如果降序排序正常,那么您需要的只是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);
      }
    }
  }

答案 1 :(得分:0)

首先,您的排序已关闭。要解决这个问题,只需通过调用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中的标志传递。