文章目录
- 一、一维数组基本知识
- 二、一维数组经典例题讲解
- 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 <stdio.h>
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]; //若大于则该值取代原先最大值,并且将新的最大值的下角标赋值给x
x=i;
}
}
printf("最大值为:%d\n",max);
printf("最大值下角标为:%d\n",x);
}
运行结果:
2.一维数组的逆置
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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<10;i++)
{
if (i>=n) a[i]=a[i+1]; //将用户所输入下标所在的数值用后一个数值进行覆盖
}
for (i=0;i<9;i++)
{
printf("%3d",a[i]); //输出时不输出最后一个数值,以达到删除的目的
}
}
*/
//第二种办法
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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;
}
运行结果:
文章出处登录后可见!
已经登录?立即刷新