二分查找法:也叫折半查找算法。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
#include <stdio.h>
int main()
{
float score[10]={56.5,62.0,75.0,77.0,81.5,82.0,85.0,88.0,92.0,95.0};
int up = 0, down = 9,mid;
int count = 0;
while(up<=down)
{
mid=(up+down)/2;
printf("up=%d,down=%d,mid=%d\n",up,down,mid);
if(score[mid]==85.0)
{
printf("find the score\n");
count++;
break;
}
else if(score[mid]<85.0)
{
up = mid + 1;
count++;
}
else
{
down = mid - 1;
count++;
}
}
printf("%d\n",count);
return 0;
}
数组的非法操作:对于基本数据类型,相同类型的变量可以进行加减、比较运算,但对于数组,即使是相同类型、相同大小的数组,有些操作也是非法的,具体如下:
用一个已经初始化的数组对另外一个数组赋值;对数组进行整体输入输出;数组与数组不能进行比较;数组与数组不能进行运算。
二维数组
语法格式:
类型说明符 数组名[常量表达式1][常量表达式2]
注意:常量表达式1表示行,常量表达式2表示列。存储时以行为单位安排空间。
例题1:现有3个班级,每班都有10名同学,已知这3个班级某门课程的成绩,求出3个班级中的最高成绩,同时求出每个班级的最高分,及最高的平均分。
#include <stdio.h>
#define CN 3 //班级数
#define SN 10 //各班级学生数
int main(void)
{
int cs[CN+1][SN+1]; //存放CN个班级学生的成绩
double sum[CN+1]={0}, ave[CN+1]; //存放各班学生总分、平均分
for(int i = 1;i <= CN;i++)
{
for(int j = 1;j <= SN;j++)
{
scanf("%d", &cs[i][j]); //输入第i个班级第j学生的成绩是cs[i][j]
sum[i] += cs[i][j]; //将cs[i][j]加到第i个班级的总成绩sum[i]中
}
}
int max[CN+1], maxk[CN+1]; //分别存放各班最高分、最高分学生的序号
for(int i = 1; i <= CN; i++)
{
//假设各班级的第一名学生成绩是每个班级的最高分,求各班级的平均分
max[i] = cs[i][1];
maxk[i] = 1;
ave[i] = sum[i] / SN;
}
for(int i = 1;i <= CN;i++)
{//找出各班级的最高分
for(int j = 2;j <= SN;j++)
{
if(cs[i][j] > max[i])
{
max[i] = cs[i][j];
maxk[i] = j;
}
}
}
//分别存放所有学生的最高分、最高分的班号、平均成绩最高的班号
int cmax, cmaxk, avemaxk;
//求所有同学的最高分及最高分所在的班级序号
//同时求出平均成绩最高的班号
cmax=max[1], cmaxk=1, avemaxk=1;
for(int i = 2;i <= CN;i++)
{
if(max[i] > cmax)
{
cmax = max[i];
cmaxk = i;
}
if(ave[i] > ave[avemaxk])
avemaxk = i;
}
//输出各个班级的班号、平均成绩、最高分同学的序号及分数
printf("班级的班号\t平均成绩\t最高分\t最高分序号\n");
for(int i = 1; i <= CN; i++)
printf(" %4d\t\t%.2f\t\t%d\t%4d\n", i, ave[i], max[i], maxk[i]);
//输出几个班级中的最高分,及其在班级的序号
printf("最高分为%d班 序号是%d 分数为%d \n", cmaxk, maxk[cmaxk], cmax);
//输出平均成绩最高的班级及其平均成绩
printf("平均成绩最高的班号是:%d 平均成绩为:%.2f\n", avemaxk, ave[avemaxk]);
return 0;
}