在不知道数组类型的情况下,如何确定数组元素的个数?
一维数组:sizeof(a) /sizeof(a[0])
二维数组:sizeof(a[0])/sizeof(a[0][0])
当然此次我做的题没体现出来我在末尾写一段演示了一下
因为二维数组也可以看成是一个一维数组
25⬆2.13
1. 一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则提示。
/*1. 一个二维数组赋初值,用户输入一个数,在该二维数组中查找.找到则返回行列位置,没找到则提示.*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define R 3
#define C 4
int main(void)
{
int a[R][C] = {0};
int i = 0,j = 0;
srand(time(NULL)); //生成种子数
printf("生成随机数组的数为:\n"); //生成随机数组
for(i = 0;i < R;i++)
{
for(j = 0;j < C;j++)
{
a[i][j] = rand() % 100 + 1; //在数组中生成1-100的随机数
printf("%-5d",a[i][j]); //5表示宽度 -左对齐
}
printf("\n");
}
int num;
printf("请输入一个数:");
scanf("%d",&num);
int found = 0; //定义一个变量找数字
for(i = 0;i < R;i++)
{
for(j = 0;j < C;j++) //遍历数组的数字
{
if(num == a[i][j])
{
found = 1; //表示找该数
printf("数字%d的位置在[%d][%d]\n",num,i,j);
//printf("数字%d",a[i][j])这里数字也可以这么表示
}
}
}
if(found == 0) //未找到该数,变量没变化
{
printf("在该数组中未找到该数。\n");
}
return 0;
}
2. 二维整型数组,求所有元素平均值,求每行最大值。
/*2. 二维整型数组,求所有元素平均值,求每行最大值。*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define R 3 //行
#define C 4 //列
int main(void)
{
int a[R][C] = {0};
srand(time(NULL)); //使用时间做随机数种子
int i = 0,j = 0;
printf("===数组为===\n"); //随机生成数组的元素
for(i = 0;i < R;i++) //遍历行
{
for(j = 0;j < C;j++) //遍历列
{
a[i][j] = rand() % 100 +1; //随机生成1-100的数,并赋值给数组
printf("%-5d",a[i][j]);
}
printf("\n");
}
int sum = 0; //定义变量求和
for(i = 0;i < R;i++)
{
int max = a[i][0]; //假设每一行最大值是第一个元素
for(j = 0;j < C;j++) //遍历列
{
sum += a[i][j]; //累加元素值
if(max < a[i][j])
{
max = a[i][j]; //更新最大值
}
}
printf("第%d行最大值为:%d\n",i + 1,max); //打印每行最大值,正好可以拿i+1表示
}
float ave = (float)sum / (R * C); //计算平均值,确保数据准确,强制转换float型
printf("平均值为:%.2f\n",ave);
return 0;
}
3. 在行列相等数组计算主对角线元素的和
/*3. 在行列相等数组计算主对角线元素的和*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define R 3
#define C 3
int main(void)
{
int arr[R][C] = {0};
srand(time(NULL)); //种子数
printf("随机生成数组为:\n");
int i,j;
for(i = 0;i < R;i++)
{
for(j = 0;j < C;j++)
{
arr[i][j] = rand() % 100 + 1; //生成随机数赋值给数组
printf("%-3d",arr[i][j]);
}
printf("\n");
}
int sum = 0;
for(i = 0;i < R;i++)
{
sum += arr[i][i]; //循环求行列阵的对角线的和a[1][1]...
}
printf("主对角线元素的和为: %-5d\n",sum); //左对齐5个宽度
return 0;
}
4. 计算一个矩阵下三角元素的和
/*4. 计算一个矩阵下三角元素的和*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define R 3
#define C 3
int main(void)
{
int arr[R][C] = {0};
srand(time(NULL)); //种子数
int i,j;
printf("随机生成数组:\n");
for(i = 0;i < R;i++)
{
for(j = 0;j < C;j++)
{
arr[i][j] = rand() % 10 + 1; //随机生成数字赋值给数组
printf("%3d",arr[i][j]);
}
printf("\n");
}
int sum; //定义变量求和
for(i = 0;i < R;i++)
{
for(j = 0;j < C;j++)
{
if(i >= j)
{
sum += arr[i][j]; //下三角特点行>=列,求和
}
}
}
printf("矩阵中下三角的和为: %d\n",sum);
return 0;
}
5. 电影院店庆为了答谢影迷的支持,在每一排的每一列座位上放置了一个礼物,但在满足下面要求的位置上放置了一个大礼包
(行和列的平方和为开店日期 512(5月12日));
请设计程序找出大礼包,并输出它的内容,(假定电影院有20排,每排25个座位)
这道题我没赋值给数组,懒得赋值了,和上面几道题赋初值一样的,图方便就没赋随机值,数组里的元素全部被初始化为0了
/*5. 电影院店庆为了答谢影迷的支持,在每一排的每一列座位上放置了一个礼物,但在满足下面要求的位置上放置了一个大礼包
(行和列的平方和为开店日期 512(5月12日));请设计程序找出大礼包,并输出它的内容,(假定电影院有20排,每排25个座位)*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define R 20
#define C 25
int main(void)
{
int arr[R][C] = {0};
int i,j;
for(i = 0;i < R;i++) //从第一个元素遍历,嵌套循环,遍历数组
{
for(j = 0;j < C;j++)
{
if((i + 1) * (i + 1) + (j + 1) * (j + 1) == 512) //i+1此时表示排数1-20,j+1表示列数1-25,若是512便找到该位置
{
printf("该大礼包在第%d行,第%d列,内容为:%d\n",i + 1,j + 1,arr[i][j]); //打印出来位置,内容是0因为初始化数组存储数据为0
}
}
}
return 0;
}
在不知道数组类型的情况下,如何确定数组元素的个数?
1.一维数组sizeof(a) /sizeof(a[0])直接可以得到数组中元素个数的,很好用的公式,我没在题目上写是因为我们在定义的时候就知道行列数了,没必要再用公式了。
2.二维数组中的嵌套循环
sizeof(a) /sizeof(a[0])可以理解为求数组的行数,它可以定义一个变量代替行数上的3
sizeof(a[0])/sizeof(a[0][0])可以理解为求数组的列数,它可以定义变量代替列数上的3
/*一维数组:sizeof(a) /sizeof(a[0]) 二维数组:sizeof(a[0])/sizeof(a[0][0])用法演示*/
#include <stdio.h>
int main(void)
{
int a[3][3] = {
{1,6,8},
{5,2,9},
{3,1,4}
};
int i,j;
for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)
{
for(j = 0;j < sizeof a[0]/sizeof(a[0][0]);j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}