实验报告中可能出现的简单编程题集3(以郑大实验报告题为主体)

  大家好,今天接着和大家分享实验报告中可能出现的简单编程题。当然,这整个系列主要都是对于题目代码的分享,出题人想法的分析和一些知识点的指出。至于相关的知识点详细介绍,应该会在后面出文章专门讲解。

目录

1.前面有一个实验简单运算的实验(具体为下面文章中第一题)

今天,我们来用函数对其进行简单的优化。 

2.编写近似求解一元函数f(x)在区间[a,b]上积分值的函数。如果f(x)=sin(2x)+x,[a,b]=[0.314159],当区间划分数n=10和n=20时,分别计算并输出积分值s1和s2,保留三位小数。提示:可采用梯形法。

3.编写程序判定一个数是否为素数;若是素数,函数返回值为1,若不是素数,函数返回值为0.用此函数找出100以内最大三个素数。

4.用指针变量按从小到大的顺序输出三个整数。

5.编写一个程序,用12个月份的英文名称初始化一个字符指针数组,当键盘输入整数为1到12时,显示相应的月份名,键入其他整数时显示错误信息。

6.编程求一个子串在一个字符串中出现的次数,如果该字符不出现则返回0。

7.假设学生信息如下:学号(长整型)、姓名(字符串型)、年龄(整型)、C语言成绩单(实型)、微积分成绩(实型)、英语成绩(实型)、总分(实型)、平均分(实型)。试编写程序,输入3个学生的上述信息,计算每个学生的总分和平均分,输出每个学生学号、姓名、总分、平均分。

8.按“年/月/日”格式输出系统日期,按“时:分:秒”格式输出系统时间。

9.假设需要统计若干学生和教师的数据。学生数据包括:姓名、学号、性别、职业、班级。教师数据包括:姓名、职工号、性别、职业、职务。输入各自数据,然后输出。


1.前面有一个实验简单运算的实验(具体为下面文章中第一题)
今天,我们来用函数对其进行简单的优化。 

实验报告中可能出现的简单编程题集2(以郑大实验报告题为主体)-CSDN博客icon-default.png?t=N7T8https://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;
}

这个代码很长,但是没有新的知识点。不过,这个代码其实和老师想要的略有不符,因为这里是可以使用共用体的,大家可以考虑考虑应该怎么改。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值