概述
题目
请编程实现对n个国家的国名,按照字母顺序升序排序
想法一,
用字符数组存储n个国家的国名,排序后输出
想法二,
用n行m列的二维数组(m为最长国名长度),排序后输出
上述两种方法都涉及到字符串的交换,每一个字符串,都要依次交换到另一字符串所在的空间中,极大地浪费了空间和运行效率
题目:
所以,请同学们用n行m列的二维数组存储n个国家的国名,然后用长度为n的字符指针数组存储国名首地址,对字符指针数组进行排序
输入n表示n个国家,再输入n行字符串表示对应国家国名
代码
错误代码示例
#include<iostream>
#include<stdio.h>//scanf()
using namespace std;
int main()
{
int n;
cin>>n;//n个国名
char a[n][50];//定义二维字符数组
for(int i = 0; i < n; i++)
scanf("%s", a[i]);//每个国名作为字符串输入
char (*p)[50];//p为行指针
p = a;//用二维数组的行地址初始化
//int *p[50]则p为列指针
string temp;
for(int i = 0; i < n-1; i++)
{
if(a[i].compare(a[i+1]) > 0)//这行报错了
{
temp = a[i];
a[i] = a[i+1]
a[i+1] = temp;
}
}
for(int i = 0; i < n; i++)
cout<<a[i]<<endl;
return 0;
}
分析:
错误1
第19行报错 error: request for member 'compare' in 'a[i]', which is of non-class type 'char [50]'
意思是a[i]并非string对象,无法对其使用成员函数compare。它相当于const char[50]这样的字符指针常量
错误2
第19~23行,代码直接对二维字符数组a进行排序但是a[i] = a[i + 1]和a[i + 1] = temp在这里是错误的
注意!这是个二维数组,不是一维,在一维数组中表示元素的a[i]和*p这些,在二维数组却表示一维中的数组首地址,也就是一维数组名。
此处表示用一维数组名a[i + 1]赋值给另一个一维数组名a[i],数组名不允许被赋值
正确代码:
#include<iostream>
#include<cstring>//strcmp()
using namespace std;
int main()
{
int n;
cin>>n;//n个国名
char a[n][50];//定义二维字符数组
for(int i = 0; i < n; ++i)
cin>>a[i];//每个国名作为字符串输入
//定义字符指针数组pnames,用于存储国名首地址
char *pname[n];
for(int i = 0; i < n; ++i)
pname[i] = a[i];//将国名首地址存入字符指针
//用冒泡排序对字符指针数组进行排序
for(int i = 0; i < n - 1; ++i)
for(int j = 0; j < n - i - 1; ++j)
if(strcmp(pname[j], pname[j + 1]) > 0)
{
char *t = pname[j];
pname[j] = pname[j + 1];
pname[j + 1] = t;
}
for(int i = 0; i < n; ++i)
cout<<pname[i]<<" ";//这里不要用a[i],会按原来顺序输出
return 0;
}
第21行的if(strcmp(pname[j], pname[j + 1]) > 0)
还可修改成
if((string(pname[j])).compare(pname[j + 1]) > 0) 此处强制类型转换
str1.compare(str2) 头文件#include<string>
输入输出
8
China
America
England
Russia
SouthKarea
NorthKarea
India
Austrilia
America Austrilia China England India NorthKarea Russia SouthKarea
头文件cstring中的strcmp(string1, string2)函数, 对两个字符串每个字符的ASCII值进行比较,若string1 > string2则返回正数,string1 < string2返回负数,两字符串相等返回0
补充知识点:
1,C++中,字符串应该用" ",单个字符用' ',如果字符串用了' '可能会警告warning: character constant too long for its type,也可能会报错error: no match function for call to...
2,使用指针的优点:可直接操纵内存地址,提高编译效率,节省空间
3,cstring相当于C语言中的string.h,
而string头文件:
#include<string>
string str = "abcd";
(1)str.length() 和 str.size() 返回字符串长度
(2)str.clear() 清空str中所有元素
(3)str.insert(n, str2) 在第n个位置(从0开始)插入str2
(4)str.find(str2) 返回子串第一次出现的位置,若不存在,返回-1
(5)str.replace(n, length, str2) 把字符串第n个位置(从0开始)长度为length的子串替换为str2
请看代码效果
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
str = "I love you";
cout<<str.length()<<endl;//10
str.clear();
cout<<str<<endl;//输出换行
str = "ugh so nasty!!!";
str.insert(3," you are");
cout<<str<<endl;//ugh you are so nasty!!!
cout<<str.find('r')<<endl;//9
str.replace(4,7,"please do not be");//空格也算字符串一部分
cout<<str<<endl;//ugh please do not be so nasty!!!
return 0;
}
输出
10
ugh you are so nasty!!!
9
ugh please do not be so nasty!!!
总结
指针确实很难,还老出错,所以迎难而上,难上加难呗
现在2022/12/19 1:21,还有24分钟加时赛结束
嗨起来
是点球大战 2022/12/19 1:46
法国第二球没进...
法国第三球没进...
阿根廷第4球进了...姆巴佩很遗憾
爷青结
最后
以上就是清爽黑猫为你收集整理的C++国名排序之字符指针数组题目代码 总结的全部内容,希望文章能够帮你解决C++国名排序之字符指针数组题目代码 总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复