编写程序,对输入的若干单词按词典排序,不区分大小写。要求字符串的比较、复制、大小写转换、排序等工作均用函数实现。
在主函数中输入单词,调用函数排序,在主函数中输出结果。字符串个数不超过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(strr,n);//由于不区分大小写,所有的大写字母都转换成小写字母统一比较
arrange(str,strr,n);//字符串排序
for(int i=0;i<n;i++)
cout<<str[i]<<endl;
return 0;
}