数组
数 组
1.定义
定义: 类型 数组名[下标1] [下标2] [下标3]…………; 维数:数组下标的个数表示维数 下标值得长度表示相应的长度 一维:存储一组相同类型的数据 short score[100]//100个元素的一维短整型数组 定义数组时必须使用整型常量或者整型常量表达式 第一个元素的下标为0
二维:存储举矩阵元素或者二维表格 short matrix[3][4] //3行4列二维数组 注意:C语言中数组在内存中是按行存储的 占用字节数 = sizeof(基类型)*元素个数
2.数组引用
方式:
数组名[下标1][下标2]……………………
3.数组初始化
按元素初始化
short matri [2][3] = {1, 2, 3, 4, 5, 6} //要使用花括号
按行初始化
short matri [2][3] = {{1, 2, 3} , {4, 5, 6}}
若元素不足时,则在空余的地方赋值默认值0
static short a[3]; == static short a[3] = {0,0,0}
4.数组使用实例1:菲波那切数列
#include<stdio.h> void main() { int a[10]; int i ; i = 2; a[0] = 1; a[1] = 1; printf("%d\n",a[0]); printf("%d\n",a[1]); for (i; i<10; i++) { a[i] = a[i-1]+ a[i-2]; printf("%d\n",a[i]); } }
5.字符串
对字符串进行处理必须添加 #include<string.h> strlen(字符串) //返回字符串实际长度,不包含'\0'在内的实际长度 strcmp(str1 , str2) //比较大小 strcat(字符数组1, 字符串2) //连接
gets() //从键盘输入字符串,返回字符串的首地址
puts() //从()内的参数表示的地址开始,一次输出存储在存储单元内的字符,当遇到'\0'时结束输出。
strcpy() //字符串赋值函数
字符数组输入\输出 按c格式符一个一个字符单独输入\输出 格式: (必须的格式) for (i=0; str[i] != '\0'; i++) { printf("%c", str[i]); } 按s格式符作为一个整体输入\输出 scanf("%s",str); printf("%s", str);
#include<stdio.h> #include<string.h> #define A 80 int main(void) { int n; char str[A] ,min[A]; printf("Please enter five names:\n"); gets(str);//输入一个字符串 strcpy(min , str);//将其作为最小字符串保存 for (n =1;n<5;n++) { gets(str); if (strcmp(str ,min)< 0)//比较两个字符串的大小 { strcpy(min, str);//将字符串str复制给min } } printf("The min is:"); puts(min); //输出最小字符串min return 0; }
结构体数组
struct date { int day; int month; int year; }; struct date date1[100];
常用字符串处理函数
头文件
#include<stdio.h> #include<string.h>
字符串输出函数 // 但是要保证遇到"\0"结束
puts()
字符串输入函数 // 自动在结尾添加 "\0",输入字符的个数小于字符数组的长度
gets()
字符串连接函数
strcat()
字符串复制函数
strcpy()
字符串比较函数
strcmp()
字符串长度函数(遇到"\0"就返回值)
strlen()
实例
//查询工资 #include<stdio.h> #define N 5 #define MIN 1500 int main() { int i; float gz[N]; int a[N] = {0}; int cnt = 0; for(i = 0; i < N ;i++) { printf("请输入第%2d位职工的工资:",i+1); scanf("%f",&gz[i]); if (gz[i] >= MIN) { a[cnt++]=i; } } printf("==================================\n"); printf("工资在%d及以上的共有%d位\n", MIN, cnt); printf("他们是:\n"); for (i=0; i<cnt; i++) { printf("第%2d位%.2f\n", a[i]+1, gz[a[i]]); } }
//由键盘输入5个圆的半径,分别输出他们的面积 #include<stdio.h> #include<math.h> #define N 4 #define PI 3.14 int main() { float r, s; float a[N]; int i = 0; for (i = 0;i < N+1; i++) { printf("请输入第%d个圆的半径r = ",i+1); scanf("%f", &a[i]); } for(i = 0;i<5;i++) { r = a[i]; s = PI * r * r; printf("第%d个圆的面积是:%f\n",i+1,s); } }
//工资排序 //采用选择法对5位职工工资有小到大的排序 #include<stdio.h> #define N 5 int main() { int i, j; int k; int a[N]; float gz[N]; float t; int tt; for (i =0; i<N; i++) { a[i] = i; printf("请输入第%d位职工的工资:", i+1); scanf("%f",&gz[i]); } for(i = 0; i<N; i++) { k = i; for(j = i +1; j<N; j++) { if (gz[j] < gz[k]) { k = j; } if (i != k) { t = gz[i];gz[i]=gz[k];gz[k]=t; tt = a[i];a[i]=a[k];a[k]=tt; } } } printf("=====================================\n"); printf("从小到大排序结果:\n"); for (i =0; i< N;i++) { printf("第%2d位%.2f\n", a[i]+1, gz[i]); } printf("=====================================\n"); }
//工资排序 //采用选择法对5位职工工资有小到大的排序 #include<stdio.h> #define N 5 int main() { int i, j; int flag; int a[N]; float gz[N]; float t; int tt; for (i =0; i<N; i++) { a[i] = i; printf("请输入第%d位职工的工资:", i+1); scanf("%f",&gz[i]); } for(i = 0; i<N; i++) { flag = 0; for(j = i +1; j<N-i; j++) { if (gz[j] > gz[j +1]) { t = gz[j];gz[j]=gz[j+1];gz[j+1]=t; tt = a[j];a[j]=a[j+1];a[j+1]=tt; flag = 1; } if (flag == 0) break; } } printf("=====================================\n"); printf("从小到大排序结果:\n"); for (i =0; i< N;i++) { printf("第%2d位%.2f\n", a[i]+1, gz[i]); } printf("=====================================\n"); }
//一组有序数据,插入一个数据保持原有的数据顺序 #include<stdio.h> #define N 10 int main() { int k; int count = 5; int newgz; int i; int gz[N] = {1000, 1200, 1300, 1400, 1500}; printf("插入新数据之前的数据为:"); for (i = 0; i < N; i++) { printf("%-6d",gz[i]); } printf("\n"); printf("请输入一个新数据:"); scanf("%d", &newgz); count += 1; for(i = 0; i<N; i++) { if(newgz <= gz[i]) { k = i; break; } } for (i = count; i>k ;i--) { gz[i] = gz[i -1]; } gz[k] = newgz; printf("插入新的数据后的数据:"); for (i = 0; i < count; i++) { printf("%-6d",gz[i]); } printf("\n"); getchar(); return 0; }
//删除数据,删除指定位置的数据,并且维持原有数据的相邻关系 #include<stdio.h> int main() { int i; int b; int a[10] = {1000, 1100, 1200, 1300, 1400}; printf("删除前的数据为:\n"); for(i = 0; i<10; i++) { printf("%-6d", a[i]); } printf("\n\n"); printf("输入要删除数据的位置(1-10)之间的一个数:\n"); scanf("%d",&i); printf("要删除的数据是:%d\n",a[i-1]); b = i -1; for(b ; b<10; b++) { a[i-1] = a[i]; } printf("删除数据后的数据为:\n"); for(i = 0;i<10; i++) { printf("%-6d",a[i]); } printf("\n\n"); getchar(); return 0; }
//删除数据,删除指定位置的数据,并且维持原有数据的相邻关系 #include<stdio.h> int main() { int i; int b; int a[10] = {1000, 1100, 1200, 1300, 1400}; printf("删除前的数据为:\n"); for(i = 0; i<10; i++) { printf("%-6d", a[i]); } printf("\n\n"); printf("输入要删除数据的位置(1-10)之间的一个数:\n"); scanf("%d",&i); if(i<0 || i>5) { printf("下标范围有误\n"); return;//退出程序 } printf("要删除的数据是:%d\n",a[i-1]); b = i -1; for(b ; b<10; b++) { a[i-1] = a[i]; } printf("删除数据后的数据为:\n"); for(i = 0;i<10; i++) { printf("%-6d",a[i]); } printf("\n\n"); getchar(); return 0; }
//删除数据,删除指定位置的数据,并且维持原有数据的相邻关系 #include<stdio.h> int main() { int i; int b; int a[5] = {1000, 1100, 1200, 1300, 1400}; printf("删除前的数据为:\n"); for(i = 0; i<5; i++) { printf("%-6d", a[i]); } printf("\n\n"); printf("输入要删除数据的位置(1-10)之间的一个数:\n"); scanf("%d",&i); if(i<0 || i>5) { printf("下标范围有误\n"); return;//退出程序 } printf("要删除的数据是:%d\n",a[i-1]); b = i -1; for(b ; b<5; b++) { a[i-1] = a[i]; } printf("删除数据后的数据为:\n"); for(i = 0;i<4; i++)//数据少了一个 { printf("%-6d",a[i]); } printf("\n\n"); getchar(); return 0; }
//由键盘输入5个职工的属性数据,查找工资为1600及以上的职工,并输出其属性数据 #include<stdio.h> #include<conio.h> #define N 3 //3位职工 #define MIN 1600 struct zhigong { char gonghao[10]; char name[10]; float gwgz; }; int main() { int i; int k; struct zhigong gz[N];//定义结构体数组 for(i=0; i < N; i++) { printf("请输入第%d位职员的属性。\n\n",i+1); printf("输入工号:"); scanf("%s", &gz[i].gonghao); printf("输入职员姓名:"); scanf("%s", &gz[i].name ); printf("输入工位工资:"); scanf("%f",&gz[i].gwgz ); printf("=================================\n"); } system("cls"); printf("请按任意键继续。"); getchar(); printf("=================================\n"); printf("岗位工资在1600及以上的职工有:\n\n\n"); printf("=================================\n"); for(k = 0; k < N; k++) { if (gz[k].gwgz >= MIN) { printf("%-10s%-10s%-10s\n","工号","姓名","岗位工资"); printf("%-10s%-10s%-10.2f",gz[k].gonghao,gz[k].name ,gz[k].gwgz ); printf("\n=================================\n"); } } getchar(); return 0; }
//由键盘输入5个职工的属性数据,查找工资为1600及以上的职工,并输出其属性数据 #include<stdio.h> #include<conio.h> #define N 3 //3位职工 #define MIN 1600 struct zhigong { char gonghao[10]; char name[10]; float gwgz; }; int main() { int i; int k; struct zhigong gz[N];//定义结构体数组 for(i=0; i < N; i++) { printf("请输入第%d位职员的属性。\n\n",i+1); printf("输入工号:"); scanf("%s", &gz[i].gonghao); printf("输入职员姓名:"); scanf("%s", &gz[i].name ); printf("输入工位工资:"); scanf("%f",&gz[i].gwgz ); printf("=================================\n"); } system("cls"); printf("请按任意键继续。\n"); getchar(); printf("=================================\n\n"); printf("岗位工资在1600及以上的职工有:\n"); printf("=================================\n"); printf("%-10s%-10s%-10s\n","工号","姓名","岗位工资"); for(k = 0; k < N; k++) { if (gz[k].gwgz >= MIN) { printf("%-10s%-10s%-10.2f",gz[k].gonghao,gz[k].name ,gz[k].gwgz ); printf("\n=================================\n"); } } getchar(); return 0; }
二维数组
//定义一个二维数组,接收输入的数据并以矩阵形式输出 #include<stdio.h> int main() { int a[2][3]; int i, j; for(i = 0;i < 2; i++) { for(j = 0;j < 3; j++) { printf("输入a[%d][%d]:",i,j); scanf("%d",&a[i][j]); } } for(i = 0;i < 2; i++) { for(j = 0;j < 3; j++) { printf("%5d",a[i][j]); } printf("\n"); } return 0; }
二维数组实例
//求3*3矩阵的转置矩阵 #include<stdio.h> int main() { int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int b[3][3]; int i,j; for(i = 0; i< 3; i++) { for(j = 0; j < 3; j++) { b[j][i] = a[i][j]; } } printf("转置前的矩阵为:\n"); for(i = 0; i< 3; i++) { for(j = 0; j < 3; j++) { printf("%4d",a[i][j]); } printf("\n"); } printf("转置后的矩阵为:\n"); for(i = 0; i< 3; i++) { for(j = 0; j < 3; j++) { printf("%4d",b[i][j]); } printf("\n"); } }
#include<stdio.h> #define M 3 #define N 6 int main() { int x[M][N]; int i, j, k; for (i = 0; i < M-1; i++) { printf("输入第%d个学生各科的成绩:\n", i+1); for (j = 0; j < N-1; j++) { scanf("%d",&x[i][j]); } } for (i = 0; i < N; i++) { x[M-1][i] = 0; for (k = 0;k < M-1;k++) { x[M-1][i] += x[k][i]; } } for(j = 0; j < M;j++) { x[j][N-1] = 0; for(k =0; k < N-1; k++) { x[j][N-1] += x[j][k]; } } printf("============================\n"); printf("输出统计结果\n"); for(i = 0; i < M; i++) { for(j = 0; j < N; j++) { printf("%-6d",x[i][j]); } printf("\n"); } printf("===========================\n"); return 0; }
字符数组与字符串
定义:
char str1[5];
char str2[10][80];
char str1[3] = {54, 23, 12};//在内存中占3*sizeof(char)个字节