东北大学历年C语言期末试题解析(附源码)

有时间就更新,如果线代,高数感觉良好的话。

前言

最近有时间就会看看往年的C试题,博客就当做自己的复习笔记了,也希望可以帮助部分同学复习C语言,真的不难,扎实学。都是自己敲的代码,思想可能不是最优的,只是提供一种思路。

2017年C语言期末试题(oj)

第一题(签到)

1、根据下面的函数关系,对输入的x值,计算出相应的y值并输出自结果。
(1)当x小于0时,y等于1+sin(x)。
(2)当x大于等于0且x小于1时,y等于x的平方加上 cos(x);
(3)当x大于等于1时,y等于(x-1)的平方根
要求:按格式输出x和y的值,
要求小数点后保留2位。

考了math.h的应用
很简单的if判断输出,签到题

#include<stdio.h>
#include<math.h>
int main()
{
	double x=0, y=0;
	scanf("%lf",&x);
	if (x < 0)
		printf("%.2lf %.2lf", x, 1 + sin(x));
	else if(x>=0&&x<1)
		printf("%.2lf %.2lf", x,pow(x,2)+cos(x));//pow为多少次方函数
	else
        printf("%.2lf %.2lf", x,sqrt(x-1));//sqrt为开方函数
    return 0;  
}

第二题

2、计算分数序列:2/1、-3/2、5/3、-8/5、13/8、-21/13、…的前10项之和并输出。

递归思想,这里我直接用的double,
应该不需要分数输出吧(狗头保命),如果需要,请参考acm:N个数求和

#include<stdio.h>
int fun1(int a);
int fun2(int b);
int main(void)
{
	double sum=0;
	for (int i = 1; i <= 10; i++)
	{
		sum += (double)fun1(i) / fun2(i);
    }
	printf("%lf", sum);

}
int fun1(int a)//递归
{
	if (a == 1)
		return 2;
	if (a == 2)
		return -3;
	return fun1(a - 2) - fun1(a - 1);
}
int fun2(int b)//递归
{
	if (b == 1)
		return  1;
	if (b == 2)
		return  2;
	return fun2(b - 2) + fun2(b - 1);
}

第三题

输出6位数以内的,各位数字之和为16的所有整数,并统计符合条件的正整数的个数。例如:
三位数826,8+2+6=16;六位数123811,1+2+3+8+1+1=16。

主要是求位数的计算,其实求位数的方法很多。有时间再总结

#include <stdio.h>
int main()
{
    long int N;
    int i=0;
	for(N=1;N<=1000000;N++)
	{   long int b=N;
	    int sum=0;
        while(b>0)//这个while就是求各位数之和sum的
    {
		sum+=b%10;//最后一位数
		b/=10;//位数向左移一位,即得到的数为去掉了最后一位
    }
    if(sum==16)//判断是否等于16
    {
        printf("%d\n",N);
        i++;//符合条件的正整数加1
    }
    }
	printf("%d",i);

    return 0;
}

第四题

初始化矩阵a[3][4],计算矩阵中最小元素的值和最大元素的值,以及其所在的行号和列号(行号和列号均从1开始编号)。
要求:输出原始矩阵最小元素的值、最大元素的值以及它们各自所在的行号和列

二维矩阵,两个for赋值,if判断并记录,OK

#include<stdio.h>
int main()
{
	int a[3][4];
	int min=100000, max=0, x, y,n,m;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			scanf_s("%d", &a[i][j]);//赋值二维数组
			if (min > a[i][j])//判断最小
			{
				min = a[i][j];
				x = i;//记录行
				y = j;//记录列
			}
			if (max < a[i][j])//判断最大
			{
				max = a[i][j];
				n = i;//记录行
				m = j;//记录列
			}
		}
	}
	printf("min=%d\t行=%d\t列=%d\nmax=%d\t行=%d\t列=%d", min, x+1, y+1, max, n + 1, m + 1);
 
}

第五题

编写函数int StrCount(char* str1,char* str2)。 str1和str2为两个输入的字符串。函数统计str2在
tr1中出现的次数,返回该数值。
要求:在主函数main中初始化str1和 str2,调用函数StrCount(str1,str2)后输出结果。如输入str1
为"anowlisowatow",str2为"ow",那么调用函数 StrCount后函数返回3。

codeblocks虽然编译不舒服,但是运行数据起来比vs香
用了一个逐个字符比较思想

#include<stdio.h>
#include<string.h>
int StrCount(char* str1, char* str2)
{
	int a = strlen(str1);//得到长度
	int b = strlen(str2);//得到长度
	int sum = 0;
	int i;
	for (int y = 0; y<a; y++)
	{
		i = y;
		for (int j = 0; j < b; j++)
		{
			if (str1[i]==str2[j])//逐个比较
			{
			i++;
			}
			else
				break;//有一个字符不同就break,比如owe与ows,虽然前两个字符相同,后面一个不同,就会break
			if (j =b)//字符都相同则总数加一
				sum++;


	    }

	}
	return sum;

}
int main()
{
	char str1[20];
	char str2[10];
	scanf("%s %s", str1, str2);
	int x = StrCount(str1, str2);
	printf("%d", x);
}

第六题

编写函数 void fun(char *p,char m,char n),将字符串p中所有m代表的字符用n所代表的字符替换。
要求:在主函数中初始化字符数组,并输入字符m和n,输出原字符数组及替换结果。例如:
初始化字符数组str[30]="Wish you to have a happy day”输入字符a=h’,b='t,则替换结果为
“Wist you to tave a tappy day.”。

if找到m,然后输出n,else正常输出就行

#include<stdio.h>
#include<string.h>
void fun(char * p,char m, char n)
{
	int i=strlen(p);
	for (int k = 0; k < i; k++)
	{
		if (p[k] == m)
		{
			printf("%c", n);
		}
		else
			printf("%c", p[k]);
	}
}
int main()
{
	char a[50]="Wist you to have a happy day";
	char b='h', c='t';
	fun(a, b, c);



}
  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超超不写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值