第1关:实验8 数学函数
任务描述
本关任务:编写一个能计算数的正弦、余弦、平方根的小程序。
相关知识
为了完成本关任务,你需要掌握:调用C语言自带的函数库的方法。
导入函数相关库
#include <math.h>
导入相关库后,可以直接调用相关的函数进行运算,比如计算数a的平方根,可以通过调用sqrt()。
编程要求
根据提示,在右侧编辑器补充代码,使程序正常运行。
测试说明
平台会对你编写的代码进行测试:
测试输入:100
预期输出:
sin(a)=-0.506366
cos(a)=0.862319
sqrt(a)=10.000000
开始你的任务吧,祝你成功!
#include <stdio.h>
#include <math.h>
int main(){
float a;
scanf("%f",&a);
/********** Begin *********/
// 请在此处添加你的代码
printf("sin(a)=%f\n",sin(a));
printf("cos(a)=%f\n",cos(a));
printf("sqrt(a)=%f\n",sqrt(a));
/********** End **********/
return 0;
}
第2关:实验9 判断日期是否合法
任务描述
本关任务:编写一个能判断输入的日期是否合法的小程序。如果合法,则按照年月日的输出此日期,比如1998年6月26日。;否则提示用户:您输入的日期有误,请重新输入!
相关知识
条件语句可以给定一个判断条件,并在程序执行过程中判断该条件是否成立,根据判断结果执行不同的操作,从而改变代码的执行顺序,实现更多的功能。
if (<条件>)
{
<条件成立执行的代码>
}
else
{
<条件不成立执行的代码>
}
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:1994,02,20
预期输出:1994年2月20日。
#include <stdio.h>
int main(){
int y, m, d;
int tag;
scanf("%d,%d,%d", &y, &m, &d);
/********** Begin *********/
// 请在此处添加你的代码
if (y >= 1) {
// 判断月份
if (m >= 1 && m <= 12) {
// 判断日期
int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 如果是闰年,二月有29天
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
day[1] = 29;
}
// 判断输入的日是否在月份允许的范围内
if (d >= 1 && d <= day[m - 1]) {
tag = 1; // 日期合法,标记为1
}
}
}
/********** End **********/
if ( tag == 1 )
printf("%d年%d月%d日。", y, m, d );
else
printf("您输入的日期有误,请重新输入!");
return 0;
}
第3关:实验10 分段函数
任务描述
本关任务:编写一个能计算分段函数的小程序。
输入x,求分段函数y的值。
−10<=x<10 y=sin(x+3.0)
10<=x<20 y=cos(x+8.0)
20<=x<100 y=ln(x∗4)
如果x不在定义域内,输出No define!,否则输出y,并保留5位小数。
相关知识
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查
switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 */
case constant-expression :
statement(s);
break; /* 可选的 */
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}
编程要求
根据提示,在右侧编辑器补充代码,计算并输出数组的平均值和最大值。
测试说明
平台会对你编写的代码进行测试:
测试输入:10
预期输出:0.66032
#include <stdio.h>
#include <math.h>
int main()
{
float x, y;
int tag;
scanf( "%f", &x );
/********** Begin *********/
// 请在此处添加你的代码
if (x < -10 || x >= 100) {
tag = -2; // x不在定义域内
} else if (x < 10) {
tag = -1; // -10 <= x < 10
} else if (x < 20) {
tag = 0; // 10 <= x < 20
} else {
tag = 1; // 20 <= x < 100
}
switch (tag) {
case -1:
y = sin(x + 3.0);
break;
case 0:
y = cos(x + 8.0);
break;
case 1:
y = log(x * 4);
break;
default:
printf("No define!\n");
return 0;
}
printf("%.5f\n", y);
/********** End **********/
return 0;
}
第4关:实验12 星号塔
任务描述
本关任务:编写一个能输出星号塔的小程序。
如果输入是4,则输出的星号塔为:
相关知识
为了完成本关任务,你需要掌握:for循环来进行控制输出。
for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
其中1处位置,是一个赋值语句,在循环开始前执行一次,之后再不执行。
其中2处位置为判断语句,每次开始循环时(包括第一次)都会先经过这个判断语句的判断如果此处为真,则进入循环,执行循环内语句或者代码块。如果此处为假,则不进入循环,执行之后的代码。
其中3处位置为一个运算语句,每执行完一次循环,就会执行一次此处代码。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:4
预期输出:
#include <stdio.h>
int main()
{
int i, j, n,k;
scanf("%d", &n );
for ( i = 1; i <= n; i++ )
{
/********** Begin *********/
// 请在此处添加你的代码
for (j = i; j < n; j++) {
printf(" ");
}
// 打印星号
for (k = 1; k <= (2 * i - 1); k++) {
printf("*");
}
// 换行
printf("\n");
/********** End **********/
}
return 0;
}
第5关:实验16 求矩阵对角线元素之和
任务描述
本关任务:编写一个能计算4∗4矩阵2条对角线元素之和的小程序。
相关知识
为了完成本关任务,你需要掌握:通过控制for循环来对数组中的对角线上的元素进行相加。
#####for语句
基本语法:基于for实现循环的基本语法如下:
for(1.赋值语句或者省略;2.判断语句或者省略;3.执行语句或者省略){
需循环的语句或者代码块
}
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:1 2 3 4 1 2 3 4 4 3 2 1 1 2 3 4
预期输出:
sum=20.000000
#include <stdio.h>
int main()
{
int i, j;
float a[4][4], sum = 0;
/********** Begin *********/
// 请在此处添加你的代码
for(i=0;i<4;i++){
for (j = 0; j < 4; j++) {
scanf("%f",&a[i][j]);
}}
// 计算主对角线和副对角线元素之和
for (i = 0; i < 4; i++) {
sum += a[i][i]; // 主对角线元素
sum += a[i][3 - i]; // 副对角线元素
}
/********** End **********/
printf("sum=%f",sum);
return 0;
}
第6关:实验17 排序与查找
任务描述
本关任务:编写一个采用折半查找法查找数组中的数的小程序。
要求输入一个数组,数组的大小为5,首先将其按照从小到大的顺序排序。
然后输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出无此数。
相关知识
为了完成本关任务,你需要掌握:1.冒泡排序算法,2.折半查找算法。
冒泡排序算法
对拥有n个元素的数组R[n]进行n-1轮比较。第一轮,逐个比较 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-1], R[N]),最大的元素被移动到R[n]上。第二轮,逐个比较 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-2], R[N-1]),次大的元素被移动到R[n-1]上。。。。。。。以此类推,直到整个数组从小到大排序。
折半查找算法
首先选取表中间位置的记录,将其关键字与给定关键字 key 进行比较,若相等,则査找成功;若 key 值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找:若 key 值比该关键宇值小,则要找的元素一定在左子表中,继续对左子表进行折半査找。如此递推,直到査找成功或査找失败(或査找范围为 0)
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:1 2 5 4 3 2
预期输出:该数是数组中第2个元素的值
#include <stdio.h>
int main() {
int i, j, t, a[5], low = 0, mid, high = 4, flag = 0, search_num;
// 输入数组元素
for (i = 0; i < 5; i++) {
scanf("%d", &a[i]);
}
// 冒泡排序算法,对数组进行排序
for (i = 0; i < 4; i++) {
for (j = 0; j < 4 - i; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
// 输入要查找的数
scanf("%d", &search_num);
// 折半查找算法
while (low <= high) {
mid = (low + high) / 2;
if (search_num == a[mid]) {
flag = 1; // 找到了
break;
} else if (search_num < a[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 输出查找结果
if (flag) {
printf("该数是数组中第%d个元素的值",mid + 1);
} else {
printf("无此数");
}
return 0;
}
第7关:例7-15 密码检测
任务描述
本关任务:编写一个能实现简单密码检测的小程序。用户通过输入密码字符串,然后和预先设定的密码进行匹配,如果密码正确就输出Yes,否则输出No.
####相关知识
为了完成本关任务,你需要掌握:strcmp()函数。
strcmp()函数
int strcmp(const char *str1, const char *str2)
该函数返回值如下:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:password
预期输出:Yes
#include <stdio.h>
#include <string.h>
int main()
{
char pass[50];
char pwd[50] = "password";
scanf("%s",pass);
/********** Begin *********/
// 请在此处添加你的代码
if (strcmp(pass, pwd) == 0) {
printf("Yes\n");
} else {
printf("No\n");
}
/********** End **********/
return 0;
}
第8关:实验19 单词统计
任务描述
本关任务:编写一个能统计输入2行英文中包括多少个单词的小程序。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:
I love study
I do not believe
预期输出:
总共有7个单词
#include <stdio.h>
#include <string.h>
int main() {
char line[256];
int word_count = 0;
int in_word = 0;
// 读取两行文本
for (int i = 0; i < 2; ++i) {
fgets(line, sizeof(line), stdin); // 使用fgets读取一行文本
int length = strlen(line);
// 遍历字符串,统计单词
for (int j = 0; j < length; ++j) {
if (line[j] != ' ' && line[j] != '\n' && line[j] != '\t') {
if (!in_word) {
in_word = 1; // 进入单词
word_count++; // 单词计数增加
}
} else {
in_word = 0; // 离开单词
}
}
}
printf("总共有%d个单词", word_count);
return 0;
}
第9关:实验21 求三角形的面积
任务描述
本关任务:编写一个程序,能根据输入的三角形三条边长,判断能否组成三角形。如果能组成三角形,判断是锐角、钝角还是直角三角形,并运用海伦公式计算出三角形面积。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:3 4 5
预期输出:
直角三角形
三角形的面积是:6.000000
#include <stdio.h>
#include <math.h>
int IsValid( double a, double b, double c );
void JudgeShape( double a, double b, double c );
double Area( double a, double b, double c );
int main()
{
double a, b, c, s, area;
scanf("%lf%lf%lf", &a, &b, &c);
if( IsValid( a, b, c ) )
{
JudgeShape ( a, b, c);
area = Area( a, b, c);
printf("三角形的面积是:%f", area );
}
else
{
printf("输入的三条边无法组成三角形");
}
return 0;
}
int IsValid( double a, double b, double c)
{
if( a + b <= c )
return 0;
if( a + c <= b )
return 0;
if( b + c <= a )
return 0;
return 1;
}
void JudgeShape( double a, double b, double c )
{
/********** Begin *********/
// 请在此处添加你的代码
double a2 = a * a, b2 = b * b, c2 = c * c;
// 判断三角形类型
if (a2 + b2 == c2 || a2 + c2 == b2 || b2 + c2 == a2) {
printf("直角三角形\n");
} else if (a2 + b2 < c2 || a2 + c2 < b2 || b2 + c2 < a2) {
printf("钝角三角形\n");
} else {
printf("锐角三角形\n");
}
/********** End **********/
}
double Area( double a, double b, double c )
{
/********** Begin *********/
// 请在此处添加你的代码
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
/********** End **********/
}
第10关:实验23 约瑟夫环问题
任务描述
本关任务:编写一个能解决约瑟夫环问题的小程序,求出最后一个出列的人的原始编号。
相关知识
约瑟夫环问题的具体描述是:设有编号为1,2,3,..,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人都出列。当任意给定n和m后,设计算法求n个人出圈的次序。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:4 2
预期输出:最后一个出列的是1
#include <stdio.h>
#include <string.h>
#define N 100
int main()
{
int m, n, i, j, k = 0;
scanf("%d",&n);
scanf("%d",&m);
int a[N] = {0};
for(i = 0; i < n; i++)
a[i] = i+1;
while (n > 1)
{
/********** Begin *********/
// 请在此处添加你的代码
k = (k + m - 1) % n; // 计算每次要删除的元素的索引
for (j = k; j < n - 1; j++) // 将删除的元素后面的元素前移
a[j] = a[j + 1];
n--; // 元素总数减一
/********** End **********/
}
printf("最后一个出列的是%d", a[0]);
return 0;
}