C语言——实验课大作业(十个C语言实验)

第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;

}

 

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值