文章目录
- [一、 实验目的和要求](#一、 实验目的和要求)
- 二、实验环境(实验设备)
- 三、实验原理及内容
- 实验题目(5):编写程序exp2_5.c,验证"哥德巴赫猜想"。
一、 实验目的和要求
(1)能正确选择使用if语句和switch语句实现选择结构的程序设计。
(2)正确使用while、for、do...while语句实现循环结构的程序设计。
(3)会利用循环嵌套实现较复杂的程序控制,理解循环嵌套程序的执行过程和条件的变化。
(4)利用调试器跟踪、调试程序,会设置断点、单步跟踪,查看相应的变量或表达式的值,帮助理解循环、选择结构程序执行过程并能查找、修改逻辑错误。
二、实验环境(实验设备)
硬件:微型计算机
在线平台:PTA
自备软件:VS / VS Code / Dev-C++ / 等
三、实验原理及内容
实验内容:实验二的题目选自实验指导书的实验3和实验4。
补充说明:先在自己电脑完成程序,自行准备多组数据进行运行测试,可使用调试工具;将已完成的代码复制到PTA平台相对于的实验作业集进行在线测评。
实验题目(1):编写程序exp2_1.c,计算三角形面积和周长。
根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:
,其中s=(a+b+c)/2。
输入格式:输入为3个正整数,分别代表三角形的3条边a、b、c。
输出格式:如果输入的边能构成一个三角形,则在一行内,按照 area = 面积; perimeter = 周长 的格式输出,保留两位小数。否则,输出 These sides do not correspond to a valid triangle
实验解答:
① 源程序代码如下:
c
#include <stdio.h>
#include <math.h>
int main(){
int a,b,c,temp;
double area,s,perimeter;
scanf("%d%d%d",&a,&b,&c);
if(a>b){
temp=a;
a=b;
b=temp;
}if(b>c){
temp=b;
b=c;
c=temp;
}if(a>c){
temp=a;
a=c;
c=temp;
}
if(a+b>c){
s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
perimeter=a+b+c;
printf("area = %.2f; perimeter = %.2f",area,perimeter);
}else{
printf("These sides do not correspond to a valid triangle");
}
return 0;
}
② 程序运行结果截图:

实验题目(2):编写程序exp2_2.c,统计输入信息中各种字符的个数。
输入n个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
输入格式:输入在第一行中给出正整数n,第二行输入n个字符,最后一个回车表示输入结束,不算在内。
输出格式:在一行内按照 letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数 的格式输出。请注意,等号的左右各有一个空格,逗号后有一个空格。
本程序易错点提示:
首先读取整数n,会有一个回车留在输入缓冲区,按题意接下来读取n个字符,是不包括这个回车的,所以,程序应该:
1-读取整数n
2-清除输入缓冲区:getchar()
3-循环N次,每次读取一个字符,然后进行判断统计
实验解答:
① 源程序代码如下:
c
#include <stdio.h>
int main(void)
{
int N, letter = 0, digit = 0, other = 0, blank = 0, i;
char ch;
scanf("%d", &N);
getchar();
for(i = 0; i < N; i++){
ch = getchar();
if((ch >= 'a'&&ch <= 'z')||(ch >= 'A'&&ch <= 'Z')){
letter++;
}else if(ch >= '0'&&ch <= '9'){
digit++;
}else if(ch == ' '||ch == '\n'){
blank++;
}else{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
return 0;
}
② 程序运行结果截图:

实验题目(3):编写程序exp2_3.c,求e的近似值。
自然常数 e 可以用级数 1 + 1/1! + 1/2! + ⋯ + 1/n! + ⋯ 来近似计算。输入一个非负整数 n,求该级数的前 n+1 项和。
输入格式:输入一个非负整数 n。
输出格式:输出结果保留小数点后八位。
实验解答:
① 源程序代码如下:
c
#include <stdio.h>
int main(){
int n,i;
double term = 1,sum = 1;
scanf("%d",&n);
for(i = 1;i <= n;i++){
term = term/i;
sum = sum+term;
}
printf("%.8f",sum);
return 0;
}
② 程序运行结果截图:

实验题目(4):编写程序exp2_4.c,输出n行由大写字母A开始构成的三角形字符阵列。
输入格式:输入一个正整数n(1≤n<7)。
输出格式:输出n行由大写字母A开始构成的三角形字符阵列,其中每个字母后面都有一个空格。
实验解答:
① 源程序代码如下:
c
#include <stdio.h>
int main(){
int n,i,j;
int ch = 'A';
scanf("%d",&n);
for(i = 0;i < n;i++){
for(j = 0;j < n - i;j++){
printf("%c ",ch++);
}
printf("\n");
}
return 0;
}
② 程序运行结果截图:

实验题目(5):编写程序exp2_5.c,验证"哥德巴赫猜想"。
任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:输入一个(2, 2 000 000 000]范围内的偶数n。
输出格式:在一行中按照格式"n = p + q"输出n的素数分解,其中p ≤ q均为素数。这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
实验解答:
① 源程序代码如下:
c
#include <stdio.h>
#include <math.h>
int isprime(int a){
int flag,i,limit;
if(a <= 1){
flag = 0;
}else if(a == 2){
flag = 1;
}else{
flag = 1;
limit = sqrt(a) + 1;
for(i = 2;i <= limit;i++){
if(a%i ==0){
flag = 0;
break;
}
}
}
return flag;
}
int main(){
int N,p,q;
scanf("%d",&N);
for(p = 2;p <= N; p++){
q = N - p;
if(isprime(p)&&isprime(q)){
printf("%d = %d + %d\n",N,p,q);
break;
}
}
return 0;
}
② 程序运行结果截图:
