文章目录

  • 一、一维数组基本知识
  • 二、一维数组经典例题讲解
    • 1.攻擂法求最值
    • 2.一维数组的逆置
    • 3.循环左/右移动
    • 4.查找数组元素(折半查找法)
    • 5.利用数组实现十进制转二进制/八进制/十六进制
      • 十进制转二进制:
      • 十进制转八进制:
      • 十进制转十六进制:
    • 6.求斐波那契数列
    • 7.冒泡排序法(数组实现)
  • 三、二维数组基本知识
  • 四、二维数组经典例题
    • 1.二维数组循环遍历
    • 2.输出数组上/下三角元素
    • 3.二维数组的转置(行列互换)
    • 4.杨辉三角
    • 5.利用数组求平均值(去掉最高和最低分)
      • 方法一:冒泡排序法
      • 第二种:攻擂求最值
    • 6.删除数组中指定下标的元素(2种)
    • 7.键盘获取数值 输出个位是奇数,十位数是偶数的所有数
    • 8.键盘获取数值 按照个位数一定顺序排序
    • 9.计算6位同学五门课程每人平均分

一、一维数组基本知识

基本格式:

数据类型数组名[常量表达式];eg.int a[5];

格式要求:

常量表达式必须是整形常量(表达式)或字符常量(表达式),但不可为实型或变量也不可以为空。

注意事项:

  • 数组元素个数等于数组长度
  • 元素引用时从0开始
  • 赋值后面跟的是大括号
  • 数组不可整体赋值
  • 引用数组元素时,数组下标可以是变量
  • a[0]叫做该数组的首元素,a[n]叫做尾元素
  • 初始化时直接赋值可以使常量表达式为空
  • 赋值位数不可多余规定位数,但是可以少(未赋值默认为0)

二、一维数组经典例题讲解

1.攻擂法求最值

#include int main(){int a[5],i,x=0;int max=a[0];//首先定义a[0]为最大值for (i=0;i<5;i++){printf("请输入第%d个值:\n",i+1);scanf("%d",&a[i]);if (a[i]>max)/*利用循环依次和定义的最大值进行比较*/{//若求最小值,将>改为<即可max=a[i];//若大于则该值取代原先最大值,并且将新的最大值的下角标赋值给xx=i;}}printf("最大值为:%d\n",max);printf("最大值下角标为:%d\n",x);}

运行结果:

2.一维数组的逆置

#include int main(){int a[5]={1,2,3,4,5};int i,j,t;for (i=0,j=4;i<j;i++,j--)//核心代码,作用为依次交换中间值两边的数值达到逆置的作用{t=a[i];a[i]=a[j];a[j]=t; //利用第三变量实现指定数值的交换}printf("该数组的逆置为:\n");for (i=0;i<5;i++)//输出语句{printf("%d",a[i]);}}

运行结果:

3.循环左/右移动

循环右移:若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 5,1,2,3,4

#include int main(){int a[5]={1,2,3,4,5};int i,k;k = a[4];//因为最右值将会被覆盖,所以先赋值给第三方变量进行保存for (i=3;i>=0;i--){a[i+1]=a[i];//将所有值都向右移动一位}a[0] = k;//再将刚才保存的数组尾元素赋值给首元素从而完成右移for (i=0;i<5;i++){ printf("%d",a[i]); //输出语句}}

运行结果:

循环左移:若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 2,3,4,5,1

//向右移动 若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 2,3,4,5,1#include int main(){int a[5]={1,2,3,4,5};int i,k;k = a[0]; //因为最左值将会被覆盖,所以先赋值给第三方变量进行保存for (i=1;i<5;i++){a[i-1]=a[i]; //将所有值都向左移动一位,需要注意覆盖方向} a[4] = k; //再将刚才保存的数组尾元素赋值给尾元素从而完成左移for (i=0;i<5;i++){printf("%d",a[i]);}}

运行结果:

4.查找数组元素(折半查找法)

前提:原数组条件元素必须是有序的(升序降序都可以),局限性特别大,但思想可以借鉴

//前提:原数组条件元素必须是有序的(升序降序都可以)//局限性特别大,但思想可以借鉴#include int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};int i=0,j=9,m,k=0,num;printf("请输入您想要查找的数值:\n");scanf("%d",&num);while (i<=j){m=(i+j)/2;if (num < a[m]) j=m-1;//如若小于中间的数值,那末下一次循环最大值则直接为平均数下一位数值,平均数也将会折半if (num > a[m]) i=m+1;//如若大于中间的数值,那末下一次循环最小值则直接为平均数上一位数值if (num == a[m]) //直到相等则直接跳出,并改变k的值作为标记{k=1;break;}}if (k==1) printf("您所查找数值的下角标为:%d\n",m);else printf("Not Found\n");return 0;}

运行结果:

5.利用数组实现十进制转二进制/八进制/十六进制

十进制转二进制:

//十进制转二进制#include int main(){int a[50]; //用于保存余数,长度自定义,够用就行int i=0,n;printf("请输入需要转化为二进制的十进制数:\n");scanf("%d",&n);while (n!=0){a[i] = n%2; //将余数保存在数组内n=n/2;//除去相应进制数i++;//增量加1}for (i-=1;i>=0;i--)//注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改{printf("%d",a[i]);}}

运行结果:

十进制转八进制:

//十进制转八进制#include int main(){int a[50]; //用于保存余数,长度自定义,够用就行int i=0,n;printf("请输入需要转化为八进制的十进制数:\n");scanf("%d",&n);while (n!=0){a[i] = n%8; //将余数保存在数组内n=n/8;//除去相应进制数i++;//增量加1}for (i-=1;i>=0;i--)//注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改{printf("%d",a[i]);}}

运行结果:

十进制转十六进制:

//十进制转十六进制#include int main(){int a[50]; //用于保存余数,长度自定义,够用就行int i=0,n;printf("请输入需要转化为十六进制的十进制数:\n");scanf("%d",&n);while (n!=0){a[i] = n%16; //将余数保存在数组内n=n/16;//除去相应进制数i++; //增量加1}for (i-=1;i>=0;i--)//注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改{//printf("%d",a[i]); //这样显得人家考官跟傻一样 if (a[i]>=0&&a[i]<=9) printf("%d",a[i]); else printf("%C",a[i]+55);//为了保证输出为16进制格式,需要用ASCII进行输出字符,注意为%c  //傻的居然连printf都忘啦,菜狗}}

运行结果:

6.求斐波那契数列

斐波那契数列:从第三项开始,每一项都等于前两项之和

#include int main(){int a[50];int i,n;printf("请输入斐波那契的终止项数:\n");scanf("%d",&n);for (i=0;i<n;i++)//i从0开始{ if (i==0 || i==1) a[i]=1; //两种可能,就用if else呗else a[i]=a[i-2]+a[i-1];//找规律罢了,定义数组时常量表达式必须是整形常量(表达式也可以),不可以是实型printf("%d\t",a[i]);}return 0;}

运行结果:

7.冒泡排序法(数组实现)

冒泡排序:经典且重要

#include int main(){int a[10]={9,13,6,87,45,67,9,-7,63,76};int i,j,t;for (i=0;i<9;i++) //保证循环次数为数组个数减一,因为这个是数组第一个元素和其他元素的比对次数{for (j=0;j<9-i;j++) //要求和i的范围保持一致,j<9-i是不对已经挑选出来的极值进行比较(利用次数约定){if (a[j] > a[j+1]) //此为升序,想要降序将 > 改为 < 即可{t=a[j]; a[j]=a[j+1]; a[j+1]=t; //利用第三方变量,实现交换值的作用}}}for (i=0;i<10;i++) //需要单独利用for循环进行输出,如果用上面进行输出的话,位数将缺少1{printf("%d\t",a[i]);}}

运行结果:

三、二维数组基本知识

基本格式:

数据类型 数组名[常量表达式][常量表达式];eg.int[3][4];

数组个数:

eg.int a[3][4] 数组个数为3*4=12

注意事项:

  • 二维数组是按行存储
  • 行在前 列在后
  • 引用元素时,行列的下标都从0开始
  • 初始化时可以省略行下标,不可省略列下标
  • 问数组一维大小指的是行,二维大小指的是列
  • 其他注意事项同上面一维数组

四、二维数组经典例题

1.二维数组循环遍历

#include int main(){int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; //可针对每行单独进行赋值int i,j;for (i=0;i<3;i++){for (j=0;j<3;j++){printf("%d\t",a[i][j]);//利用for循环遍历并输出}printf("\n");}}

运行结果:

2.输出数组上/下三角元素

#include int main(){int a[3][3]={1,2,3,4,5,6,7,8,9};int i,j;printf("数组方阵如下:\n");printf("***********************\n"); for (i=0;i<3;i++){for (j=0;j<3;j++){printf("%d\t",a[i][j]);//利用for循环,循环遍历输出}printf("\n");}printf("***********************\n");printf("\n");printf("\n");printf("数组方阵下三角如下:\n");printf("***********************\n");for (i=0;i<3;i++){for (j=0;j<=i;j++)//利用i为约束,内部实现动态次数循环{printf("%d\t",a[i][j]);}printf("\n");}printf("***********************\n");printf("\n");printf("\n");printf("数组方阵上三角如下:\n");printf("***********************\n");for (i=0;i<3;i++){for (j=i;j<3;j++) //内层变量等于外层变量,可规定内部初值 //很巧妙,新思路,学到了{if (i==0) printf("%d\t",a[i][j]);else if (i==1) {printf("\t%d",a[i][j]);}else if (i==2) {printf("\t\t%d",a[i][j]);}}printf("\n");}printf("***********************\n");printf("\n");return 0;}

运行结果:

3.二维数组的转置(行列互换)

