C语言作业第一期(3.22)
第1节 C语言循环结构程序设计基础
1.1 数列之和
任务描述
本关任务:编写程序,计算 1 2 + 2 2 + 3 2 + . . . . . . + n 2 1^2+2^2+3^2+... ...+n^2 12+22+32+......+n2
其中,
n
不超过100
,从键盘读入。代码框架
#include <stdio.h> #include <stdlib.h> int main() { int i = 1, n; int sum = 0; printf("Input n:"); scanf("%d", &n); /***********Begin**********/ /***********End************/ printf("\nsum=%d\n", sum); return 0; }
测试说明
平台会对你编写的代码进行测试:
测试输入:100
预期输出:Input n: sum = 338350
测试输入:
3
预期输出:Input n: sum = 14
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1, n;
int sum = 0;
printf("Input n:");
scanf("%d", &n);
/***********Begin**********/
for (i = 1; i <= n; i++)
{
sum = sum + i * i;
}
/***********End************/
printf("\nsum=%d\n", sum);
return 0;
}
1.2 最大最小数
任务描述
本关任务:从键盘输入一系列正数,当输入
0
或者负数时输出这一系列数种的最小非负数和最大非负数。注意,输入的数不要求一定是整数。要求用while结构实现。
代码框架
#include <stdio.h> #include <limits.h> int main() { float max, min, x; printf("请输入一组非负数,以0或负数结束:\n"); /********************Begin******************/ /*******************End********************/ printf("最小值:%.2f\n", min); printf("最大值:%.2f\n", max); return 0; }
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 91 51 2 32 0
预期输出:请输入一组非负数,以0或负数结束: 最小值:2.00 最大值:91.00
测试输入:
5.2 0.1 151.5 12 22 -1
预期输出:请输入一组非负数,以0或负数结束: 最小值:0.10 最大值:151.50
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
#include <limits.h>
int main()
{
float max, min, x;
printf("请输入一组非负数,以0或负数结束:\n");
/********************Begin******************/
max = 0;
min = 999999;
while (x > 0)
{
scanf("%f", &x);
if (x > 0)
{
if (max < x)
max = x;
if (min > x)
min = x;
}
}
/*******************End********************/
printf("最小值:%.2f\n", min);
printf("最大值:%.2f\n", max);
return 0;
}
1.3 偶数个数及偶数之和
任务描述
本关任务:输入若干个正整数,当输入
0
或者负数时结束,要求计算这若干个正整数中偶数的个数以及所有偶数的和。
要求用while结构实现。代码框架
#include <stdio.h> #include <stdlib.h> int main() { int sum, count, x; printf("请输入一组正整数,以0或者负数结束:\n"); /********************Begin******************/ /***************End******************/ return 0; }
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 91 51 2 32 5 1 151 12 22 -1
预期输出:请输入一组正整数,以0或者负数结束: sum = 72, count = 5
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int sum, count, x;
printf("请输入一组正整数,以0或者负数结束:\n");
/********************Begin******************/
sum = 0;
count = 0;
while (x > 0)
{
scanf("%d", &x);
if (x > 0)
{
if (x % 2 == 0)
{
count++;
sum = sum + x;
}
}
}
printf("sum = %d,count = %d", sum, count);
/***************End******************/
return 0;
}
1.4 计算sinx(有优化)
任务描述
本关任务:要求按下列公式计算 s i n x sinx sinx的值,直到最后一项大于 1 e − 6 1e−6 1e−6为止:
y = x − x 3 3 ! + x 5 5 ! − x 7 7 ! + . . . y=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+... y=x−3!x3+5!x5−7!x7+...
即最后一项的绝对值小于 1 e − 6 1e−6 1e−6为止。* x x x*从键盘进行输入。
要求使用do…while结构实现。代码框架
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { float x; float sum = 0, term; int n = 0; printf("请输入一个x值(弧度值):"); scanf("%f", &x); /********************Begin********************/ /*******************End*********************/ printf("\nsin(%.2f) = %.2f\n", x, sum); return 0; }
测试说明
平台会对你编写的代码进行测试:
测试输入:
0
预期输出:
请输入一个x值(弧度值): sin(0.00)=0.000000
测试输入:
1.57
预期输出:
请输入一个x值(弧度值): sin(1.57)=1.000000
注:加粗的数字为用户需要输入的数字。
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float x;
float sum = 0, term;
int n = 0;
printf("请输入一个x值(弧度值):");
scanf("%f", &x);
/********************Begin********************/
n = 1;
int i = 1, flag = 1;
float jiecheng = 1.00;
do
{
for (i = 1; i <= 2 * n - 1; i++)
{
jiecheng = jiecheng * i * 1.00;
}
term = pow(x, 2 * n - 1) / jiecheng * 1.00 * flag;
sum = sum + term;
flag = -flag;
jiecheng = 1.00;
n++;
} while (fabs(term) >= 1e-6);
/*******************End*********************/
printf("\nsin(%.2f) = %.2f\n", x, sum);
return 0;
}
//以下是对sinx求法的优化代码,减少了计算量和阶乘次数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float x;
float sum = 0, term;
int n = 1;
printf("请输入一个x值(弧度值):");
scanf("%f", &x);
/********************Begin********************/
sum = x, term = x;
do
{
term = -term * x * x / ((n + 1) * (n + 2));
sum += term;
n = n + 2;
} while (fabs(term) >= 1e-6);
/*******************End*********************/
printf("\nsin(%.2f) = %.2f\n", x, sum);
return 0;
}
第2节 C语言循环语句专项练习题
2.1 组合排列计算题
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End
区域内进行代码补充,具体任务如下:学生一起买小吃,共花钱
50
元,其中每个大学生花3
元,每个中学生花2
元,每个小学生花1
元。现输入学生总人数30
,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0
的解)?例如:
输入:30
,即求总人数为30
时各种不同的解,输出如下,sum
表示总的解数。大学生1,中学生18,小学生11 大学生2,中学生16,小学生12 大学生3,中学生14,小学生13 大学生4,中学生12,小学生14 大学生5,中学生10,小学生15 大学生6,中学生8,小学生16 大学生7,中学生6,小学生17 大学生8,中学生4,小学生18 大学生9,中学生2,小学生19 sum=9
代码框架
#include <stdio.h> int main() { //获取参数方式 scanf // int x =0; // int y = 0; // scanf("%d", &x); //结果输出使用prinf // printf("%d",x); // 请在此添加你的代码 /********** Begin *********/ /********** End **********/ }
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
验货啦,验货啦,开始你的任务吧!
代码
#include <stdio.h>
int main()
{
//获取参数方式 scanf
// int x =0;
// int y = 0;
// scanf("%d", &x);
//结果输出使用prinf
// printf("%d",x);
// 请在此添加你的代码
/********** Begin *********/
int x = 0, y = 0, z = 0, sum = 0, people = 0;
scanf("%d", &people);
for (x = 1; x < people; x++)
{
for (y = 1; y < people; y++)
{
for (z = 1; z < people; z++)
{
if (3 * x + 2 * y + z == 50 && x + y + z == people)
{
sum++;
printf("大学生%d,中学生%d,小学生%d\n", x, y, z);
}
}
}
}
printf("sum=%d", sum);
/********** End **********/
}
2.2 求立方和
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End
区域内进行代码补充,具体任务如下:求一个四位数的各位数字的立方和。
函数fun
返回求出的和值。例如:
1234
的各位数字的立方和为:1^3+2^3+3^3+4^3=100
fun
函数应当返回100
。效果如下:
输入:1234
。 输出:k=100
。代码框架
#include <stdio.h> int fun(int n) { // 请在此添加你的代码 /********** Begin **********/ /********** End **********/ } int main() { int n, k; scanf("%4d", &n); k = fun(n); printf("k=%d\n", k); return 0; }
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
验货啦,验货啦,开始你的任务吧!
代码
#include <stdio.h>
int fun(int n)
{
// 请在此添加你的代码
/********** Begin **********/
int q = 0, b = 0, s = 0, g = 0;
g = n % 10;
s = n / 10 % 10;
b = n / 100 % 10;
q = n / 1000;
return (g * g * g + s * s * s + b * b * b + q * q * q);
/********** End **********/
}
int main()
{
int n, k;
scanf("%4d", &n);
k = fun(n);
printf("k=%d\n", k);
return 0;
}
2.3 求素数之和
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End
区域内进行代码补充,具体任务如下:求给定正整数
m
以内的素数之和。
函数fun
返回求出的该值。例如:
当m
=20
时,20
以内的素数有2,3,5,7,11,13,17,19
,则函数返回值为77
。效果如下:
输入:20
。 输出:y=77
。代码框架
#include <stdio.h> #include <math.h> // 请在此添加你的代码 /********** Begin **********/ int fun(int m) { } /********** End **********/ int main() { int x, y; scanf("%d", &x); y = fun(x); printf("y=%d\n", y); return 0; }
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
验货啦,验货啦,开始你的任务吧!
代码
#include <stdio.h>
#include <math.h>
// 请在此添加你的代码
/********** Begin **********/
int prime(int x)
{
int i = 2, response = 1;
for (i = 2; i <= sqrt(x); i++)
{
if (x % i == 0)
{
response = 0;
break;
}
else
continue;
}
return response;
}
int fun(int m)
{
if (m == 1)
return 0;
int i, sum = 0;
for (i = 2; i < m; i++)
{
if (prime(i) == 1)
sum = sum + i;
}
return sum;
}
/********** End **********/
int main()
{
int x, y;
scanf("%d", &x);
y = fun(x);
printf("y=%d\n", y);
return 0;
}
第3节 循环结构程序设计1
本关涉及的代码文件的代码框架如下:
#include <stdio.h> // 定义main函数 int main(void) { // 请在此添加代码 /********** Begin *********/ /********** End **********/ return 0; }
3.1 小球自由落体运动
任务描述
一球从
M
米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N
次落地时反弹多高?共经过多少米? 结果保留两位小数。编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,并按照要求完成本关任务。输入
从键盘输入M
和N
的值。输出
它在第N
次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行。测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
1000 5
样例输出:
31.25 2875.00
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
float m = 0, height = 0, sum = 0;
int n = 0, i = 0;
scanf("%f %d", &m, &n);
height = m;
for (i = 1; i <= n; i++)
{
if (n == 1)
sum = height;
else
{
sum = sum + height * 2;
}
height = height * 0.5;
}
sum = sum - m;
printf("%.2f %.2f", height, sum);
/*********End**********/
return 0;
}
3.2 求解出n以内所有能被5整除的正整数的乘积
任务描述
本关任务:求解出
n
以内(包含n
)所有能被5
整除的正整数数的乘积s
。编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,求解出n
以内(包含n
)所有能被5
整除的正整数数的乘积s
输入
输入包含多个样例,每个样例一个正整数n
,占一行。读取到文件结尾。输入的n
不超过100
。输入格式
scanf("%d", &n)
输出
对于每个样例n
,输出n
以内(包含n
)所有能被5
整除的正整数的乘积。
输出格式printf("%d\n", s);
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
19
样例输出:
750
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int n = 0, s = 1, i = 5;
scanf("%d", &n);
for (i = 5; i <= n; i += 5)
{
s = s * i;
}
printf("%d\n", s);
/*********End**********/
return 0;
}
3.3 最大公约数和最小公倍数(有优化)
任务描述
本关任务:输入两个正整数
m
和n
,求其最大公约数和最小公倍数。编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,输入两个正整数m
和n
,求其最大公约数和最小公倍数。输入
从键盘上任意输入两个数。输出
分两行输出,第一行输出:最大公约数是多少;第二行输出最小公倍数是多少。测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
2 3
样例输出:
最大公约数是:1
最小公倍数是:6
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
/*********Begin*********/
int zdgy(int m, int n)
{
int i;
if (m <= n)
i = m;
else
i = n;
for (; i >= 1; i--)
{
if (m % i == 0 && n % i == 0)
return i;
}
return 1;
}
int zxgb(int m, int n)
{
int i;
if (m >= n)
i = m;
else
i = n;
for (; i <= m * n; i++)
{
if (i % m == 0 & i % n == 0)
return i;
}
}
int main()
{
int m = 0, n = 0, gy = 1, gb = 1;
scanf("%d %d", &m, &n);
gy = zdgy(m, n);
gb = zxgb(m, n);
printf("最大公约数是:%d\n最小公倍数是:%d", gy, gb);
return 0;
}
/*********End**********/
//以下是对求最大公约数和最小公倍数算法代码的优化
//最大公约数:辗转相除法,最小公倍数=两数乘积/最大公约数
#include <stdio.h>
int main()
{
int m = 0, n = 0, p = 0, q = 0, tmp = 0;
scanf("%d %d", &m, &n);
p = m;
q = n;
tmp = p % q;
while (tmp != 0)
{
p = q;
q = tmp;
tmp = p % q;
}
p = m * n / q;
printf("最大公约数是:%d\n最小公倍数是:%d", q, p);
return 0;
}
3.4 字符串中各类字符数的统计
任务描述
本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。输入
一行字符。
输出
统计每种字符的个数值。测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
样例输入:
aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
样例输出:
23 16 2 4
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int cha = 0, number = 0, space = 0, other = 0;
int c;
while (1)
{
c = getchar();
if (c >= 65 && c <= 90)
cha += 1;
else if (c >= 97 && c <= 122)
cha += 1;
else if (c >= 48 && c <= 57)
number += 1;
else if (c == 32)
space += 1;
else if (c == 10)
break;
else
other += 1;
}
printf("%d %d %d %d", cha, number, space, other);
/*********End**********/
return 0;
}
3.5 求sn=a+aa+aaa+aaaa+…的值
任务描述
本关任务:键盘输入正整数
a
和n
,编程s=a+aa+aaa+aaaa+aa...a
(n
个a
)的值。
例如:
a=2
,n=5
时,表示计算由2
组成的数的和:2+22+222+2222+22222
( 此时 共有5
个数相加)。输入:
5
3
表示3
个由5
组成的数相加,即计算5+55+555
的值,输出:615
输入:
5
4
表示计算5+55+555+5555
的值,输出:6170
编程要求
本关的编程任务是补全右侧代码片段中
Begin
至End
中间的代码,具体要求如下:
键盘输入正整数a
和n
,编程s=a+aa+aaa+aaaa+aa...a
(n
个a
)的值。
例如:
a=2
,n=5
时,表示计算由2
组成的数的和:2+22+222+2222+22222
( 此时 共有5
个数相加)。输入:
5
3
表示3
个由5
组成的数相加,即计算5+55+555
的值,输出:615
输入:
5
4
表示计算5+55+555+5555
的值,输出:6170
测试说明
以下是测试样例:
输入:
5 3
输出:615
输入:6 4
输出:7404
输入:3 5
输出:37035
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int a = 0, s = 0, n = 0, i = 0, e = 0;
scanf("%d %d", &a, &n);
for (i = 0; i < n; i++)
{
e = 10 * e + a;
s = s + e;
}
printf("%d", s);
/*********End**********/
return 0;
}
第4节 循环结构程序设计2
本关涉及的代码文件的代码框架如下:
#include <stdio.h> // 定义main函数 int main() { // 请在此添加代码 /********** Begin *********/ /********** End **********/ return 0; }
4.1 C循环-求平均成绩
编程要求
本关的编程任务是补全右侧代码片段中
Begin
至End
中间的代码,具体要求如下:
编程实现:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。注意:当输入的学生人数小于等于0时,输出平均成绩为0分!
测试说明
以下是测试样例:
输入:
3 90 70 80
输出:the number of students:the scores:average=80.00
输入:-1
输出:the number of students:the scores:average=0.00
输入:4 78.5 26 73.6 90.1
输出:the number of students:the scores:average=67.05
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int student = 0, i = 0;
float score = 0, sum = 0;
printf("the number of students:");
scanf("%d", &student);
printf("the scores:");
scanf("%f", &sum);
if (student <= 0)
printf("average=0.00");
else
{
for (i = 1; i <= student; i++)
{
if (i == student)
printf("average=%.2f", sum / (student * 1.0));
else
{
scanf("%f", &score);
sum += score;
}
}
}
/*********End**********/
return 0;
}
4.2 C循环-求各位数字之积
编程要求
本关的编程任务是补全右侧代码片段中
Begin
至End
中间的代码,具体要求如下:
计算正整数num
的各位上的数字之积。
例如:输入:
2583
经过----( 2 ∗ 5 ∗ 8 ∗ 3 2*5*8*3 2∗5∗8∗3) 输出:240
输入:
102
经过----( 1 ∗ 0 ∗ 2 1*0*2 1∗0∗2) 输出:0
输入:
136
经过----( 1 ∗ 3 ∗ 6 1*3*6 1∗3∗6) 输出:18
测试说明
以下是测试样例:
输入:
120
输出:0
输入:314
输出:12
输入:1952
输出:90
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int number = 0, sum = 1, m = 0;
scanf("%d", &number);
while (number > 0)
{
m = number % 10;
sum = sum * m;
number = number / 10;
}
printf("%d", sum);
/*********End**********/
return 0;
}
4.3 C循环-求阶乘之和
编程要求
本关的编程任务是补全右侧代码片段中
Begin
至End
中间的代码,具体要求如下:
编程实现:任意输入n
,求S=1!+2!+...+n!
。注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0。
测试说明
以下是测试样例:
输入:
10
输出:4037913
输入:1
输出:1
输入:-5
输出:0
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int n = 0, e = 1, s = 0, i = 0;
scanf("%d", &n);
if (n == 0)
{
printf("1");
return 0;
}
else if (n < 0)
{
printf("0");
return 0;
}
while (i < n)
{
e = e * (i + 1);
s = s + e;
i = i + 1;
}
printf("%d", s);
/*********End**********/
return 0;
}
4.4 C循环-水仙花数
编程要求
本关的编程任务是补全右侧代码片段中
Begin
至End
中间的代码,具体要求如下:
求出所有的水仙花数。
**提示:**所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153
是一个水仙花数,因为153=1^3+5^3+3^3
。·
**注意:**本题不需要输入语句,由于网站限制要求一定要有输入输出示例,但同学们可以对输入部分忽略不计。
例如:
370
就是一个水仙花数,因为370 = 3^3 +7^3 + 0^3
测试说明
以下是测试样例:
输入:
1
输出:153 370 371 407
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int i;
for (i = 100; i < 1000; i++)
{
if ((i / 100) * (i / 100) * (i / 100) + ((i - i / 100 * 100) / 10) * ((i - i / 100 * 100) / 10) * ((i - i / 100 * 100) / 10) + (i % 10) * (i % 10) * (i % 10) == i)
printf("%d ", i);
}
/*********End**********/
return 0;
}
4.5 C循环-寻找完数
任务描述
本关任务:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,
6
的因子为1、2、3
,而6=1+2+3
,因此6
是"完数"。 编程序找出1000
之内的所有完数。编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,并按照要求完成任务。
输入
1000
输出
编程序找出1000
之内的所有完数,每个完数占一行。测试说明
输入:
1000
输出:
6
28
496
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int max = 0, i = 0, j = 0, tmp = 0;
scanf("%d", &max);
for (i = 2; i <= max; i++)
{
for (j = 1; j < i; j++)
{
if (i % j == 0)
tmp += j;
}
if (tmp == i)
printf("%d\n", i);
tmp = 0;
}
/*********End**********/
return 0;
}
4.6 分数求和
任务描述
本关任务:编写程序计算
1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100
的值,并显示出来(保留结果为小数点后三位)。编程要求
根据提示,在右侧编辑器
Begin-End
处补充代码,编写程序计算1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100
的值,并显示出来(保留结果为小数点后三位)。测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
开始你的任务吧,祝你成功!
代码
#include <stdio.h>
int main(void)
{
/*********Begin*********/
int i = 1, flag = 1;
float j = 0, sum = 0;
for (i = 1; i <= 100; i++)
{
j = 1.0 / i * flag;
sum = sum + j;
flag = -flag;
}
printf("%.3f", sum);
/*********End**********/
return 0;
}