A52047. 单词排序
填空题
中等
知识点
题目描述
单词排序
题目描述
写程序,对输入的若干单词按词典排序,不区分大小写。要求字符串的比较、复制、大小写转换、排序等工作均用函数实现。
在主函数中输入单词,调用函数排序,在主函数中输出结果。字符串个数不超过100个,每个单词的长度不超过20。
不能使用系统的字符串处理库函数,不能使用标准模板库的类和函数。
输入
两行:第1行为单词个数n,第2行为n个单词,用空格隔开。
输出
n行,每行一个单词。
输入样例
5
sin cos log exp sqrt输出样例
cos
exp
log
sin
sqrt参考答案
#include <iostream>
using namespace std;
char strr[100][20];//定义一个全局变量,因为str的大小写虽然忽略但是不能改变,
//所以设置一个全局变量,改变全局变量的大小写,用全局变量进行同样的比较、排序,但最后用str输出
void strcpy(char *str1,char *str2) {
//字符串复制函数
while((*str1++=*str2++)!='\0');
}
void reserve(char str[100][20],int n) {
char *s;
for(int i=0; i<n; i++) {
s=&strr[i][0];//定义一个指针变量*s指向数组每一行字符串的首地址
while(*s!='\0') {
//大写转小写
if(*s>='A'&&*s<='Z')//*s代表的是对应字符串第几个元素的值
*s+=32;
*s++;//指针向后移动
}
}
}
int strcmp(char *str1,char *str2) {
//比较字符串大小
while(*str1!='\0' && *str2!='\0' && *str1==*str2) {
*str1++;
*str2++;
}
if(*str1>*str2)
return 1;
else if(*str1<*str2)
return -1;
else
return 0;
}
void arrange(char str[100][20],char strr[100][20],int n) {
//字符串排列
for(int i=0; i<n-1; i++) {
int j=i;
for(int k=i+1; k<n; k++) {
if(strcmp(strr[j],strr[k])==1) {
//前者比后者大,就换位置
char s[20];
strcpy(s,str[j]);
strcpy(str[j],str[k]);
strcpy(str[k],s);
strcpy(s,strr[j]);
strcpy(strr[j],strr[k]);
strcpy(strr[k],s);
}
}
}
}
int main() {
char str[100][20];
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>str[i];
for(int i=0; i<n; i++) {
for(int j=0; j<20; j++) {
strr[i][j]=str[i][j];
}
}
reserve(str,n);//由于不区分大小写,所有的大写字母都转换成小写字母统一比较
arrange(str,strr,n);//字符串排序
for(int i=0; i<n; i++)
cout<<str[i]<<endl;
return 0;
}答案解析
C++单词排序
上一题
下一题