作业帮 > 综合 > 作业

注释下面代码,#include #include #define N 10void sort (char *pstr[N

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/05/18 09:56:21
注释下面代码,
#include
#include
#define N 10
void sort (char *pstr[N]);
int main()
{
\x05int i;
\x05char *p[N]; /*定义一个行指针 */
\x05char str[N][N];
\x05printf("请输入6个字符串:");
\x05for (i = 0; i < 6; i++)
\x05{
\x05\x05scanf("%s",str[i]);
\x05}
\x05for (i = 0; i < 6; i++)
\x05{
\x05\x05p[i] = str[i];
\x05}
\x05sort(p);
\x05printf("排序后的字符串为:");
\x05for (i = 0; i < 6; i++)
\x05{
\x05\x05printf("%s\n",p[i]);
\x05}
\x05return 0;
}
void sort (char *pstr[N])
{
\x05int i;
\x05int j;
\x05char *p;
\x05for (i = 0; i < 6; i++)
\x05{
\x05\x05 for (j = i + 1; j < 6; j++)
\x05\x05 {
\x05\x05\x05if (strcmp((pstr[i]),(pstr[j])) > 0)
\x05\x05\x05{
\x05\x05\x05\x05p = (pstr[i]);
\x05\x05\x05\x05(pstr[i]) = (pstr[j]);
\x05\x05\x05\x05(pstr[j]) = p;
\x05\x05\x05}
\x05\x05}
\x05}
}
注释下面代码,#include #include #define N 10void sort (char *pstr[N
#include
#include //使用字符串相关操作时需使用
#define N 10//定义宏变量
void sort (char *pstr[N]);//声明函数
int main()
{
int i;
char *p[N]; //定义的是指针数组,而非行指针
char str[N][N];
printf("请输入6个字符串:");
for (i = 0; i < 6; i++) //块执行6次
{
scanf("%s",str[i]);//把输入的数据给数组指针,该块一共执行6次
}
for (i = 0; i < 6; i++)//循环6次,目的是让指针数组中每个指针各指向每个二维指针每行的
//首地址
{
p[i] = str[i]; //让指针数组中的元素P[i]指向str[i][0]这个元素
}
sort(p); //调用函数sort,并把P以指针数组形式传递
printf("排序后的字符串为:");
for (i = 0; i < 6; i++)
{
printf("%s\n",p[i]); //以p[i]所指向的地址为起点,输出连续地址中的字符
}
return 0;
}
void sort (char *pstr[N])//定义sort函数,根据定义知是对字符串大小进行比较
{
int i;
int j;
char *p;//定义指针P
for (i = 0; i < 6; i++)
{
for (j = i + 1; j < 6; j++) //简单的双重循环
{
if (strcmp((pstr[i]),(pstr[j])) > 0) //strcmp是比较字符串的大小,可
//以参照ascii表.
{ //当if语句条件成立时,交换指针所
//指对象,否则保持
p = (pstr[i]); //同下
(pstr[i]) = (pstr[j]); //同下
(pstr[j]) = p; //以上三项是一个简单的数组交换,参照C语言变量数值交换法
}
}
}
}
再问: 字太多,我截成图片了。
再答: 1)为什么要声明:因为每个函数都是顺序执行,你看下,调用函数那一步是比定义函数要早的,所以如果不声明,电脑就不知道你调用的是什么东西,所以,如果你不想声明,就必须先定义再调用,不过声明是个好习惯,读者也看的清楚。 2)指针数组和行指针的区别:行指针又叫数组指针,这里的数组已经是一种类型了,和int,char是一样的,所以数组指针(又叫行指针)和int,char的指针是一个级别的,是一维指针。但是指针数组的定义是,一个数组里面存放指针,我们知道,指向指针的指针是一个二维指针,所以这两个的级别是不同的。这个是指针的难点,希望你好好查阅资料。我推荐你试试以下代码 int a[3][3]={0};//定义二维数组,这就是所谓行指针 int *p[3];//这是指针数组的定义方式,请区别int*p[3] 和int (*p)[3]的区别,一个是指针数组一个是行 p=a;//这是会出现致命错误的,你可以试试 p[0]=a;//这样只是会警告,但是可以运行,为什么呢?因为a是数组指针,p[0]是P中一个元素,前面说了,p里面全部存放着指针,所以p[0]实际是一个一维指针,二者是等价的,只不过一个是int类型指针,一个是数组类型指针,所以这样以后,p[0]实际指向a[0][0]的值,请好好理解。 3)这个应该就是冒泡排序,比如abcde,冒泡排序就是先a和b,c,d,e依次比较,然后直接交换值,然后指针指向abcde数组的第二个值再重复依次与后面的数比较,所以是双重循环。
再问: 如果是这样的话就跟选择排序没什么区别了,选择排序是用第一个依次的跟后面的比较,然后将最小的找到最前面,也是双重循环,这个是将最大的找到最后面,好像是一样的哦。
再答: 有区别,但是不大,选择排序着重与选择,选择排序实际上是选择出最大的数,并且把指针指向这个数,至于是否交换数值还是进行其他操作由用户决定,举个例子,a[10]有abcdefg元素,冒泡排序是直接比较abcdefg的大小,并且交换数值,选择排序是比较abcdefg的大小并交换下标(实际是改变指针所指的对象),就是比如a