大家好,今天接着和大家分享实验报告中可能出现的简单编程题。当然,这整个系列主要都是对于题目代码的分享,出题人想法的分析和一些知识点的指出。至于相关的知识点详细介绍,应该会在后面出文章专门讲解。
目录
3.编写程序判定一个数是否为素数;若是素数,函数返回值为1,若不是素数,函数返回值为0.用此函数找出100以内最大三个素数。
5.编写一个程序,用12个月份的英文名称初始化一个字符指针数组,当键盘输入整数为1到12时,显示相应的月份名,键入其他整数时显示错误信息。
6.编程求一个子串在一个字符串中出现的次数,如果该字符不出现则返回0。
8.按“年/月/日”格式输出系统日期,按“时:分:秒”格式输出系统时间。
9.假设需要统计若干学生和教师的数据。学生数据包括:姓名、学号、性别、职业、班级。教师数据包括:姓名、职工号、性别、职业、职务。输入各自数据,然后输出。
1.前面有一个实验简单运算的实验(具体为下面文章中第一题)
今天,我们来用函数对其进行简单的优化。
实验报告中可能出现的简单编程题集2(以郑大实验报告题为主体)-CSDN博客https://blog.csdn.net/m0_74950144/article/details/134424380
#include<stdio.h>
void menu()
{
printf("1.求两个数的和\n");
printf("2.求两个数的差\n");
printf("3.求两个数的商和模\n");
printf("4.求两个数的倒数之和\n");
printf("0.退出系统\n");
printf("请做出你的选择:\n");
}
void Add(float x,float y)
{
float num=0;
printf("%.2f\n",num=x+y);
}
void Sub(float x,float y)
{
float num=0 ;
printf("输出的结果为:%.2f\n",num=x-y);
}
void Div(float x,float y)
{
float num=0;
int mol=0;
printf("输出的结果为:%.2f %d",num=x/y,mol=(int)x%(int)y);
}
void BackAdd(float x,float y)
{
float num=0;
printf("输出的结果为:%.2f",num=(1/x)+(1/y));
}
void Math()
{
float a,b;
int x=0;
do
{
menu();
scanf("%d",&x);
switch(x)
{
case 1:
{
printf("您选择:求两个数的和,请输入两个数\n");
scanf("%f%f",&a,&b);
Add(a,b);
break;
}
case 2:
{
printf("您选择:求两个数的差,请输入两个数(前为被减数,后为减数)\n");
scanf("%f%f",&a,&b);
Sub(a,b);
break;
}
case 3:
{
printf("您选择:求两个数的商和模,请输入两个数(前者为被除数,后为除数)\n");
scanf("%f%f",&a,&b);
Div(a,b);
break;
}
case 4:
{
printf("您选择:求两个数的倒数之和,请输入两个数\n");
scanf("%f%f",&a,&b);
BackAdd(a,b);
break;
}
case 0:
{
printf("退出系统\n");
break;
}
default:
{
printf("输入错误,重新选择\n");
break;
}
}
}while(x);
}
int main()
{
Math();
return 0;
}
这里又提到了新的名词,函数。那么函数是怎么定义的,怎么使用的,有哪些值得注意的点?这次代码虽然有所优化,让代码模块化了,但是好像还是不够精细,该怎么再优化呢?上次提的枚举常量好像没有使用,该怎么使用呢?(希望大家在使用代码之外能够多多思考,加深对于代码的理解。)
2.编写近似求解一元函数f(x)在区间[a,b]上积分值的函数。如果f(x)=sin(2x)+x,[a,b]=[0.314159],当区间划分数n=10和n=20时,分别计算并输出积分值s1和s2,保留三位小数。提示:可采用梯形法。
#include<stdio.h>
#include<math.h>
float Han(float x)
{
return sin(2*x)+x;
}
float QiuJiFen(float a,float b,int num)
{
float s=0,i=0;
float n=(b-a)/num;//分成等长份
for(i=a;i<=b;i=i+n)
{
s+=fabs(Han((i+i+n)/2))*n;
}
return s;
}
int main()
{
int num=0;
float a,b;
printf("请输入函数区间:\n");
scanf("%f%f",&a,&b);
printf("请输入区间划分数:\n");
scanf("%d",&num);
float ret=QiuJiFen(a,b,num);
printf("%d个区间所求的结果ret=%.3f",num,ret);
return 0;
}
3.编写程序判定一个数是否为素数;若是素数,函数返回值为1,若不是素数,函数返回值为0.用此函数找出100以内最大三个素数。
#include<stdio.h>
#include<math.h>
int isPrime(int x)
{
int j=0;
if(x==1)
return 0;
if(x==2)
return 1;
else
{
for(j=2;j<sqrt(x);j++)
{
if(x%j==0)
{
return 0;
}
}
return 1;
}
}
int main()
{
int i=0,a=0,b=0,c=0;//定义a,b,c去存放素数
int count=1;
for(i=1;i<=100;i++)
{
if(isPrime(i)==1)
{
printf("第一个素数%d为:%d\n",count,i);
count++;
c=b;
b=a;
a=i;//不断变更赋值,使a得到最后一个素数,b,c则为前面两个
}
}
printf("最大的三个素数:%d %d %d",a,b,c);
return 0;
}
这道题的话也是通过应用函数使代码更明晰,不过,这里也是有取巧的成分——因为是从1至100按顺序查找素数,所以最后三个找到的素数必然是最大的三个。大家如果想更严谨地写,感觉还是要定义数组,大家感兴趣可以自己试一试,敲一敲。
4.用指针变量按从小到大的顺序输出三个整数。
#include<stdio.h>
void Max(int*pa,int*pb,int*pc)
{
if(*pa>*pc&&*pa>*pb&&*pc>*pb)
printf("从小到大排序为:%d %d %d",*pb,*pc,*pa);
if(*pa>*pc&&*pa>*pb&&*pb>*pc)
printf("从小到大排序为:%d %d %d",*pc,*pb,*pa);
if(*pc>*pa&&*pa>*pb&&*pc>*pb)
printf("从小到大排序为:%d %d %d",*pb,*pa,*pc);
if(*pc>*pa&&*pb>*pa&&*pc>*pb)
printf("从小到大排序为:%d %d %d",*pa,*pb,*pc);
if(*pb>*pc&&*pb>*pa&&*pc>*pa)
printf("从小到大排序为:%d %d %d",*pa,*pc,*pb);
if(*pb>*pc&&*pa>*pc&&*pb>*pc)
printf("从小到大排序为:%d %d %d",*pc,*pa,*pb);
}
int main()
{
int a,b,c;
printf("随机输入三个数字:>");
scanf("%d%d%d",&a,&b,&c);
int*pa=&a;
int*pb=&b;
int*pc=&c;
Max(pa,pb,pc);
return 0;
}
这一题也是出现了之前编程题中从没有出现过的知识点——指针。指针的应用是有很多学问的,和函数也有比较紧密的联系——主要是传值和传址(这个比较有意思)。上面的代码的话是比较刻意的排序,其实我们在定义函数的时候,应该更严谨地命名,让名字有意义。比如上面Max字面意思是最大值,按理说应该要有返回值,这样才是比较合理的,别人看我们的代码时也会比较容易理解。所以,希望大家初学时能在这些细节处多注意,养成好习惯。(上面那个大家凑合凑合看就行,最好自己再认真敲一遍。)
5.编写一个程序,用12个月份的英文名称初始化一个字符指针数组,当键盘输入整数为1到12时,显示相应的月份名,键入其他整数时显示错误信息。
#include<stdio.h>
int main()
{
char*arr[12]={"January","Febeuary","March","April","May","June","July"
,"August","September","October","November","December"};
int input=0;
do
{
printf("\n请输入你想选择的月份(若无想知道月份英文名称,则输入0退出程序):>");
scanf("%d",&input);
switch(input)
{
case 1:
printf("%d月对应的英文名称为:%s",input,arr[0]);
break;
case 2:
printf("%d月对应的英文名称为:%s",input,arr[1]);
break;
case 3:
printf("%d月对应的英文名称为:%s",input,arr[2]);
break;
case 4:
printf("%d月对应的英文名称为:%s",input,arr[3]);
break;
case 5:
printf("%d月对应的英文名称为:%s",input,arr[4]);
break;
case 6:
printf("%d月对应的英文名称为:%s",input,arr[5]);
break;
case 7:
printf("%d月对应的英文名称为:%s",input,arr[6]);
break;
case 8:
printf("%d月对应的英文名称为:%s",input,arr[7]);
break;
case 9:
printf("%d月对应的英文名称为:%s",input,arr[8]);
break;
case 10:
printf("%d月对应的英文名称为:%s",input,arr[9]);
break;
case 11:
printf("%d月对应的英文名称为:%s",input,arr[10]);
break;
case 12:
printf("%d月对应的英文名称为:%s",input,arr[11]);
break;
case 0:
printf("退出");
break;
default:
printf("输入错误,请重新输入");
break;
}
}while(input);
return 0;
}
这里的话是根据题意编写了个程序,值得注意的应该是字符指针数组的建立(大家应该掌握的)。另外,仔细观察代码特点,①看能不能用函数把一些重复部分囊括,避免代码重复冗长。②数组的建立是按从小到大的顺序,那么我们使用时,下标和所输入的月份有什么关系?
6.编程求一个子串在一个字符串中出现的次数,如果该字符不出现则返回0。
#include<stdio.h>
#include<string.h>
int ChaZhao(char arr1[],char arr2[],int i,int j)
{
int count=0;
int begin1,begin2,now;
for(begin1=0;begin1<i;begin1++)
{
now=begin1;
for(begin2=0;begin2<j;begin2++)
{
if(arr1[now]==arr2[begin2])
{
now++;
if(begin2==j-2)
{
count++;
break;
}
}
else
break;
}
}
return count;
}
int main()
{
char arr1[100000]={0};
char arr2[100000]={0};
printf("随机输入字符串作为母串:");
scanf("%s",arr1);
printf("随机输入字符串作为子串:");
scanf("%s",arr2);
int num1=strlen(arr1);
int num2=strlen(arr2);
int num=ChaZhao(arr1,arr2,num1,num2);
printf("子串在母串中出现%d次",num);
return 0;
}
这个代码其实是比较麻烦的,里面也涉及到一个知识点就是传数组时,程序默认为指针,那么数组的大小就失效了,所以为了你在函数中使用数组不越界,应该自己向函数输入数组大小。当然,这个代码还是存在一点小问题的,大家可以研究研究,讨论讨论。
7.假设学生信息如下:学号(长整型)、姓名(字符串型)、年龄(整型)、C语言成绩单(实型)、微积分成绩(实型)、英语成绩(实型)、总分(实型)、平均分(实型)。试编写程序,输入3个学生的上述信息,计算每个学生的总分和平均分,输出每个学生学号、姓名、总分、平均分。
#include<stdio.h>
struct Stu
{
long Xue;
char name[20];
int age;
float gradeC;
float gradeW;
float gradeE;
float gradeT;
float gradeA;
};
void Get_T(struct Stu *p)
{
p->gradeT=p->gradeC+p->gradeE+p->gradeW;
}
void Get_A(struct Stu *p)
{
p->gradeA=(p->gradeC+p->gradeE+p->gradeW)/3;
}
void Print(struct Stu *p)
{
printf("学号: %d\n",p->Xue);
printf("姓名: %s\n",p->name);
printf("年龄: %d\n",p->age);
printf("C成绩: %f\n",p->gradeC);
printf("微积分: %f\n",p->gradeW);
printf("英语: %f\n",p->gradeE);
printf("总分: %f\n",p->gradeT);
printf("平均分: %f\n",p->gradeA);
printf("\n");
}
int main()
{
struct Stu s1={202201,"张三",18,80,85,90,0,0};
struct Stu s2={202202,"李四",18,85,80,96,0,0};
struct Stu s3={202203,"王五",18,75,78,87,0,};
Get_T(&s1);
Get_T(&s2);
Get_T(&s3);
Get_A(&s1);
Get_A(&s2);
Get_A(&s3);
Print(&s1);
Print(&s2);
Print(&s3);
return 0;
}
这里的话,又出现了新的知识点——结构体,一种新的数据类型,由程序员自行构造。该数据类型用于如学生信息这种含有很多成员信息的数据,可以将不同类型的数据联系在一起。至于,里面的一些->符号,大家自行去了解。
8.按“年/月/日”格式输出系统日期,按“时:分:秒”格式输出系统时间。
#include<stdio.h>
struct Date
{
int Year;
short Moon;
short Day;
};
struct Time
{
short Hour;
short Min;
short Fen;
};
Print1(struct Date*p)
{
printf("%d/%d/%d\n",p->Year,p->Moon,p->Day);
}
Print2(struct Time*p)
{
printf("%d:%d:%d\n",p->Hour,p->Min,p->Fen);
}
int main()
{
struct Date day1={2022,12,16};
struct Time time1={22,22,22};
Print1(&day1);
Print2(&time1);
//printf("%s ",__DATE__);
//printf("%s",__TIME__);
return 0;
}
这里没有特别的知识点,不过大家可以着重看看最后两个注释掉的语句,看看它们的打印结果是什么。😀
9.假设需要统计若干学生和教师的数据。学生数据包括:姓名、学号、性别、职业、班级。教师数据包括:姓名、职工号、性别、职业、职务。输入各自数据,然后输出。
#include<stdio.h>
struct Stu
{
char name[20];
char Xue[15];
char Sex[6];
char Work[10];
int Class;
};
struct teacher
{
char name[20];
char Tea[15];
char Sex[6];
char Work[10];
char Zhi[15];
};
void Scanf1(struct Stu *p)
{
printf("请输入学生对应信息:\n");
printf("姓名:");
scanf("%s",p->name);
printf("学号:");
scanf("%s",p->Xue);
printf("性别:");
scanf("%s",p->Sex);
printf("职业:");
scanf("%s",p->Work);
printf("班级:");
scanf("%d",&p->Class);
}
void Scanf2(struct teacher *p)
{
printf("请输入老师对应信息: \n");
printf("姓名:");
scanf("%s",p->name);
printf("职工号:");
scanf("%s",p->Tea);
printf("性别:");
scanf("%s",p->Sex);
printf("职业:");
scanf("%s",p->Work);
printf("职务:");
scanf("%s",p->Zhi);
}
void Print1(struct Stu stu)
{
printf("姓名:%s\n",stu.name);
printf("学号:%s\n",stu.Xue);
printf("性别:%s\n",stu.Sex);
printf("职业:%s\n",stu.Work);
printf("班级:%d\n",stu.Class);
printf("\n");
}
void Print2(struct teacher tea)
{
printf("姓名: %s\n",tea.name);
printf("职工号:%s\n",tea.Tea);
printf("性别: %s\n",tea.Sex);
printf("职业: %s\n",tea.Work);
printf("职务: %d\n",tea.Zhi);
printf("\n");
}
int main()
{
struct Stu s1;
struct teacher t1;
Scanf1(&s1);
Scanf2(&t1);
Print1(s1);
Print2(t1);
return 0;
}
这个代码很长,但是没有新的知识点。不过,这个代码其实和老师想要的略有不符,因为这里是可以使用共用体的,大家可以考虑考虑应该怎么改。