实验03 模块化程序设计(2022级)
一. 单选题(共1题,16.6分)
1. (单选题)有函数定义:int f(int x,int y);则下列函数调用正确的为( )
- A.int n; n=f();
- B. int n,a=0,b=1;n=int f(x,y);
- C. int n,a=0,b=1;n=f(a,b);
- D.int n,a=0,b=1; n=f(int a,int b);
我的答案: C
二. 程序题(共5题,83.4分)
2. (程序题)
题目编号:Exp03-Basic01,GJBook3-05-02
题目名称:组合问题
题目描述:编写程序,输入m,n的值,计算并输出函数f的值。
输入:一个整数m和一个整数n(m,n≤20)。
输出:函数f的值。
样例1:
输入:-1 2
输出:-1
样例2:
输入:2 2
输出:1
#include<stdio.h>
long long f(int m, int n);
long long pro(int s);
int main() {
int m, n;
scanf(" %d %d", &m, &n);
printf("%d", f(m, n));
}
long long f(int m, int n) {
long long ret;
if (m < n && m>0 && n > 0) { return 0; }
else if (m == n && m > 0 && n > 0) { return 1; }
else if (m > n && m > 0 && n > 0) {
ret = pro(m) / (pro(m - n) * pro(n));
return ret;
}
else { return -1; }
}
long long pro(int s) {
long long sum = 1;
for (int i = s; i > 0; i--) {
sum *= i;
}
return sum;
}
3. (程序题)
题目编号:Exp03-Basic02,GJBook3-05-06
题目名称:逆序数
题目描述:编写函数,求任意位自然数的逆序数,例如5432就是2345的逆序数。
输入:任意一个整数(<10^18) 。
输出:如果输入的不是自然数,则输出NULL;否则输出对应的逆序数。
样例1:
输入:120
输出:21
样例2:
输入:999999999999999999
输出:999999999999999999
样例3:
输入:-1357
输出:NULL
#include <stdio.h>
#include<math.h>
long long po(int b, int c) {
long long pro = 1;
for (int u = 1; u <= c; u++) {
pro *= b;
}
return pro;
}
int nb(long long s) {
int count = 0;
while (1) {
s /= 10;
count++;
if (s == 0) { break; }
}
return count;
}
int main() {
int z[18];
long long h, sum = 0;
scanf("%lld", &h);
if (h < 0)printf("NULL");
else {
int uu = nb(h);
for (int m = 0; m <= uu - 1; m++) {
z[m] = h % 10;
h /= 10;
}
for (int i = 0; i <= uu - 1; i++) {
sum += z[i] * po(10, uu - i - 1);
}
printf("%lld", sum);
}
}
4. (程序题)
题目编号 :Exp03-Basic03
题目名称:多边形周长
题目描述:编写程序,求由键盘按顺时针方向输入n(0<n<=10)个顶点坐标的多边形周长(测试数据已保证当n>2时,各点按输入方向依次连接可构成封闭的n边形)。
输入:第一行输入一个整数,作为n值;以后每行两个浮点数(double),为多边形各顶点的坐标。
输出:多边形的周长,精确到小数点后2位。
样例1:
输入: 4 0 0 0 1 1 1 1 0
输出:4.00
样例2:
输入: 1 2 3
输出: 0.00
样例3:
输入: 2 2 3 2 4
输出: 1.00
#include<stdio.h>
#include<math.h>
double dis(double a, double b) {
double distance = sqrt(a * a + b * b);
return distance;
}
int main() {
int n;
double x1, x2, y1, y2, x3, y3, sum = 0;
scanf("%d", &n);
if (n == 1)printf("0.00");
else if (n == 2) {
scanf("%lf %lf\n", &x1, &y1);
scanf("%lf %lf", &x2, &y2);
sum = dis(x1 - x2, y1 - y2);
printf("%.2lf", sum);
}
else {
scanf("%lf %lf", &x1, &y1);
x3 = x1; y3 = y1;
for (int s = 1; s <= n - 1; s++) {
scanf("%lf %lf", &x2, &y2);
sum += dis(x1 - x2, y1 - y2);
x1 = x2;
y1 = y2;
}
sum += dis(x2 - x3, y2 - y3);
printf("%.2lf", sum);
}
}
5. (程序题)
题目编号:Exp03-Extend01,GJBook3-12-04
题目名称:自守数
题目描述:若一个正整数a满足条件 a^2 的尾数等于a,则称a为自守数,例如:
25^2=625 、76^2=5776 、9376^2=87909376 都是自守数。
编写程序,求小于等于n的所有自守数。
输入:从键盘随机输入一个正整数n(不超过10000000)。
输出:输出小于等于n的所有自守数,每个数之间以一个西文空格间隔。
样例1:
输入:10
输出:1 5 6
样例2:
输入:100
输出:1 5 6 25 76
#include<stdio.h>
#include<math.h>
long long int muu(long long int n);
int main() {
long long a, pro;
scanf("%lld", &a);
for (long long i = 1; i <= a; i++) {
pro = i * i;
if (pro % muu(i) == i)printf("%lld ", i);
}
}
long long int muu(long long int n) {
long long ret = 1;
int count = 0;
while (1) {
n = n / 10;
count++;
if (n == 0)break;
}
for (int m = 1; m <= count; m++)
{
ret *= 10;
}
return ret;
}
6. (程序题)
【计2014级期中试题】素数判断。
问题描述:一个大于1的自然数,只能被1和它本身整除,不能被其它除0以外的自然数整除,则该数称之为素数。编写函数,判断一个整数是否为素数。
注:判断素数部分必须编写成一个独立于main()函数的其它函数。
输入:一个大于1的自然数
输出:根据是否是素数输出Y/N
样例1:
输入:3
输出:Y
样例2:
输入:51
输出:N
#include <stdio.h>
int judge(long long s);
int main() {
long long n;
scanf("%lld", &n);
if (judge(n))printf("Y");
else { printf("N"); }
}
int judge(long long s) {
if (s == 2)return 1;
for (long long i = 2; i < s; i++) {
if (s % i == 0)return 0;
}
return 1;
}