17、学生成绩
现有若干个学生(不超过100的数据记录),每个记录包括学号姓名,三科成绩,学号不超过15位,且有字母。成绩为整数,每个学生的姓名不超过10个字母,且是包含字母,读入n条记录,再按要求输出。
- 输入:学生数量N占一行,每个学生的学号、姓名、三科成绩占一行,空格分开。
- 输出:每个学生的学号、姓名、三科成绩占一行,逗号分开。
示例
输入样例
2
a111 zhblue 70 80 90
b111 newsclan 90 85 75
输出样例
a111,zhblue,70 ,80,90
b111,newsclan,90,85,75
说明:2代表2个学生数据,其他输入依次为学号,姓名,成绩1,2,3,在按要求输出
思路
法一:与题不符合是想:利用定义将变量定义出来,利用“逗号”替换“空格思路”,在输出的时候进行替换。 实现的是输入一行后立即输出一行,与题目不符合。 法二:采用结构体来定义变量
具体实现(与题不符)
#include<stdio.h>
int main()
{
char number[15], nume[10];//number代表学号,nume代表姓名
int a, b, c;//a,b,c各代表三个成绩
int num;//num代表有几条学生数据
scanf_s("%d", &num);
while (num--)//
{
scanf_s("%s", number,15);
scanf_s("%s", nume, 10);
scanf_s("%d %d %d", &a, &b, &c);
printf("%s,%s,%d,%d,%d\n", number, nume, a, b, c);
}
return 0;
}
运行结果
复杂度
- 时间复杂度O(1) ---所占用时间仅常数级
- 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间
具体实现(与题相符)
#include<stdio.h>
#define MAX_STUDENT_NUM 100//学生数据量
typedef struct Student {
char number[15], nume[10];//number代表学号,nume代表姓名
int a = 0, b = 0, c = 0;//a,b,c各代表三个成绩
};
int main()
{
struct Student stu[MAX_STUDENT_NUM];
int num;//num代表有几条学生数据
scanf_s("%d", &num);
for (int i = 0; i < num; i++) {
scanf_s("%s %s %d %d %d", &stu[i].number,15,&stu[i].nume,10, &stu[i].a, &stu[i].b, &stu[i].c);
}
for (int j = 0; j < num; j++) {
printf("%s,%s,%d,%d,%d\n", stu[j].number, stu[j].nume, stu[j].a, stu[j].b, stu[j].c);
}
return 0;
}
运行结果
复杂度
- 时间复杂度O(n) ---不考虑输入数据所占用的空间,仅需遍历一遍学生数组,其中n为所输入的学生信息的个数。
- 空间复杂度O(n)--- 使用了一个辅助数组,用来记录所有的学生的信息,其中n为所输入的学生信息的个数。
18、求和
求和s=1!+2!+3!+...+10!(阶乘求和)
思路
法一:采用递归操作,通过展开阶乘,寻找阶乘递归规律,采用一层for循环求阶层,一层for循环求和。
法二:利用所求的阶乘是固定的自增变化,用for循环中循环变量更新的方式,使用一个单层for循环。
具体实现(法一)
//阶层和
#include<stdio.h>
int fun(int a) {
if (a == 1) return 1;
else {
return a * fun(a - 1);//如3!=3*2*1
}
}
int main() {
int sum=0;
for (int i = 1; i <= 10; i++) {
sum += fun(i);//调用求阶乘函数累计和
}
printf("10阶乘和为:%d", sum);
printf("\n");
return 0;
}
运行结果
复杂度
- 时间复杂度O(n^2) ---所占用时间为两个for循环
- 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间
具体实现(法二)
#include<stdio.h>
//阶层和
int main() {
int sum = 0, fact = 1;//sum是总和,fact阶乘结果
for (int i = 1; i <= 10; i++) {// 计算1!+2!+……+10!
fact *= i;//阶乘1*2*3...
sum += fact;//累加结果0+1+2...
}
printf("1!+2!+……+10!=%d", sum);
return 0;
}
复杂度
- 时间复杂度O(1) ---所占用时间仅常数级
- 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间
小结
- 对于多个不同类别数据的存放,可以采用结构体来存储,并通过结构体数组存放多个数据。
- 阶乘运用不熟练