统计一门课程各分数段的人数:统计一个班级一门课程各分数段的人数,班级人数自定,成绩为百分制整数。
运行结果如下所示:
定义一个5个元素的数组,统计各分数段人数就行
#include <stdio.h>
int main()
{
int score[10] = {90,85,82,57,69,88,98,62,47,75};
int grade[5] = {0};
int i=0;
printf("输出原始成绩:\n");
for(i=0;i<10;i++)
printf("%4d",score[i]);
printf("\n输出统计结果:\n");
printf("%-10s%-10s%-10s%-10s%-10s\n","0~59","60~69","70~79","80~89","90~100");
for(i=0;i<10;i++)
{
if(score[i] >= 90)
grade[4]++;
else if(score[i]>=80)
grade[3]++;
else if(score[i]>=70)
grade[2]++;
else if(score[i]>=60)
grade[1]++;
else
grade[0]++;
}
for(i=0;i<5;i++)
printf("%2d人%6s",grade[i]," ");
}
将班级人数设置为 30 人,分数段设置为 0-59 分、60-69 分、70-79 分、80-89 分和 90-100 分。
#include <stdio.h>
#define NUM_STUDENTS 30 // 班级人数
#define NUM_SCORE_RANGES 5 // 分数段数量
int main() {
int i, j, score;
int score_ranges[NUM_SCORE_RANGES] = {0, 0, 0, 0, 0}; // 存储每个分数段的人数
// 输入每个学生的成绩,统计在不同分数段的人数
for (i = 0; i < NUM_STUDENTS; i++) {
printf("请输入第 %d 个学生的成绩:", i+1);
scanf("%d", &score);
if (score >= 0 && score < 60) {
score_ranges[0]++;
} else if (score >= 60 && score < 70) {
score_ranges[1]++;
} else if (score >= 70 && score < 80) {
score_ranges[2]++;
} else if (score >= 80 && score < 90) {
score_ranges[3]++;
} else if (score >= 90 && score <= 100) {
score_ranges[4]++;
}
}
// 输出每个分数段的人数
printf("\n成绩分段\t人数\n");
printf("-----------------------\n");
for (j = 0; j < NUM_SCORE_RANGES; j++) {
if (j == 0) {
printf("0-59\t\t%d\n", score_ranges[j]);
} else if (j == 1) {
printf("60-69\t\t%d\n", score_ranges[j]);
} else if (j == 2) {
printf("70-79\t\t%d\n", score_ranges[j]);
} else if (j == 3) {
printf("80-89\t\t%d\n", score_ranges[j]);
} else if (j == 4) {
printf("90-100\t\t%d\n", score_ranges[j]);
}
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:int main()
{
int arr[10] = { 1,1,2,2,3,3,4,4,5,6 };
//以这个数组为例,我们发现 5 6这两个数字是我们所需要的。
//我们发现这次有两个单个的,那我们这个怎么进行往后进行呢??
//我们可不可以将这个数组分为两组,将两个单个的数字分开在两个组里面,
// 当然对这个数组还有啥要求呢??
//成对的数字应该被分到同一组里面,不然无法进行消去。
//就以这个数组为例,可以分为
// {1,1,3,3,5} {2,2,4,4,6}或者
// {1,1,5} {2,2,3,3,4,4,6}都可以
// 只要满足我们的两个条件 1. 两个单个的数字分到两组, 2.成对的数字就放在一组
//那么我们应该怎样将这两个单个的数字分到两个数组呢
//那我们就要想到我们的操作符,哪一个操作符可以将两个不同的数字分开
//没错就是我们的异或
//先将这两个数字异或,找到二进制位上不同的数
// 例如异或之后的结果为 1010 ,我们根据这个结果可以推断出 ,这两个数字(二进制表示下)第二位与第四位不同
// 可以作为将两个数字分开的一个依据。
// 但是成对的数字怎样分到两组呢???数字相同,二进制位也相同。
// 我们需要注意的是,我们只是需要将成对的数字分在两个数组里,至于每个数字里面分多少,我们不太关注,因为最后通过运算消去了,
// 只需要保证成对的数字分在一起。那怎么分呢???什么作为分组的依据呢???随缘分法吗???
// 其实我们可以依据前面 单独的数字的分组依据, 将这个作为依据进行分组。然后这就是大概思路
//
//
//
// 来来,我们整理一下思绪 ,然后上手,
// 1.找到二进制位中的不同的位数
// 2. 按照这个不同的位数,将整个数组分成两个数组。
// 需要注意的是,在2. 这个过程中,那两个 单的数字 已经分到两个边,顺带也将成对的数字分组,虽然不能保证两边数组元素
// 个数相同,但是能保证成对的数字都放在了一边。
//寻找不同位数
int i = 0;
int sum = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
sum ^= arr[i];
}
//上面的话 已经将所有的数字已经异或。
//接下来寻找sum中的 1 的位置 ,找到一个就可以。因为异或的话,1表示两个元素不一样 ,可以作为我们分组的依据。
i = 0;
while (((sum >> i) & 1) != 1)
{
i++;
}
//假如sum为下
// sum = 00000000 00000000 00000000 00101000
// 1 00000000 00000000 00000000 00000001
// 00000000 00000000 00000000 00000000
//两者就进行&运算 ,当运算结果为0 时,证明此时两个数字这个二进制位相同,则将sum右移一位,
// 依次类推
//当 ((sum >> i) & 1) = 1 ,此时sum右移了i位,证明两个数字的第i位数据不同 ,可以将此位作为一个分组的依据。
// 5 101
// 6 110
// 011
int arr1[10] = { 0 }, a1 = 0;//由于我们不知道两个数组每个数组分配多少元素,所以呢,尽可能的创建大的数组
int arr2[10] = { 0 }, a2 = 0;//
int a = 0;
for (a = 0; a < sz; a++)
{
if ((arr[a] >> i) & 1)
{
arr1[a1] = arr[a];
a1++;
}
else
{
arr2[a2] = arr[a];
a2++;
}
}
//通过上面的分类,已将数字分到了两个数组,接下来分别进行异或
i = 0;
int x = 0;
for (i = 0; i < a1; i++)
{
x = x ^ arr1[i];
}
printf("%d\n", x);
i = 0;
x = 0;
for (i = 0; i < a2; i++)
{
x = x ^ arr2[i];
}
printf("%d\n", x);
return 0;
}