C语言知识点整理2.docx
《C语言知识点整理2.docx》由会员分享,可在线阅读,更多相关《C语言知识点整理2.docx(25页珍藏版)》请在冰点文库上搜索。
![C语言知识点整理2.docx](https://file1.bingdoc.com/fileroot1/2023-7/25/279f4dd7-d545-490b-ae82-efc13b593200/279f4dd7-d545-490b-ae82-efc13b5932001.gif)
C语言知识点整理2
一维数组的定义和引用
定义一般形式:
类型说明符数组名[常量表达式]
例:
inta[10];/*整型数组a,有10个元素*/
floatb[5];/*实型数组b,有5个元素*/
charc[20];/*字符型数组c,有20个元素*/
注意点:
C语言中规定数组的下标从0开始;
例如:
inta[5]表示数组a有5个元素
5个元素分别为:
a[0],a[1],a[2],a[3],a[4]
不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
一维数组元素的引用
数组元素引用形式:
数组名[下标]
下标:
只能为整型常量或整型表达式
例如,a[5]、a[i+j]、a[i++]
输入10位学生的成绩(整数),并将其反序输出。
main()
{
intscore[10],i;
for(i=0;i<=9;i++)
{
scanf("%d",&score[i]);
}
for(i=9;i>=0;i--)
printf("%d",score[i]);
getch();
}
输入10位学生的成绩(整数),并求出平均成绩输出。
main()
{
floats=0,score[10];
inti;
for(i=0;i<=9;i++)
scanf("%f",&score[i]);
for(i=0;i<=9;i++)
s=s+score[i];
s=s/10;
printf("Theaverageis:
%f",s);
getch();
}
数组初始化赋值
数组初始化赋值:
在数组定义时给数组元素赋予初值。
初始化赋值一般形式为:
类型说明符数组名[常量表达式]={值,值…值};
例:
inta[10]={0,1,2,3,4,5,6,7,8,9};
相当于a[0]=0;a[1]=1;...a[9]=9;
可以只给部分元素赋初值。
当{}中值的个数少于元素个数时,只给前面部分元素赋值。
例如:
inta[10]={0,1,2,3,4};
表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
当{}中值的个数多于元素个数时,系统出错
数组的初始赋值的几点注意:
只能给元素逐个赋值,不能给数组整体赋值。
例如给十个元素全部赋值1,只能写为:
inta[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为:
inta[10]=1;
注意点
•C语言中规定数组的下标从0开始
例如:
inta[5]表示数组a有5个元素
5个元素分别为:
a[0],a[1],a[2],a[3],a[4]
main()
{inta[11];
inti,j,t;
printf("\ninput10numbers:
\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++)
{if(a[i]>a[i+1])
{t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
printf("thesortednumber:
\n");
for(i=1;i<11;i++)
printf("%d",a[i]);
}
二维数组
二维数组定义的一般形式是:
类型说明符数组名[常量表达式1][常量表达式2];
例:
inta[3][4];
定义了一个3行4列的数组,数组名为a,该数组的元素共有3×4=12个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
二维数组元素的引用
二维数组的元素的引用形式为:
数组名[下标][下标]
其中下标应为整型常量或整型表达式
例:
a[2][3]表示a数组第三行第四列的元素
分析下列两行程序的功能:
floatb[3][4];——定义一个三行四列的二维数组
b[1][2]=3;——第二行第三列的数是3
初始化说明
可以只对部分元素赋初值,未赋初值的元素自动取0值。
例如:
inta[3][3]={{1},{2},{3}};是对每一行的第一列元素赋值,未赋值的元素取0值。
将一个二维数组行和列互换,存到另一个数组中。
123
a=456
12
b=34
56
b[0][0]=a[0][0]
b[0][1]=a[1][0]
b[2][1]=a[1][2]
b[i][j]=a[j][i]
main()
{
inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf("\narraya:
\n\n");
for(i=0;i<=1;i++)
{for(j=0;j<=2;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("\narrayb:
\n\n");
for(i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
getch();
}
有一个3×4的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和列号
1234
9876
-1010-52
main()
{inti,j,row=0,colum=0,max;
inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{max=a[i][j];
row=i;
colum=j;
}printf("max=%d,row=%d,colum=%d",max,row,colum);
}
字符数组
用来存放字符数据的数组称为字符数组。
字符数组的定义
数组类型数组名[常量表达式]
例:
charc[10];/*定义有10个元素的数组*/
charch[5][10];/*定义5*10的二维字符数组*/
字符数组的初始化
字符数组也可在定义时作初始化赋值。
例:
char[11]={‘c’,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’};
赋值后各元素的值为:
cprogram,其中c[9]、c[10]未赋值,系统则自动赋予为空字符‘\0’值。
当对全体元素赋初值时也可以省去长度说明。
如下两语句等价:
chara[]={‘I’,‘’,‘a’,’m’,‘’,’h’,’a’,’p’,’p’,’y’};
chara[10]={‘I’,‘’,‘a’,’m’,‘’,’h’,’a’,’p’,’p’,’y’};
字符串和字符串结束标志
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
字符串结束标志为‘\0’;因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志
例:
charc[]={‘a’,’b’,’c’,’\0’};
charc[10]={‘a’,’b’,’c’};/*后面元素自动填充空字符‘\0’*/
以字符串对字符数组初始化
C语言允许用字符串的方式对数组作初始化赋值
例:
charc[]={‘C’,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’,’\0’};
可写为:
charc[]={"Cprogram"};或去掉{}写为:
charc[]="Cprogram";
字符数组的输入输出
可用printf函数和scanf函数中使用“%s”格式控制符一次性输出/输入一个字符数组中的字符串
main()
{charc[]="BASIC\ndBASE";
printf("%s\n",c);
}
而在输出表列中给出数组名则可。
不能写为:
printf("%s",c[]);
main()
{charst[15];
printf("inputstring:
\n");
scanf("%s",st);/*注意此处没有取地址符‘&’*/
printf("%s\n",st);
}
本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以至少留出一个字节用于存放字符串结束标志`\0`
注意点
定义一个字符数组,如果不作初始化赋值,则必须说明数组长度
当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
例如上例scanf(“%s”,st);
当输入:
thisisabook的字符串时,则只有this输入到数组st中。
字符串常用函数使用说明
关于字符串输入输出的函数,必须包含头文件stdio.h
关于字符串处理函数,必须包含头文件string.h
字符串常用函数
字符串输出函数puts
格式:
puts(str);
功能:
把字符数组中的字符串输出到显示器。
即在屏幕上显示。
它等价于:
printf("%s",str);
字符串输入函数gets
格式:
gets(str);
功能:
从键盘上输入一个字符串直到回车键结束。
将输入的字符串加上结束标志‘\0’,存放到数组或字符指针所指向的一片存储单元。
#include
main()
说明:
当输入的字符串中含有空格时,输出仍为全部字符串。
这是与scanf函数不同的。
{
charc[10];
printf("Pleaseinputastring:
");
gets(c);
puts(c);
}
字符串连接函数strcat
格式:
strcat(str1,str2)
功能:
把字符数组str2中的字符串连接到字符数组str1中字符串的后面,并删去字符串1后的串标志“\0”。
本函数返回值是符数组1的首地址。
字符串拷贝函数strcpy
格式:
strcpy(str1,str2);
功能:
把字符数组str2中的字符串拷贝到字符数组str1中。
串结束标志“\0”也一同拷贝。
str2也可以是一个字符串常量。
这时相当于把一个字符串赋予一个字符数组
main()
{charc1[10]="111111",c2[10]="222";
strcpy(c1,c2);
puts(c1);其内存储存是:
2
2
2
\0
1
1
\0
\0
\0
\0
}
程序运行结果:
222
注意:
本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。
字符串比较函数strcmp
格式:
strcmp(str1,str2)
功能:
按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
str1==str2,返回值=0
str1>str2,返回值>0(一般为1)
str1例:
strcmp(“ABC”,”ABB”);比较的是其字符串的ASCII码,+号是个字
strcmp(“36+55”,”abcd”);符,不是运算符作用
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
#include
main()
{charstr[20];
printf(“Pleaseinputthepassed:
”);
scanf(“%s“,str);
if(strcmp(str,“1234”)==0)
printf(“Passed\n”);
else
printf(“Denied\n”);
}
程序的功能:
输入密码
测字符串长度函数strlen
格式:
strlen(str);
功能:
测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值
字符大写转小写函数strlwr
格式:
strlwr(str)
功能:
将字符串str中的大写字母转换为小写字母。
字符小写转大写函数strupr
格式:
strupr(str)
功能:
将字符串str中的小写字母转换为大写字母。
编程实现从键盘输入10位学生的成绩,统计出最高分、最低分、和平均分。
main()
{floata[10],i,max=-1,min=101,sum=0;
for(i=0;i<=9;i++)
{scanf("%f",&a[i]);
if(a[i]>max)max=a[i];
if(a[i]sum=a[i]+sum;
}
printf("max=%f,min=%f,average=%f",max,min,sum/10);
getch();
}
用数组来处理Fibonacci数列,输出其前20项。
main()
{inti;
intf[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{if(i%5==0)printf("\n");/*规定换行,规整格式*/
printf("%12d",f[i]);
}
getch();
}
从键盘输入10个数存在一个数组中,再将其反序复制到另一个数组中。
(有多解)
main()
{inta[10],b[10],i;
for(i=0;i<=9;i++)
{scanf("%d",&a[i]);
b[9-i]=a[i];
}
for(i=0;i<10;i++)
printf("%d\n",b[i]);
getch();
}
输入10个数,求平均值及高于平均值的数
main()
{
floatave,s=0,a[10],i;
for(i=0;i<10;i++)
{scanf("%f",&a[i]);
s=s+a[i];}
ave=s/10;
printf("%f\n",ave);
for(i=0;i<10;i++)
{if(a[i]>ave)
printf("%f",a[i]);
}
getch();
}
由键盘输入10个数,放在一个数组中,并将其排好序后放在第二个数组中。
main()
{inta[11],b[11],i,j,t;
for(i=1;i<11;i++)
scanf("%d",&a[i]);
for(j=1;j<10;j++)
for(i=1;i<=10-j;i++)
{if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}
for(i=1;i<11;i++)
{b[i]=a[i];
printf("%d",b[i]);
}
getch();
}
有两个4X3的矩阵,将其相加,并输出。
提示:
即将两个4行3列的二维数组对应元素相加到第三个二维数,输出。
main()
{inta[4][3],b[4][3],c[4][3],i,j;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<4;i++)
for(j=0;j<3;j++)
scanf("%d",&b[i][j]);
for(i=0;i<4;i++)
{for(j=0;j<3;j++)
{c[i][j]=a[i][j]+b[i][j];
printf("%2d",c[i][j]);
}
printf("\n");
}
getch();
}
编写一个程序,求一个字符在一个字符串中的位置.
#include
main()
{
chars[20],ch;
inti;
printf("Inputstring:
\n");
gets(s);/*scanf具有缓冲区会把换行符缓存而影响下面的运行*/
printf("Inputthechar:
\n");
ch=getchar();
for(i=0;s[i]!
=ch;i++);
printf("%d",i+1);
getch();
}
编写一个程序,将两个字符串连接起来.
main()
{chars1[40],s2[20];
inti,j;
printf("Inputs1:
\n");
gets(s1);
printf("Inputs2:
\n");
gets(s2);
for(i=0;s1[i]!
='\0';i++);
for(j=0;s2[j]!
='\0';j++)
s1[i+j]=s2[j];
printf("Thestringis:
%s",s1);
getch();
}
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
算法:
变量word来作为判别是否单词开始的标志,若word=0表示末出现单词,若出现单词,则word置成1。
#include"stdio.h"
main()
{charc,string[80];
inti,num=0,word=0;
gets(string);
for(i=0;(c=string[i])!
='\0';i++)
if(c=='')word=0;
elseif(word==0)
{word=1;
num++;}
printf("Thereare%dwordintheline.\n",num);
getch();
}
编写一个程序,求一个字符在一个字符串中的位置.
#include
main()
{chars[20],ch;
inti;
printf("Inputstring:
\n");
gets(s);
printf("Inputthechar:
\n");
ch=getchar();
for(i=0;s[i]!
=ch;i++);
printf("%d",i+1);
getch();
}
有一已经从小到大排好序的数组,今输入一数,要求按原来排序的规律将它插入数组中。
main()
{inta[10]={1,3,5,7,9,11,13,15,17};
inti,j,k,num;
printf("Arraya:
\n");
for(i=0;i<9;i++)
printf("%d",a[i]);
printf("\nInputanumber:
\n");
scanf("%d",&num);
if(num>a[8])
a[9]=num;
else
{for(j=0;j<10;j++)
{if(a[j]>num)
{for(k=9;k>=j;k--)
a[k]=a[k-1];
a[j]=num;
break;
}
}
}
for(j=0;j<10;j++)
printf("%d",a[j]);
getch();
}
有一已经从小到大排好序的数组,今输入一个数,若该数在数组里面有,即将该数从数组中删除。
main()
{inta[10]={1,2,3,4,5,6,7,8,},i,j,b;
for(i=0;i<10;i++)
printf("%d",a[i]);
scanf("%d",&b);
for(i=0;i<10;i++)
if(b==a[i])
break;
for(j=i;j<9;j++)
a[j]=a[j+1];
for(i=0;i<10;i++)
printf("%d",a[i]);
getch();
}
编写一个将一字符串逆转的程序。
#include
#include
main()
{chars1[20],s2[20];
inti,j;
printf("Inputstring:
\n");
gets(s1);
i=strlen(s1);
for(j=0;s1[j]!
='\0';j++)
s2[i-1-j]=s1[j];
s2[i]='\0';
printf("Thereversestring:
\n%s",s2);
getch();
}
一个学习小组有5个人,每个人有三门课的考试成绩。
求全组各分科的平均成绩和各位同学的平均成绩,并保存起来。
各人成绩如下:
语数英
张807592
王616571
李596370
赵858790
周767785
并可分别按科目、或平均分进行排序。
#include
main()
{inti,j,k,s,a[5][4]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
intv[3],xz,m;
intt[4];
for(j=0;j<3;j++)
{s=0;
for(i=0;i<5;i++)
s=s+a[i][j];
v[j]=s/5;
}
for(i=0;i<5;i++)
{for(j=0;j<3;j++)
a[i][3]=a[i][3]+a[i][j];
a[i][3]=a[i][3]/3;
}
s:
printf("1:
各科平均分2:
各位同学平均分\n3:
按平均分排序4:
显示\n");
printf("请选择:
");
scanf("%d",&xz);
switch(xz)
{case1:
printf("语文数学英语\n%4d%4d%4d",v[0],v[1],v[2]);break;
case2:
printf("学号成绩\n");
for(i=0;i<=4;i++)
printf("%4d%4d\n",i+1,a[i][3]);
break;
case3:
for(i=0;i<=3;i++)
for(j=0;j<=3-i;j++)
{if(a[j][3]>a[j+1][3])
{for(k=0;k<4;k++)
{t[k]=a[j][k];
a[j][k]=a[j+1][k];
a[j+1][k]=t[k];
}