C语言编写程序,使用数组解决问题,输入10名同学成绩,并统计大于等于90分人数,输出统计结果
时间: 2024-05-01 13:21:56 浏览: 95
好的,下面是 C 语言的代码实现:
```c
#include <stdio.h>
int main() {
int scores[10];
int count = 0; // 统计大于等于90分的人数
printf("请输入10名同学的成绩:\n");
for (int i = 0; i < 10; i++) {
scanf("%d", &scores[i]);
if (scores[i] >= 90) {
count++;
}
}
printf("大于等于90分的人数为:%d\n", count);
return 0;
}
```
代码中定义了一个长度为 10 的整型数组 `scores`,用于存储输入的 10 名同学的成绩。然后循环 10 次,每次输入一个成绩,并判断是否大于等于 90 分,若是则将计数器 `count` 加一。最后输出大于等于 90 分的人数即可。
相关问题
C语言编写算法计算数组的连续子集中元素的和,将和最大的数组输出
在C语言中,你可以使用动态规划的思想来解决这个问题。一种常见的算法叫做Kadane's Algorithm(康杜马拉算法)。这个算法用于寻找给定数组中的子数组,使其和最大。以下是步骤:
1. 定义两个变量:`max_current` 存储当前连续子数组的最大和,`max_global` 存储整个过程中找到的最大和。
2. 遍历数组:
- 初始化 `max_current` 和 `max_global` 为数组的第一个元素。
- 对于数组中的每个元素 (i),做如下操作:
a. 更新 `current_sum` 为前一个 `max_current` 加上当前元素的值,如果加上当前元素后更大,则更新 `current_sum`。
b. 如果 `current_sum` 大于 `max_global`,则将 `max_global` 设置为 `current_sum`。
3. 当遍历完成后,`max_global` 就包含了整个数组中最大的连续子数组的和。
4. 为了找到这个最大子数组本身,可以在遍历的过程中记录下每个 `max_current` 等于 `max_global` 的位置,然后回溯从这些位置开始,直到当前元素减去 `max_global` 之后不再是正数。
以下是一个简单的C语言函数实现示例:
```c
#include <stdio.h>
void maxSubArray(int arr[], int n) {
int max_current = arr[0], max_global = arr[0];
int start = 0, end = 0;
for (int i = 1; i < n; i++) {
if (arr[i] > max_current + arr[i]) {
max_current = arr[i];
start = i;
} else {
max_current += arr[i];
}
if (max_current == max_global) {
end = i;
}
}
for (int i = start; i <= end; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
maxSubArray(arr, n);
return 0;
}
```
当你运行这个程序,它会输出给定数组中和最大的子数组。
如何使用C语言编写并详细注释的动态规划算法来解决最长单调递增子序列的问题?给出一个具有N个元素的数组作为输入,并解释算法如何处理不连续但保持顺序的子序列,最终输出该子序列的最大长度。
在C语言中,我们可以使用动态规划来解决最长单调递增子序列(Longest Increasing Subsequence, LIS)的问题。下面是详细的步骤和代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 动态规划函数,lis[i] 表示以 arr[i] 结尾的最长单调递增子序列长度
int lis(int arr[], int n) {
// 初始化一个数组,用于存储以每个元素结尾的子序列长度
int dp[n];
// 所有元素的初始LIS长度都是1(自身)
for (int i = 0; i < n; i++) {
dp[i] = 1;
}
// 从左到右遍历数组,对于每个元素,尝试将它添加到以其他元素结尾的最长子序列中
for (int i = 1; i < n; i++) {
// 遍历之前的所有元素
for (int j = 0; j < i; j++) {
// 如果当前元素大于之前的元素并且能增加子序列长度,更新dp值
if (arr[i] > arr[j]) {
dp[i] = max(dp[i], dp[j] + 1); // 使用max函数查找最大值,这里假设已有一个max函数
}
}
}
// 返回数组中的最大值,即最长的单调递增子序列长度
return *max_element(dp, dp+n); // max_element返回数组中最大元素的迭代器
}
// 主函数,测试上述函数
int main() {
int arr[] = {10, 9, 2, 5, 3, 7, 101, 18};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Length of the longest increasing subsequence is %d\n", lis(arr, n));
return 0;
}
```
在这个例子中,我们首先创建了一个`dp`数组,其中`dp[i]`表示以`arr[i]`结尾的最长单调递增子序列。然后,对于每个`arr[i]`,我们都检查是否可以将其添加到以`arr[j]`(j < i)结尾的子序列中,如果可以,就更新`dp[i]`的值。最后,最长的单调递增子序列就是所有`dp`值中的最大值。
阅读全文