第一篇:C语言数组知识点总结
数组
定义:数组是有序的并且具有相同类型的数据的集合。
一维数组
1、一般形式:类型说明符 数组名[常量表达式];例如: int a[10];元素为a[0]----a[9].2、常量表达式中不允许包含变量,可以包含常量或符号常量。
3、数组元素下标可以是任何整型常量、整型变量或任何整型表达式。
4、可以对数组元素赋值,数组元素也可以参与运算,与简单变量一样使用。
5、使用数值型数组时,不可以一次引用整个数组,只能逐个引用元素。
6、需要整体赋值时只可以在定义的同时整体赋值。如
int a[10]={0,1,2,3,4,5,6,7,8,9};正确。
int a[10];a[10]={0,1,2,3,4,5,6,7,8,9};错误。
7、可以只给一部分元素赋值。例如:
int a[10]={5,8,7,6};后面没有赋值的元素值默认为0。
8、对全部数组元素赋值时可以不指定数组长度,例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};可以写成 int a[]={0,1,2,3,4,5,6,7,8,9};
但是,既不赋初值,也不指定长度是错误的。例如:int a[];错误。
二维数组
1、一般形式:类型说明符 数组名[常量表达式1][常量表达式2];例如:
int a[3][4];可以看成是包含3个一维数组,每个一维数组里包含4个元素。一共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]
2、与一维数组一样元素下标可以是是任何整型常量、整型变量或任何整型表达式。
3、需要整体赋值时只可以在定义的同时整体赋值。例如:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};正确。
int a[3][4];a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};错误。
4、可以把所有数据写在一个花括号内。例如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};正确。
5、可以只对部分元素赋值。例如:
int a[3][4]={{1},{5},{9}};其余未赋值的元素默认为0。
int a[3][4]={{1},{5,6}};可以看成是int a[3][4]={{1,0,0,0},{5,6,0,0},{0,0,0,0}};
6、对全部数组元素赋值时可以省略第一维长度,第二维不可以省略。例如:
a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
可以写成a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
或者a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
字符数组
1、定义:char a[10];字符数组a长度为10。每个元素只能存放一个字符。例如:
a[0]='h';a[1]='a';a[2]='p';„„
2、初始化:
char a[]={'h','a','p','p','y'};
char a[]=“happy”;
char a[]={“happy”};注意,因为字符串结尾自动加' ',所以char a[]=“happy”;长度为6,不是5。
3、C语言中没有字符串变量,字符串的输入、存储、处理和输出等必须通过字符数组实现。
4、字符串的输入。
scanf();可以用%C逐个字符输入比如char a[6];for(i=0;i<6;i++)scanf(“%c”,&a[i]);
可以用%S以字符串的形式输入,比如char a[6];scanf(“%s”,a);注意,a前不用加&,因为a是数组名,已经代表了数组首地址。
注意:以%S输入时,以第一个非空白字符开始,终止于第一个空白字符。比如:输入How are you
时。只输出How.gets();作用为输入一个字符串。与scanf();功能一致,但空格和回车都存放在数组中,最后自动加入‘ ’.不会出现上面输出不全的情况。
调用方式为:gets(数组名);需要包含头文件“stdio.h”.5、字符串的输出。
printf();可以使用%C逐个字符输出,比如:char a[6];for(i=0;i<6;i++)printf(“%c”,a[i]);
可以用%S以字符串的形式输出,比如char a[6];printf(“%s”,a);
puts();输出一个字符串,结尾自动换行。
调用形式:puts(字符数组名或字符串常量);需包含头文件“stdio.h”
常用字符串处理函数(以下函数需要头文件“string.h”)
1、strlen()作用是测试字符串长度。这里不包括‘ ’.使用形式strlen(数组名或字符串常量)
2、strcat()作用是连接两个字符串。调用方式strcat(字符数组1名,字符数组2名);合并后的字符串存放在字
符数组1中。
3、strcmp()比较两个字符串是否相等。调用方式strcmp(字符串1,字符串2);相等时值为0。1>2时为正数。
1<2时为负数。
4、strcpy()复制字符串。调用方式strcpy(字符数组1,字符串2);2的内容复制到1中。1只能是字符数组名。
第二篇:c语言数组方法总结
数组方法总结
1.输入元素的值:
inti,a [10];
for(i = 0;i < 9;i ++);
a[i] = i;
(1)正序排列:(2)倒序排列:
for(i =0;i < 10;i ++)for(i = 9;i >= 0;i--)printf(“%d”, a[i]);printf(“%d”, a[i]);
2.初始化元素的值:
(1)在定义时,将数组元素一次放在一对花括号里;
eg: int a[10]={1,2,3,4,5,6,7,8,9,0};
(2)可以只给一部分元素赋值:
eg: int a[10]={1,3};
(3)使数组全部元素为0:
eg: int a[10]={0,0,0,0,0,0,0,0,0,0};或者 int a[10]={0};
(4)在对全部元素赋初值的时候,由于元素数已经确定,因此,可以不指定数组长度。(注:数组长度与提供初值个数不相同时,则长度不可以省略。)
3.巧妙地将两个元素列在一个循环中输出:(用for循环处理fobonacci数列); eg:int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
4. 数列Fobonacci数列核心:
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
5.换行操作:
for(i=0;i<=20;i++)/*当然也可以在for循环中处理,直接将{if(i%5= =0)printf(“n”);if(i%5= =0)printf(“n”);插入换行*/Printf(“%12ld”,f[i]);
}
6.起泡法:
int a[10];
for(j=0;j<9;j++)/*进行n-1趟比较*/
for(i=0;i<9-j;i++)/*在j趟比较中,比较n-1次*/
if(a[i]>a[i+i])/*由小到大排列,if(a[i] 7.初始化二维数组: 分行给二维数组赋初值; 将所有的元素都写在一个花括号里; 对部分元素赋值: 1)int a[3][3]={{3},{5},{9}};只讲0列元素赋值 2)int a[3][3]={{1}, {0,6},{0,0,11}};对部分元素赋值,对非0元素少使用方便 3)int a[3][3]={{1}, {5,6}};只对几行元素赋值 4)int a[3][3]={{1}, {},{9}};对第二行元素赋值 对全部元素赋值可以省略一维长度: 对部分元素赋初值,在省略一位长度时,应分行赋值: 8.二维数组的输入输出: 输入:直接定义 输出: for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf(“%5d”,b[i][j]); printf(“n”); } 9.二维数组的行列转换: b[j][i]=a[i][j]; 10.数组中求最大值并输出行列号: Eg:inti,row=0,colum=0,max; inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 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;} 11.字符数组的初始化方法: 逐个字符初始化: eg:char c[10]={„I‟, „‟, „a‟, „m‟, „‟, „h‟, „a‟, „p‟, „p‟, „y‟}; 1)在定义字符数组时,不初始化,则数组中的各元素的之不可预料; 2)如果花括号中提供的初值个数(即字符个数)大于数组的长度,则按语法错误 处理; 3)如果花括号中提供的初值个数(即字符个数)小于数组的长度,其余元素自动 定为空字符即(„ ‟); 如果提供的初值个数与数组长度相同,则在定义时可以省略数组长度; 也可以定义一个二维数组: eg:char diamond[5][5]={{},{},{},{},{}}; 用字符串常量,使字符数组初始化: eg: char c[ ]={“I am happy”};或char c[ ]= “I am happy”; 12.字符数组的输出: 一维:二维: for(i=0;i<=11;i++)for(i=0;i<=11;i++) printf(“%c”,c[i]);for(i=0;i<5;i++) printf(“n”);printf(“%c”,diamond[i][j]); 13.字符数组输出最大值: eg:if(strcmp(string,str[1]>0) strcpy(string,str[0]>0); else strcpy(string,str[1]); if(strcmp(str[2],string>0) strcpy(string,str[2]); printf(“%s”,string); 实验九 数组 一、一维数组 1、编写程序,测试下列数组的定义方式是否正确(1)main(){ int n;scanf(“%d”,&n);int a[n];//…….}(2)main(){ int n=10;int a[n];a[0] = 1;//......}(3)#include 2、运行下面的C程序,根据运行结果,可以说明什么? #include 3、调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。main(){ int i,n,a[10],av; for(i=0;i for(i=0;i if(i%3= =0)printf(“n”); } for(i=0;i!=n;i++)av+=a[i]; printf(“av=%fn”,av); } //尤其注意最后一次循环 上面给出的程序是完全可以运行的,但是运行结果是完全错误的。调试时请注意变量的初值问题、输出格式问题等。请使用前面实验所掌握的调试工具,判断程序中的错误并改正。在程序运行过程中,可以使用 5、编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。分析讨论 通过实验,分析定义与引用数组的区别。二、二维数组 1.写出程序输出结果(1)#include”stdio.h” main(){ int i, j, t, a[4][4]={11,22,33,44,1,2,3,4,10,20,30,40,12,22,32,42};for(i=0;i<4;i++)for(j=0;j for(j=0;j<4;j++)printf(“%d”,a[i][j]); } }(2)#include”stdio.h” main(){int i,j,m,n,a[3][4]={43,32,22,13,11,22,33,44,44,11,32,31};m=n=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[m][n]>a[i][j]){m=i;n=j;} printf(“a[m][n]=%d,m=%d,n=%d”,a[m][n],m,n);} 3、操作符&用以求一个变量的地址,这在函数scanf 中已经使用过了。现在要你设计一个程序,返回一个3 * 5 的二维数组各元素的地址,并由此说明二维数组中各元素是按什么顺序存储的。 4、输入4×4的数组,编写程序实现: ⑴ 求出对角线上各元素的和; ⑵ 求出对角线上行、列下标均为偶数的各元素的积; ⑶ 找出对角线上其值最大的元素和它在数组中的位置。 三、字符数组 1.验证程序输出结果 #include”stdio.h” main(){char a[ ]=“ab12cd34ef”;int i, j;for(i=j=0;a[i ];i++)if(a[ i]>=’a’&&a[ i]<=’z’)a[ j++ ]=a[ i ];a[ j ]=’ ’; printf(“%sn”,a);} 2、编写程序,输入若干个字符串,求出每个字符串的长度,并打印最长一个字符串的内容。以“stop”作为输入的最后一个字符串。3、1983 年,在ACM图林奖颁奖大会上,杰出的计算机科学家,UNIX 的鼻祖,C语言的创始人之一,图林大奖得主,Ken Thompson 上台的第一句话是:“我是一个程序员,在我的1040表上我自豪地写上了我的职业。作为一个程序员,我的工作就是写程序,今天我将向大家提供一个我曾经写过的最精练的程序。”这个程序如下: #include 1.以下为一维整型数组a的正确说明是_________.a)int a(10);b)int n=10,a[n];c)int n;d)#define SIZE 10;scanf(”%d“,&n);int a[SIZE];int a[n];2.以下对二维数组a的正确说明是________.a)int a[3][];b)float a(3,4); c)double a[1][4] d)float a(3)(4);3.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为______.(假设a[0][0]位于数组的第一个位置上。)a)i*m+j b)j*m+i c)i*m+j-1 d)i*m+j+1 4.若二维数组a有m列,则在a[i][j]前的元素个数为________.a)j*m+i b)i*m+j c)i*m+j-1 d)i*m+j+1 5.若有以下程序段: int a[]={4,0,2,3,1},i,j,t;for(i=1;i<5;i++){t=a[i];j=i-1;while(j>=0&&t>a[j]){a[j+1]=a[j];j--;} a[j+1]=t;}......则该程序段的功能是_________.a)对数组a进行插入排序(升序)b)对数组a进行插入排序(降序)c)对数组a进行选择排序(升序)d)对数组a进行选择排序(降序)6.有两个字符数组a、b,则以下正确的输入语句是_______.a)gets(a,b);b)scanf(”%s%s“,a,b);c)scanf(”%s%s“,&a,&b);d)gets(”a“),gets(”b“);7.下面程序段的运行结果是_________.char a[7]=”abcdef“; #include a)SSW* b)SW* c)SW*A d)SW 二、填空题 1. 若有定义:double x[3][5];则x数组中行下标的下限为____0___,列下标的上限为___4____.2.下面程序以每行4个数据的形式输出a数组,请填空。 #define N 20 main(){int a[N],i;for(i=0;i main(){ int a[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j_____)sum=sum+_a[i][j]______;printf(”sum=%dn“,sum);} 4.当从键盘输入18并回车后,下面程序的运行结果是_____10010___.main(){int x,y,i,a[8],j,u,v;scanf(”%d“,&x);y=x;i=0;do {u=y/2; a[i]=y%2;i++;y=u;}while(y>=1)for(j=i-1;j>=0;j--)printf(”%d“,a[j]); main(){int a[5]={4,7,2,5,1};int i,j,m;for(i=1;i<5;i++){m=a[i];j=i-1_; while(j>=0&&m>a[j]){a[j+1]=a[j]_______;j--;} a[j+1]_______=m;} for(i=0;i<5;i++)printf(”%d“,a[i]);printf(”n“);} 6.下面程序的功能是在三个字符串中找出最小的,请填空。#include C语言实验书P37 (2)#include int main(void) { int i; char ch; char str[100]; printf(“请输入字符串:n”); scanf(“%s”, str); printf(“请输入查找字符:n”); scanf(“ %c”, &ch); for(i=0;str[i]!=' ';i++) { if(str[i] == ch) { printf(“位置为:%dn”, i+1); return 0; } } printf(“该字符不存在n”); return 0; } (3) (1) #include main() { long matrix[8][8],min,max,temp; int i,j,m,n; printf(“nPlease input n of Matrix:n”); scanf(“%d”,&n); m=n; printf(“nPlease input elements of Matrix(%d*%d):n”,m,n);for(i=0;i for(j=0;j scanf(“%ld”,&matrix[i][j]); for(i=0;i { for(j=0;j printf(“%5ld”,matrix[i][j]); printf(“n”); } } (2) #include main() { long matrix[8][8],min,max,temp; int i,j,m,n,nMax=0,nMin=0; printf(“nPlease input n of Matrix:n”); scanf(“%d”,&n); m=n; printf(“nPlease input elements of Matrix(%d*%d):n”,m,n);for(i=0;i for(j=0;j scanf(“%ld”,&matrix[i][j]); min=max=matrix[0][0]; for(i=0;i for(j=0;j { if(matrix[i][j]>max) { max=matrix[i][j]; nMax=i; } else if(matrix[i][j] { min=matrix[i][j]; nMin=i; } } for(j=0;j { temp=matrix[nMax][j]; matrix[nMax][j]=matrix[nMin][j]; matrix[nMin][j]=temp; } printf(“nResult matrix:n”); for(i=0;i { for(j=0;j printf(“%5ld”,matrix[i][j]); printf(“n”); } } (3) #include main() { long matrix[8][8],min,max,temp; int i,j,m,n,nMax=0,nMin=0; printf(“nPlease input n of Matrix:n”); scanf(“%d”,&n); m=n; printf(“nPlease input elements of Matrix(%d*%d):n”,m,n);for(i=0;i for(j=0;j scanf(“%ld”,&matrix[i][j]); min=max=matrix[0][0]; for(i=0;i for(j=0;j { if(matrix[i][j]>max) { max=matrix[i][j]; nMax=i; } else if(matrix[i][j] { min=matrix[i][j]; nMin=i; } } for(j=0;j { temp=matrix[nMax][j]; matrix[nMax][j]=matrix[nMin][j]; matrix[nMin][j]=temp; } printf(“nResult matrix:n”); if(nMax!=nMin) for(i=0;i { for(j=0;j printf(“%5ld”,matrix[i][j]); printf(“n”); } Printf(“same line!n”) (4)#include void main() { int a[20]; int n,j,i,k,m=20; printf(“给定的数组为:n”); for(n=0;n<20;++n) { a[n]=2*n+3; printf(“%d ”,a[n]); } printf(“n”); printf(“输入要查找的数:”); scanf(“%d”,&j); for(n=0;n<=m;) { i=(m+n)/2; if(a[i] n=i+1; else if(a[i]>j) m=i-1; else if(a[i]=j) { printf(“该数在数组的第%d位上n”,i+1);break; } if(n>m) { printf(“No Foundn”); } } } 二、#include void arr(); int sea(int j); int a[20]; void main() { int n,j,i,h; printf(“请输入20个数据:n”); for(n=0;n<20;++n) scanf(“%d”,&a[n]); } arr(); printf(“n请输入要查找的数:”); scanf(“%d”,&j); h=sea(j); if(h==0) { printf(“No foundn”); } else { printf(“该数在已排序数组的第%d位n”,h)} } void arr() { int z,n,k; for(n=0;n<20;++n) { for(k=0;k<19-n;k++) if(a[k]>a[k+1]) { z=a[k]; a[k]=a[k+1]; a[k+1]=z; } printf(”将数组排序,得:n“); for(n=0;n<20;++n) printf(”%d ",a[n]); } } int sea(int j) { int n,i,h,m=20; for(n=0;n<=m;) { i=(n+m)/2; if(a[i] n=i+1; else if(a[i]>j) m=i-1; else if(a[i]=j) { h=i+1;break;}}if(n>m)h=0;return h;} 实习六:数组实习 姓名:尹思智 学号:2012014413 完成日期2013年4月 一、实习目的 1.从键盘输入10个整数,将最大数调到最前面,最小数调到最后面。2.已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中 3.从键盘任意输入两个字符串,不用库函数strcat,将两串字符连接起来。4 输入一个5×5的数组,分别求其主对角线和次对角线上元素之和 5.由键盘任意输入10个学生的姓名(以拼音形式),将它们以字典顺序从小到大排序。 6打印如下形式的杨辉三角 1 1 1 1 1 10 5 7.定义一数组(长度大于10),从键盘输入数组元素的值,完成下面操作: (1)从键盘输入一个数,用顺序查找法找出该数在数组中的位置;或者给出没有找到的信息; (2)对数组的元素从小到大排序; (3)从键盘输入一个数,用折半查找法找出该数在数组中的位置;或者给出没有找的信息。 8.直接选择排序法。算法描述如下: (1)从n个数中找到最小的数,若此数不是数组的第一个元素,则与第一个元素交换位置; (2)从剩下的n-1个数中找到最小的数,若此数不是数组第二个元素,则与第二个元素交换位置; (3)以此类推,直到完成排序 9.编写程序将两个有序数组归并。例如数组{1,3,5}和数组{2,4,6,8,10},归并的结果是{1,2,3,4,5,6,8,10 } 二、实习步骤 1.从键盘输入10个整数,将最大数调到最前面,最小数调到最后面。 流程图; 运行图; 2.已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中 流程图 运行图 3.从键盘任意输入两个字符串,不用库函数strcat,将两串字符连接起来。 流程图 运行图 输入一个5×5的数组,分别求其主对角线和次对角线上元素之和 流程图 运行图 5、由键盘任意输入10个学生的姓名(以拼音形式),将它们以字典顺序从小到大排序。 流程图 运行图 6打印如下形式的杨辉三角 1 1 1 1 1 10 5 流程图 运行图 7.定义一数组(长度大于10),从键盘输入数组元素的值,完成下面操作: (1)从键盘输入一个数,用顺序查找法找出该数在数组中的位置;或者给出没有找到的信息; (2)对数组的元素从小到大排序; (3)从键盘输入一个数,用折半查找法找出该数在数组中的位置;或者给出没有找的信息。 流程图 运行图 8.直接选择排序法。算法描述如下:(1)从n个数中找到最小的数,若此数不是数组的第一个元素,则与第一个元素交换位置; (2)从剩下的n-1个数中找到最小的数,若此数不是数组第二个元素,则与第二个元素交换位置; (3)以此类推,直到完成排序 流程图 运行图 9.编写程序将两个有序数组归并。例如数组{1,3,5}和数组{2,4,6,8,10},归并的结果是{1,2,3,4,5,6,8,10 } 流程图 运行图 三、实习总结第三篇:C语言数组
第四篇:C语言数组实验报告
第五篇:C语言数组实习