
C语言用冒泡法对六个字符串按从小到大排
.#include<stdio.h>#include<conio.h>#defineMAXLINE20fun(char*pstr[6]){inti,j;char*p;fo...
.
#include <stdio.h>
#include <conio.h>
#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
for (j = i + 1; j < 6; j++) {
/**************found**************/
if(strcmp(*(pstr + i), (pstr + j)) > 0)
{
p = *(pstr + i) ;
/**************found**************/
*(pstr + i) =*( pstr + j) ;
*(pstr + j) = p ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][MAXLINE] ;
clrscr( ) ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
--------------------------------------------------------------------
我现在想知道这三个语句到底是什么意思,有什么作用?P是一个指针变量,而*(pstr + i) 应该是一个指向PSTR数组第I个元素的地址的值吧,这怎么能直接赋值给指针P呢?也许是我不太懂指针,请大神的详细解析!
p = *(pstr + i) ;
*(pstr + i) = *(pstr + j) ;
*(pstr + j) = p ; 展开
#include <stdio.h>
#include <conio.h>
#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
for (j = i + 1; j < 6; j++) {
/**************found**************/
if(strcmp(*(pstr + i), (pstr + j)) > 0)
{
p = *(pstr + i) ;
/**************found**************/
*(pstr + i) =*( pstr + j) ;
*(pstr + j) = p ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][MAXLINE] ;
clrscr( ) ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
--------------------------------------------------------------------
我现在想知道这三个语句到底是什么意思,有什么作用?P是一个指针变量,而*(pstr + i) 应该是一个指向PSTR数组第I个元素的地址的值吧,这怎么能直接赋值给指针P呢?也许是我不太懂指针,请大神的详细解析!
p = *(pstr + i) ;
*(pstr + i) = *(pstr + j) ;
*(pstr + j) = p ; 展开
展开全部
*(pstr+i)就是pstr数组的元素i,但这是指针数组,所以里面保存的是指针,可写为pstr[i]。
上面三句就是地址交换。
*pstr[6]是指针数组,pstr的每一个元素都是指针。还有字符串比较函数包含在 库函数 string.h中,要包含进去;定义指针时尽量把他赋值为空指针,不然野指针危害很大的。
根据你下面的输出情况,你是从每个字符,的首地址开始输出,所以上面交换的是地址,所以那三句改为
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
就比较直观了
即把字符比较小的交换到前面去。就可得到你想要的结果。
改后的程序如下:
#include <stdio.h>#include <conio.h>
#include<string.h>
#define MAXLINE 20
int fun ( char *pstr[6]){
int i, j ;
char *p=NULL;
for (i=0;i<5;i++)
{
for (j=i+1;j<6;j++)
{
if(strcmp(*(pstr+i),*(pstr+j))> 0)
{
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
//等同于注释了的这三句
/* p=*(pstr+i) ;
*(pstr+i)=*(pstr+j);
*(pstr+j)=p ; */
}
}
}
}
int main(int argc,int *aggv[])
{
int i;
char *pstr[6],str[6][MAXLINE];
clrscr( );
for(i=0;i<6;i++)
pstr[i]=str[i];
printf("\nEnter 6 string(1 string at each line): \n" );
for(i=0;i<6;i++)
scanf("%s",pstr[i]);
fun(pstr);
printf("The strings after sorting:\n");
for(i=0;i<6;i++)
printf("%s\n", pstr[i]);
return 0;
}
上面三句就是地址交换。
*pstr[6]是指针数组,pstr的每一个元素都是指针。还有字符串比较函数包含在 库函数 string.h中,要包含进去;定义指针时尽量把他赋值为空指针,不然野指针危害很大的。
根据你下面的输出情况,你是从每个字符,的首地址开始输出,所以上面交换的是地址,所以那三句改为
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
就比较直观了
即把字符比较小的交换到前面去。就可得到你想要的结果。
改后的程序如下:
#include <stdio.h>#include <conio.h>
#include<string.h>
#define MAXLINE 20
int fun ( char *pstr[6]){
int i, j ;
char *p=NULL;
for (i=0;i<5;i++)
{
for (j=i+1;j<6;j++)
{
if(strcmp(*(pstr+i),*(pstr+j))> 0)
{
p=pstr[i];
pstr[i]=pstr[j];
pstr[j]=p;
//等同于注释了的这三句
/* p=*(pstr+i) ;
*(pstr+i)=*(pstr+j);
*(pstr+j)=p ; */
}
}
}
}
int main(int argc,int *aggv[])
{
int i;
char *pstr[6],str[6][MAXLINE];
clrscr( );
for(i=0;i<6;i++)
pstr[i]=str[i];
printf("\nEnter 6 string(1 string at each line): \n" );
for(i=0;i<6;i++)
scanf("%s",pstr[i]);
fun(pstr);
printf("The strings after sorting:\n");
for(i=0;i<6;i++)
printf("%s\n", pstr[i]);
return 0;
}
展开全部
#include<stdio.h>//链接标准头文件
#defineN 6//定义常量N并赋值为6
voidmain()//主函数入口
{//表示主函数开始
inti,j;//定义整形变量i和j
intgrade[N],temp;//定义N维(N=6,也就是六维数组)整形数组和整形变量temp
printf("输入6个数\n");//在屏幕上显式“输入6个数”并且换行
for(i=0;i<N;i++)//开始for循环,从i=0,每次加1,直到i=5,共需循环6次
{//循环体开始
scanf("%d",&grade[i]);//依次获取用户输入的整数值并存入数组grade中
}//循环结束
for(i=0;i<N;i++)//开始外层for循环,从i=0,每次加1,直到i=5
{//外层循环体开始
for(j=0;j<N-1-i;j++)//开始外层for循环,从j=0,每次加1直到i等于外层循环的N-j-1
{//内层循环体开始
if(grade[j]>grade[j+1])//条件判断
{//如果整形数组前面的数比其后的小,执行以下语句
temp=grade[j+1];//将比较大的数赋值给temp
grade[j+1]=grade[j];//将比较小的数赋值给数组中后面的变量
grade[j]=temp;//将比较大的数赋值给数组中前面的变量
}//从此便完成大小变量的交换,使得大值往前放
}//结束内层循环
}//结外内层循环,完成排序
printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行
for(i=0;i<N;i++)//同开始的for循环类似
{//开始循环输出
printf("%d",grade[i]);//只是这里要逐个输出数组中的
六个数值
}//结束循环输出
printf("\n");//输出换行到屏幕,看不到什么效果,可删掉
}//结束main()函数
#defineN 6//定义常量N并赋值为6
voidmain()//主函数入口
{//表示主函数开始
inti,j;//定义整形变量i和j
intgrade[N],temp;//定义N维(N=6,也就是六维数组)整形数组和整形变量temp
printf("输入6个数\n");//在屏幕上显式“输入6个数”并且换行
for(i=0;i<N;i++)//开始for循环,从i=0,每次加1,直到i=5,共需循环6次
{//循环体开始
scanf("%d",&grade[i]);//依次获取用户输入的整数值并存入数组grade中
}//循环结束
for(i=0;i<N;i++)//开始外层for循环,从i=0,每次加1,直到i=5
{//外层循环体开始
for(j=0;j<N-1-i;j++)//开始外层for循环,从j=0,每次加1直到i等于外层循环的N-j-1
{//内层循环体开始
if(grade[j]>grade[j+1])//条件判断
{//如果整形数组前面的数比其后的小,执行以下语句
temp=grade[j+1];//将比较大的数赋值给temp
grade[j+1]=grade[j];//将比较小的数赋值给数组中后面的变量
grade[j]=temp;//将比较大的数赋值给数组中前面的变量
}//从此便完成大小变量的交换,使得大值往前放
}//结束内层循环
}//结外内层循环,完成排序
printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行
for(i=0;i<N;i++)//同开始的for循环类似
{//开始循环输出
printf("%d",grade[i]);//只是这里要逐个输出数组中的
六个数值
}//结束循环输出
printf("\n");//输出换行到屏幕,看不到什么效果,可删掉
}//结束main()函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>//链接标准头文件
#defineN
6//定义常量N并赋值为6
voidmain()//主函数入口
{//表示主函数开始
inti,j;//定义整形变量i和j
intgrade[N],temp;//定义N维(N=6,也就是六维数组)整形数组和整形变量temp
printf("输入6个数\n");//在屏幕上显式“输入6个数”并且换行
for(i=0;i<N;i++)//开始for循环,从i=0,每次加1,直到i=5,共需循环6次
{//循环体开始
scanf("%d",&grade[i]);//依次获取用户输入的整数值并存入数组grade中
}//循环结束
for(i=0;i<N;i++)//开始外层for循环,从i=0,每次加1,直到i=5
{//外层循环体开始
for(j=0;j<N-1-i;j++)//开始外层for循环,从j=0,每次加1直到i等于外层循环的N-j-1
{//内层循环体开始
if(grade[j]>grade[j+1])//条件判断
{//如果整形数组前面的数比其后的小,执行以下语句
temp=grade[j+1];//将比较大的数赋值给temp
grade[j+1]=grade[j];//将比较小的数赋值给数组中后面的变量
grade[j]=temp;//将比较大的数赋值给数组中前面的变量
}//从此便完成大小变量的交换,使得大值往前放
}//结束内层循环
}//结外内层循环,完成排序
printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行
for(i=0;i<N;i++)//同开始的for循环类似
{//开始循环输出
printf("%d",grade[i]);//只是这里要逐个输出数组中的
六个数值
}//结束循环输出
printf("\n");//输出换行到屏幕,看不到什么效果,可删掉
}//结束main()函数
#defineN
6//定义常量N并赋值为6
voidmain()//主函数入口
{//表示主函数开始
inti,j;//定义整形变量i和j
intgrade[N],temp;//定义N维(N=6,也就是六维数组)整形数组和整形变量temp
printf("输入6个数\n");//在屏幕上显式“输入6个数”并且换行
for(i=0;i<N;i++)//开始for循环,从i=0,每次加1,直到i=5,共需循环6次
{//循环体开始
scanf("%d",&grade[i]);//依次获取用户输入的整数值并存入数组grade中
}//循环结束
for(i=0;i<N;i++)//开始外层for循环,从i=0,每次加1,直到i=5
{//外层循环体开始
for(j=0;j<N-1-i;j++)//开始外层for循环,从j=0,每次加1直到i等于外层循环的N-j-1
{//内层循环体开始
if(grade[j]>grade[j+1])//条件判断
{//如果整形数组前面的数比其后的小,执行以下语句
temp=grade[j+1];//将比较大的数赋值给temp
grade[j+1]=grade[j];//将比较小的数赋值给数组中后面的变量
grade[j]=temp;//将比较大的数赋值给数组中前面的变量
}//从此便完成大小变量的交换,使得大值往前放
}//结束内层循环
}//结外内层循环,完成排序
printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行
for(i=0;i<N;i++)//同开始的for循环类似
{//开始循环输出
printf("%d",grade[i]);//只是这里要逐个输出数组中的
六个数值
}//结束循环输出
printf("\n");//输出换行到屏幕,看不到什么效果,可删掉
}//结束main()函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*pstr[6]是指针型数组,pstr[1]~pstr[6]中每一个元素都是一个char型指针,指针长度为8位(根据编译器不同可能不同),p也是char型指针,类型和长度都匹配,可以相互赋值。p = *(pstr + i) 的意思是将原来pstr+i指向的8位地址赋给了p,此时p和pstr+i指向了同一个内存位置,后面以此类推,有问题随时交流。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符串排序,要对大小不合适的串进行位置“交换”,而且字符串长度往往是不相等的,那交换起来多麻烦!所以字符串排序不采用交换字符串的办法。有几个字符串,就设置几个指针,让这些指针一一对应指向这些字符串。排序时,若哪个字符串的位置不合适,就把指向它的指针交换一下就行了。这3条语句就是在交换指向字符串的指针,把字符串指针*(pstr + i)和*(pstr + j)通过中间指针变量p实现了交换!实际上那些字符串没有动,而是把指向它们的指针按照所指向的字符串的大小按顺序排起来了……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询