//三行两列转为两行三列#include int main(){int a[2][3]={1,2,3,4,5,6},b[3][2];int i,j;for (i=0;i<2;i++){for (j=0;j<3;j++){b[j][i]=a[i][j];//根据找规律而得}}for (i=0;i<3;i++){for (j=0;j<2;j++){printf("%d\t",b[i][j]);//输出循环体}printf("\n");}return 0;}

运行结果:

4.杨辉三角

此代码实现的是阶梯版杨辉三角,适合初学者观看,但编程思想都相同

//此代码实现的是输出杨辉三角前10行#include int main(){int a[10][10];int i,j;for (i=0;i<10;i++){for (j=0;j<=i;j++){if (j==0 || i==j) a[i][j]=1;//无规律则直接赋值else a[i][j] = a[i-1][j]+a[i-1][j-1];//有规律直接找规律赋值printf("%d\t",a[i][j]);}printf("\n");}return 0;}

运行结果:

5.利用数组求平均值(去掉最高和最低分)

方法一:冒泡排序法

//第一种思路,利用冒泡排序先对数组进行排序,然后再求去掉最大最小值的平均数#include int main(){int a[10];int c,i,j,n,t;float sum=0.0;printf("请输入10个数值\n"); for (i=0;i<10;i++){scanf("%d",&a[i]); //利用循环对数组赋值}for (i=0;i<9;i++){for (j=0;j<9-i;j++){if (a[j]>a[j+1]){t=a[j]; a[j]=a[j+1]; a[j+1]=t;//利用冒泡排序对数组排序}}}for (i=1;i<9;i++){sum+=a[i]; //去掉最大最小值循环求和}printf("去掉最高以最低分后的平均数为%0.2f",sum/8.0);return 0;}

第二种:攻擂求最值

//第二种思路,先求出用户输入数据的总和,然后再利用攻擂法求出最大最小值,再求去掉最大最小值的平均数#include int main(){int a[10];int i,max,min;float sum,avg;printf("请输入任意十个数字:\n");for (i=0;i<10;i++){scanf("%d",&a[i]);//利用循环对数组赋值sum += a[i];}max=min=a[0]; //将首元素设为最大值和最小值for (i=0;i<10;i++){if (a[i]>max) max=a[i];//利用攻擂法求出最大值最小值if (a[i]<min) min=a[i];}avg=(sum-max-min)/8.0;printf("平均数为:%0.2f",avg);return 0;}

运行结果:

6.删除数组中指定下标的元素(2种)

/*第一种方法//删除实质是覆盖#include int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};int i,n;printf("请输入想要删除数的下标:\n");scanf("%d",&n);for (i=0;i=n) a[i]=a[i+1];//将用户所输入下标所在的数值用后一个数值进行覆盖}for (i=0;i<9;i++){printf("%3d",a[i]); //输出时不输出最后一个数值,以达到删除的目的}}*///第二种办法#include int main(){int a[5];int i,n;printf("请输入5个数值数值:\n");for (i=0;i<5;i++){scanf("%d",&a[i]);}printf("请输入想要删除数的下标:\n");scanf("%d",&n);for (i=n;i<4;i++)//和上述思想一样,只是表达方式不同{a[i]=a[i+1];}for (i=0;i<4;i++){printf("%3d",a[i]);}}

运行结果:

7.键盘获取数值 输出个位是奇数,十位数是偶数的所有数

//键盘输入10个数,输出个位数是奇数或者十位数是偶数的所有数#include int main(){int a[10];int i,j;printf("请输入10个正整数:\n");for (i=0;i<10;i++){scanf("%d",&a[i]);if (a[i]%10%2==1 || a[i]/10%10%2==0) printf("%d\t",a[i]); //遍历时利用约束条件进行输出}return 0;}

运行结果:

8.键盘获取数值 按照个位数一定顺序排序

#include int main(){int a[10];int i,j,t;printf("请输入十个两位正整数:\n");for (i=0;i<10;i++){scanf("%d",&a[i]);}for (i=0;i<9;i++){for (j=0;j<9-i;j++){if (a[j]%10>a[j+1]%10)//利用冒泡排序,并改变if条件即可实现{t=a[j]; a[j]=a[j+1]; a[j+1]=t;//若不熟悉多去看冒泡排序}}}for (i=0;i<10;i++){printf("%d\t",a[i]);}return 0;}

运行结果:

9.计算6位同学五门课程每人平均分

#include int main(){float a[6][5];int i,j;float sum;for (i=0;i<6;i++){sum=0.0;//保证在外循环内,保证每次刷新用于累加成绩printf("请输入第%d位学生的五门成绩:\n",i+1);for (j=0;j<5;j++){scanf("%f",&a[i][j]);//定义二维数组循环输入并计算平均值输出sum+=a[i][j];}printf("该学生的平均数为:%0.2f\n",sum/5.0); //结果保留俩位小数//除5.0不要忘记}return 0;}

运行结果: