我的程序在这里遇到了新手问题......
我希望它以升序和降序打印城市列表,到目前为止我只是实现了降序部分。
#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
答案 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中的标志传递。