有时间就更新,如果线代,高数感觉良好的话。
前言
最近有时间就会看看往年的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);
}