计算机二级C语言2Word文档格式.docx
- 文档编号:19847981
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:27
- 大小:50.52KB
计算机二级C语言2Word文档格式.docx
《计算机二级C语言2Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言2Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
关于排序的问题
1用冒泡法来实现排序
voidpaixu(intp[],intn)
{inti,j,t;
n-1;
for(j=i+1;
n;
if(p[i]>
p[j]){t=p[i];
p[i]=p[j];
p[j]=t;
{inta[N]={3,2,7,6,8},i;
paixu(a,N);
2用选择法来实现排序
{inti,j,t,k;
{k=i;
for(j=i+1;
if(p[k]>
p[j])k=j;
if(k!
=i){t=p[k];
p[k]=p[i];
p[i]=t;
关于排序题的变型:
⑴把下标是奇数的从大到小排序
i+=2)
for(j=i+2;
j+=2)
if(p[i]<
分析:
要是对下标为偶数的排序呢?
⑵分析下面程序的输出结果
voidpaixu(intp[],intm,intn)
for(i=m;
n-m+1;
=n-m+1;
paixu(a,1,3);
如果把上例改为如下程序,输出结果是什么?
voidpaixu(int*p,intm,intn)
{intt;
while(m<
n)
{t=*(p+m);
*(p+m)=*(p+n);
*(p+n)=t;
m++;
n--;
}/*输出结果:
36728*/
③插入法排序(有一定难度)
例如:
把一整型数组由大到小排序
voidfun(int*aa,intn)
{inta,b,t;
for(a=1;
a<
a++)
{t=aa[a];
b=a-1;
while(b>
=0&
&
t>
aa[b])
{aa[b+1]=aa[b];
b--;
aa[b+1]=t;
fun(a,N);
例12:
输入若干有序数(从小到大)放在数组中,然后输入一个数,插入到此数组中,插入后数组仍是有序的,请对插在最前、中间、最后三种情况运行程序。
#defineN80
voidinsert(int*a,intm,int*n)
{intj=0,k;
while(j<
*n&
a[j]<
m)j++;
for(k=*n-1;
k>
=j;
k--)a[k+1]=a[k];
a[j]=m;
*n=*n+1;
{inta[N],j,m,n;
printf(“请输入数组的个数:
”);
scanf(“%d”,&
n);
printf(“输入%d个整数”,n);
j++)scanf(“%d”,&
a[j]);
printf(“输入待插入的数:
m);
insert(a,m,&
j++)printf(“%d,”,a[j]);
7二维数组
1二维数组的含义及定义
inta[2][3]------定义了6个int型的变量,这6个变量分别是a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]、a[1][2]
相当于2行3列的巨阵,
这6个变量在内存中是以行的方式连续存放的
2二维数组的初始化
inta[2][3];
/*没有初始化,6个变量的值为随机数*/
inta[2][3]={{1,2,3},{3,2,1}};
inta[2][3]={1,2,3,4,5,6};
inta[2][3]={{1,2},{5,6}};
inta[2][3]={1,2,3,5,6};
inta[][3]={{1,2,3},{5,6,7}};
/*省略行*/
inta[][3]={1,2,3,6};
inta[][3]={1};
不能写成:
a[2][]={……}/*不能省略列下标*/
也不能写成inta[][3];
3二维数组的赋值、
for(i=0;
3;
a[i][j]=i+j;
问:
这6个变量的值都是多少?
4如何表示(或引用)数组中的变量(很重要)
二维数组可以简单用下图来理解:
假设有数组:
想要让a[i][j]的值等于6,可以有如下的写法:
●a[i][j]=6;
●*(a[i]+j)=6;
/*通项:
*(a[i]+j)就是a[i][j]*/
●*(*(a+i)+j)=6;
/*通项:
*(*(a+i)+j)就是a[i][j]*/
●(*(a+i))[j]=6;
/*注意*(a+i)外面的一对()不能少*/
●*(&
a[0][0]+3*i+j)=6;
还可以用行指针来表示:
inta[2][3],(*p)[3];
/*其中p就是一个指针,它指向一
行(不是指向某个元素),行里有3列*/
假设:
p=a;
/*既:
p指向0行*/
则可以写成:
p[i][j]=6或*(*(p+i)+j)=6
p=a+1;
p指向1行*/
p[0][j]=6或*(p[0]+j)=6或*(*(p+0)+j)=6
5从键盘输入数给数组中的元素
a[i][j]);
若有语句scanf(“%d”,a);
假设输入6(回车),问谁的值是6?
(a[0][0])
scanf(“%d”,a[1]);
假设输入8(回车)?
(a[1][0])
6输出数组中元素的值
printf(“%d”,a[i][j]);
若有语句printf(“%d”,a);
会输出什么?
/*输出a[0][0]的地址*/
printf(“%d”,a[1]);
/*输出a[1][0]的地址*/
综合举例:
例1:
下面程序的输出结果是什么?
(求每列最大值及所在行号)
#include”stdio.h”
voidfun(inta[][3],intb[])/*inta[][3]也可以写成inta[2][3]或int(*a)[3],不能写成inta[][]或inta[2][]*/
{inti,j,k;
{k=0;
for(j=1;
if(a[j][i]>
a[k][i])k=j;
b[i]=k;
{inta[2][3]={{1,2,3},{4,5,6}},b[3];
inti;
fun(a,b);
printf(“%d,%d\n”,a[b[i]][i],b[i]);
输出结果:
由学生来做:
求每行最大值及所在列号(参考答案如下)
voidfun(inta[][3],intb[])
if(a[i][j]>
a[i][k])k=j;
{inta[2][3]={{1,2,3},{4,5,6}},b[2];
printf(“%d,%d\n”,a[i][b[i]],b[i]);
求在行上最大而在列上最小的元素及其位置(参考答案如下)
#include"
stdio.h"
voidfun(inta[][3],int*p,int*q)
{introw,col,max,min,i,j,k;
{row=i;
col=0;
max=a[row][col];
for(j=1;
max){max=a[i][j];
col=j;
for(k=0;
k<
k++)
if(a[k][col]<
a[row][col])break;
if(k==2)break;
*p=row;
*q=col;
{inta[2][3]={{1,2,3},{4,5,6}};
introw,col;
fun(a,&
row,&
col);
printf("
%d,%d,%d\n"
row,col,a[row][col]);
}/*输出结果:
0,2,3*/
例2:
求两对角线元素的和
#defineN3
{inti,j,sum=0,a[N][N]={{1,2,3},{4,5,6},{7,8,9}};
sum+=a[i][i]+a[i][N-i-1];
sum=sum-a[1][1];
printf(“sum=%d”,sum);
例3:
关于N*N数组的问题:
包括转置、改变上、下三角元素的值、周边元素的和等等
①把一个3*3的二维数组转置
#include”stdio.h”
{inti,j,t,a[N][N]={{1,2,3},{4,5,6},{7,8,9}};
i++)
i;
j++)/*若把j<
i改为j<
=i则就包含对角线的元素了*/
{t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
{for(j=0;
printf(“%3d”,a[i][j]);
printf(“\n”);
②把上三角元素分别加1(包括对角线)
{inti,j,t,a[N][N]={{1,2,3},{4,5,6},{7,8,9}};
=i;
a[j][i]+=1;
如果是把下三角加1,程序怎么改?
③求M*N数组周边元素的和
#defineM3
#defineN2
intfun(inta[][N])
{inti,j,sum=0;
M;
if(i==0||i==M-1||j==0||j==N-1)sum+=a[i][j];
returnsum;
{inti,j,a[M][N]={{1,2},{3,4},{5,6}};
printf(“%d”,fun(a));
例4:
关于二维数组的左移和右移问题
例如:
把一个MXN数组左移2位
fun(int(*a)[N],intk)
{inti,j,p,temp;
for(p=1;
p<
=k;
p++)
{temp=a[i][0];
N-1;
a[i][j]=a[i][j+1]
a[i][N-1]=temp;
}
要是左移一位或右移两位呢?
程序怎么改写?
第十章字符串
1字符串的概念---由各种字符组成的串,然后在末尾加一个特殊的字符(’\0’)作为串的结束标志。
’\0’字符的ASCII码值等于0
字符数组与字符串的区别:
字符串是特殊的字符数组,也就是说含有’\0’字符的字符数组就称为字符串。
在C语言中,字符串的常量如下表示:
”a12”
其在内存中所占空间如下图表示:
这个字符串共占4个字节(因为每一个字符占1个字节),且自动在末尾添加字符’\0’
注意:
’a’与”a”的区别?
2如何定义一个变量来存放字符串(称为字符串变量)
可以采用如下两种方式来定义:
chars[80];
/*字符数组*/
char*s;
/*字符指针*/
字符数组和字符串有什么区别?
3如何给字符串变量初始化
1chars[10]={‘a’,’1’,’2’,’\0’};
chars[3]={‘a’,’1’,’2’,’\0’};
行不?
2chars[10]={‘a’,’1’,’2’};
chars[3]={‘a’,’1’,’2’};
3chars[]={‘a’,’1’,’2’,’\0’};
chars[]={‘a’,’1’,’2’};
4chars[10]={“a12”};
5chars[10]=”a12”;
分析以上几种情况中字符串变量占多少字节?
字符串的实际长度是多少?
6char*s={”a12”};
7char*s=”a12”;
不能写成char*s={‘a’,’1’,’2’,’\0’};
其含义是:
把这个字符串的首地址给指针变量s
3如何给字符串变量赋值
1chars[10];
s[0]=’a’;
s[1]=’1’;
s[2]=’2’;
s[3]=’\0’;
或写成strcpy(s,”a12”);
写成s=”a12”或s[]=”a12”或s[10]=”abc”;
2char*s;
s=”a12”;
①和②有什么不同?
4如何从键盘输入一个字符串
假设有chars[20];
可用如下两种方式:
◆scanf(“%s”,s);
◆gets(s);
分析:
如有char*s;
是否可以用上述两种输入?
,若不行,怎么写?
(charp[10],*s=p;
然后可以用上面的两种方式)
5如何在屏幕上输出一个字符串
假设有chars[20]或char*s;
◆printf(“%s”,s);
◆puts(s);
6字符串的常用函数
1求一个字符串的长度函数strlen();
在这里介绍一个运算符sizeof()---求所占的字节数
说明:
◆strlen()函数一对小括号内可以是字符串变量或常量
如:
char*s=”a12”;
strlen(s)=?
、strlen(“a123”)=?
;
◆sizeof()小括号内可以是如下情况:
chars[10]=”a12”;
sizeof(s)=?
(4)
sizeof(int)=?
sizeof(short)=?
(2)
sizeof(5)=?
sizeof(5L)=?
sizeof(5.6)=?
(8)
sizeof(5*2.6)=?
sizeof(5*8)=?
sizeof5*8=?
(32)
这两个经常在一起使用,下面看几个例子:
假设有下列定义:
chars1[10]={‘a’,’1’,’2’,’\0’};
chars2[10]={‘a’,’1’,’2’};
chars3[]={“a12”};
chars4[]={‘a’,’1’,’2’,’\0’};
chars5[]={‘a’,’1’,’2’};
char*s6=”a12”;
strlen(s1)=?
(3)sizeof(s1)=?
(10)
strlen(s2)=?
(3)sizeof(s2)=?
(10)
strlen(s3)=?
(3)sizeof(s3)=?
(4)
strlen(s4)=?
(3)sizeof(s4)=?
strlen(s5)=?
(不确定)sizeof(s5)=?
(3)
strlen(s6)=?
(3)sizeof(s6)=?
intfun(char*s)
{intk=0;
while(s[k])k++;
returnk;
{chars[10]=”a12”;
printf(“%d”,fun(s));
答案:
3
2字符串拷贝函数strcpy()
假设有:
chars1[10],chars2[]=”a12”;
则执行strcpy(s1,s2);
语句后,字符串s1里的内容就是”a12”了
使用这个函数要注意两点:
一是s1要足够大,二是连同结束符(’\0’)一起拷贝过来
分析以下几种情况是什么含义?
strcpy(s1,”abcd”);
strcpy(s1+1,”1234”);
strcpy(&
s1[2],”1234”);
s1[8],”1234”);
/*行不?
*/
下面程序输出结果是什么?
voidfun(char*s1,char*s2)
{
while(*s2!
=’\0’)
{*s1=*s2;
s1++;
s2++;
*s1=’\0’;
{chars1[10],s2[]=”a12”;
fun(s1,s2);
printf(“%s”,s1);
a12
上例的fun函数可以再简化:
while((*s1++=*s2++)!
=’\0’);
3字符串连接函数strcat()
假设有chars1[20]=”abc”,s2[]=”123”;
执行strcat(s1,s2)后,s1就变成了”abc123”
{while(*s1!
=’\0’)s1++;
while(*s1++=*s2++);
{chars1[10]=”abc”,s2[]=”a12”;
abca12
4字符串比较函数strcmp()
两个字符串谁大谁小以及谁长的含义是什么?
(举例讲解)
chars1[10]=”abc”,s2[]=”a12”
执行strcmp(s1,s2)后,strcmp()函数返回一个大于0的值(’b’-‘1’=49)
总之:
对于strcmp(s1,s2),如果s1>
s2则得到一个大于0的数,如果s1<
s2则得到一个小于0的数,如果s1==s2则得到一个等于0的数。
intfun(char*s1,char*s2)
while(*s1||*s2)
if(*s1==*s2){s1++;
els
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 二级 语言