C语言实验报告
1. 编写一个函数pi,其功能是根据以下近似公式求π值:(π*π)/6=1+1/(2*2) +1/(3*3) +… +1/(n*n)。并写一个主函数,调用该函数计算π的值,n在主函数中从键盘输入。要求程序存入test11.c。
设计思路:主要考察函数的调运,以及如何定义函数,函数的运行,此题应该使用一个循环。
调试结果:
#include<stdio.h>
#include<math.h>
main( )
{
int m=1,n,s;
float p=0,t;
scanf("%d",&n);
while(m<=n)
{
s=1/(m*m);
p=p+s;
m++;
}
t=sqrt(p*6);
printf("t=%f",t);
}
运行结果:
2. 下列程序是将一个数组中的值按逆序重新存放并输出。请输入并完善程序。要求程序存入test12.c。
#include <stdio.h>
void main()
{ int arr[10],i,j,temp;
printf(“Input value of array:\n”);
for(i=0;i<10;i++)
scanf(“%d”, &arr[i] );
for(i=0,j=9;i<=j;i++,j--)
temp=arr[i],arr[i]= arr[j] ,arr[j]=temp;
for(i=0;i<10;i++)
printf(“%4d”, arr[i] );
}
设计思路:数组的考察,首先定义一个数组,FOR循环的使用,数组的转换。
运行结果:
3. 在下列程序中,函数my_cmp()的功能是比较字符串s和t的大小,当s等于t时返回0,否则返回s和t的第一个不同字符ASCII码差值,当s<t时返回负值。请输入程序并改正程序中带*的行中的错误,使它能够正确的输出结果。要求程序存入test13.c。
#include <stdio.h>
* int my_cmp(char *s,char *t)
{ while(*s==*t)
* { if(*s++==0)
return(0);
++s,++t;
}
* return(*s-*t);
}
void main()
{ char *s1,*s2;
* gets(s1);
gets(s2);
if(my_cmp(s1,s2)==0)
printf(“EQ”);
else if(my_cmp(s1,s2)>0)
printf(“s1>s2”);
else printf(“s2>s1”);
}
设计思路:函数的调用,以及while、if语句的使用,如何输入一个字符串,指针的运用。
运行结果:
4. 编写一个程序用来统计学生成绩。其功能包括输入学生姓名和成绩,按成绩从高到低排列打印输出,对前80%的学生定为合格(pass),后20%的学生定为不合格(fail)。要求程序存入test14.c。
设计思路:
调试结果:#include "stdio.h"
#include "malloc.h"
struct student
{
char name[20];
float score;
struct student *next;
};
int n;
struct student *creat(void)
{
struct student *head,*p1,*p2;
n=0;
head=p1=p2=(struct student*)malloc(sizeof(struct student));
printf("请输入学生姓名:\n");
scanf("%s",p1->name);
printf("请输入学生成绩:(成绩为零为结束)\n");
scanf("%f",&p1->score);
while(p1->score!=0)
{
n++;
if(n!=1)p2->next=p1;
p2=p1;
p1=(struct student*)malloc(sizeof(struct student));
printf("请输入学生姓名:\n");
scanf("%s",p1->name);
printf("请输入学生成绩:\n");
scanf("%f",&p1->score);
}
p2->next=NULL;
return head;
}
struct student *sort(struct student *head)
{
struct student *p1,*p2,*p;
int i,j,k;
k=n;
for(j=0;j<k-1;j++)
for(i=0,p=p1=head,p2=head->next; i<k-1-j&&p2!=NULL ;i++,p1=p->next,p2=p1->next)
{ if(p1->score < p2->score)
{ if(p==head&&i==0)
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p=p2;
}
else
{
p1->next=p2->next;
p2->next=p1;
p->next=p2;
p=p2;
}
}
else p=p1;
}
return(head);
}
void print(struct student *head)
{
int k, i=1;
k=n;
k=k*0.8;
while(head!=NULL)
{
if(i<=k)printf("%s,%f 合格(pass)\n",head->name,head->score);
else printf("%s,%f 不合格(fail)\n",head->name,head->score);
head=head->next;
i++;
}
}
void main()
{
struct student *p;
p=sort(creat());
print(p);
}
运行结果:
Test2
1. 编写一个程序计算下列不等式:1+1/2+1/3++1/n>limit所需级数的项数。其中limit是提出的要满足的条件,而所求的是项数n。(例如,当输入limit的值为5时,n的值为83),要求程序存入test21.c。
设计思路:
调试结果:#include"stdio.h"
void main()
{
int limit;
float a=0,n,i;
printf("请输入limit的值\n");
scanf("%d",&limit);
for(i=1;;i++)
{
a=a+1/i;
n=i;
if(a>limit)break;
}
printf("n=%f\n",n);
}
设计思路:循环的使用,scanf函数的运用,for语句的运用。
运行结果:
2. 下列程序是一个二维数组行和列的元素互换,存到另一个二维数组中。请输入并完善程序。要求程序存入test22.c。
#include <stdio.h>
void main()
{ int i,j,arr1[2][3]={{2,4,6},{1,3,5}},arr2[3][2];
printf(“Array arr1:\n”);
for(i=0;i<2;i++)
{ for(j=0;j< 3 ;j++)
{ printf(“%5d”,arr1[i][j]);
arr2[j][i] =arr1[i][j];
}
printf(“\n”);
}
printf(“Array arr2:\n”);
for(i=0;i<3;i++)
{ for(j=0;j<2; j++ )
printf(“%5d”,arr2[i][j]);
printf(“\n”);
}
}
设计思路:数组元素的转换,for语句的运用,函数的调运,以及对循环的使用。
运行结果:
3. 下列程序的功能是输入一个字符串并将其中从左到右第一个最大的字符与最后一个字符交换。如:“imaastudent123”,交换后为“imaast3dent12u”。请输入并改正程序中带*的行中的错误,使它能够正确的输出结果。要求程序存入test23.c。
#include <stdio.h>
void main()
{ char s[80],max; int i,k;
* gets(s);
max=s[0];
k=0;
* for(i=0;s[i]!=’\0’;i++)
* if(s[i]> s[0])
max=s[i],k=i;
if(k!=i-1)
* s[k]=s[i-1];
s[i-1]=max;
puts(s);
}
设计思路:字符串的输入和输出,循环的使用,数组的使用。
运行结果:
4. 编程实现:找出100以内(含100)满足I,I+4,I+10都是素数的整数I(I+10也在100以内)的个数cnt、每个满足条件的I值以及这些I之和sum。
设计思路:
调试结果:#include <stdio.h>
#include <math.h>
void main()
{
int i,sum=0,j,cnt=0;
for(i=3;i<=90;i++)
{
for(j=2;j<=i;j++)
if(i%j==0 || (i+4)%j==0 || (i+10)%j==0)
break;
if(i==j){
sum=sum+i;
cnt++;
printf("i=%d\n",i);
}
}printf("cnt=%d\nsum=%d\n",cnt,sum);
}
运行结果:
Test 3 综合练习
1.编写程序,实现输入的时间屏幕显示一秒后的时间。显示格式为HH:MM:SS。程序需要处理以下三种特殊情况:
(1)若秒数加1后为60,则秒数恢复到0,分钟数增加1;
(2)若分钟数加1后为60,则分钟数恢复到0,小时数增加1;
(3)若小时数加1后为24,则小时数恢复到0。
设计思路:
调试结果:#include "stdio.h"
struct time
{ int hour;
int minute;
int second;
};
main()
{
struct time now;
printf("Please enter now time(HH,MM,SS)=\n");
scanf("%d,%d,%d",&now.hour,&now.minute,&now.second);
now.second++;
if(now.second==60)
{
now.second=0;
now.minute++;
}
if(now.minute==60)
{
now.minute=0;
now.hour++;
}
if(now.hour==24)
now.hour=0;
printf("\nNow is %d:%d:%d\n",now.hour,now.minute,now.second);
}
运行结果:
2.编写函数,采用递归方法将任一正整数转换为二进制形式。
设计思路:
调试结果:
#include <stdio.h>
turn(n,a,k)
int n,a[ ],k;
{
if(n>0)
{
a[k]=n%2;
turn(n/2,a,k-1);
}
else return;
}
main()
{
int i,n,a[16]={0};
printf("\nPlease enter n:");
scanf("%d",&n);
turn(n,a,15);
for(i=0;i<16;i++);
printf("%d",a[i]);
}
设计思路:函数的调运,字符串的输入和输出,循环的使用,数组的使用。
运行结果:
3.从键盘上输入两个日期,计算两者之间相隔的天数。具体要求如下:
(1) 定义一个一维数组,用以存放平年的12个月的每月天数。
(2) 设计一个自定义函数fa(),判断年份是否闰年,如果是则返回数值1,否则返回0。
(3) 设计一个自定义函数fb(),用以计算起始日期到年底的天数。
(4) 设计一个自定义函数fc(),用以计算起始日期到终止日期间的整年的天数。
(5) 设计一个自定义函数fd(),用以计算终止日期是该年的多少天。
(6) 主函数要求日期的输入与结果的输出有良好的提示信息。
设计思路:
调试结果:#include "stdio.h"
int fa(int q)
{
if((q%4==0 && q%100!=0) || q%400==0)
return(1);
else
return(0);
}
int fb(int a[],int b,int c)
{
int i;
int sum=a[b-1]-c;
for(i=b;i<12;i++)
sum+=a[i];
return(sum);
}
int fc(int a[],int b,int c,int d,int e)
{
int sum=0,sum1,sum2;
int i;
for(i=0;i<b-1;i++)
sum1+=a[i];
sum1+=c,sum1--;
for(i=0;i<d-1;i++)
sum2+=a[i];
sum2+=e,sum2--;
sum=sum2-sum1;
return(sum);
}
int fd(int a[],int d,int e)
{
int i;
int sum=e;
for(i=0;i<d-1;i++)
sum+=a[i];
return(sum);
}
void main()
{
int q;
int b,c,d,e;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("请输入你想判断的年份:");
scanf("%d",&q);
if(fa(q)==1)
{
printf("%d是闰年\n",q);
a[1]++;
}
else
printf("%d是平年\n",q);
printf("请输入起始日期:");
scanf("%d,%d",&b,&c);
printf("请输入终止日期:");
scanf("%d,%d",&d,&e);
printf("起始日期到年底的天数为:%d\n",fb(a,b,c));
printf("起始日期到终止日期间的整年的天数为:%d\n",fc(a,b,c,d,e));
printf("终止日期是该年的第%d天\n",fd(a,d,e));
}
运行结果:函数的调运,字符串的输入和输出,循环的使用,数组的使用。
4.在主函数中输入20##年的某月某日,编写一个函数完成计算该日是星期几,在主函数中输出。程序存入TEST34.C中。(已知20##年的1月1日是星期二)
例如:输入:1/2(表示1月2日)
输出:Tue(表示星期二)
设计思路:
调试结果:#include"stdio.h"
void main()
{
int fa(int n,int m);
int n,m,y;
printf("请输入月份,日期\n");
scanf("%d,%d",&n,&m);
y=fa( n, m);
switch(y)
{
case 0:printf("Tue\n");break;
case 1:printf("Wed\n");break;
case 2:printf("Thu\n");break;
case 3:printf("Fri\n");break;
case 4:printf("Sat\n");break;
case 5:printf("Sun\n");break;
case 6:printf("Mon\n");break;
}
}
int fa(int n,int m)
{
int i,sum=0,c,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=1;i<=12;i++)
{
if(i<n)sum=a[i-1]+sum;
else break;
}
sum=sum+m-1;
c=sum%7;
return(c);
}
运行结果:
提高题:
1.兑奖程序:
体育彩票由七位数字组成,第七位数字是特别号码,只有在前面六位数都正确的时候才对第七位数。现在体彩中心给出了一个特等奖号码是1234567,程序要求在屏幕上任输入一个号码判断出中了几等奖。(如果七位数字都相同就是特等奖;前六位相同为一等奖,任连续五位相同为二等奖,任连续四位相同为三等,任连续三位相同为四等,任连续两位相同位五等。(注意:除特等奖外都不考虑第七位)
按照以下对奖方式,写出程序:
不按位对奖:也就是说不管是多少位,只要有连续几位相同都可以。比如说给出的号码是:2312345就中了三等奖(因为1234和前面相同,注意,这里的第七位是5,虽然也相同但是不能算)
设计思路:
调试结果:
#include "stdio.h"
void main()
{
char a[7],b[7];
int i,j,num,max=0;
printf("请输入中奖号码:");
gets(a);
printf("请输入兑奖号码:");
gets(b);
for(j=0;j<6;j++)
{
for(i=0,num=0;i<6;i++)
{
if(a[i]==b[j])
{
j++;
num++;
}
}
if(num>max) max=num;
}
if(max==6)
{
if(a[6]==b[6]) printf("你中了特等奖\n");
else printf("你中了一等奖\n");
}
else if(max==5) printf("你中了二等奖\n");
else if(max==4) printf("你中了三等奖\n");
else if(max==3) printf("你中了四等奖\n");
else if(max==2) printf("你中了五等奖\n");
else printf("谢谢惠顾\n");
}
运行结果:
2.学生成绩管理系统:
编写一个简单的学生信息管理程序,能实现对学生信息的简单管理。具体要求为:
建立一个4个学生的信息登记表,每个学生的信息包括:学号,姓名,和3门课程的成绩(FOX,C,ENGLISH)。
程序运行时显示一个简单的菜单,例如:
(1):信息输入(INPUT)
(2):总分统计(COUNT)
(3):总分排序(SORT)
(4):查询(QUERY)
其中:
(1):对4个学生的信息进行输入;
(2):对每个学生的3门课程统计总分;
(3):对4个学生的总分按降序排序并显示出来;
(4):查询输入一个学号后,显示出该学生的有关信息;
请同学们根据实际情况再进行适当扩展。
#include "stdio.h"
#include "malloc.h"
struct student
{
long num;
char name[20];
float fox;
float c;
float english;
float sum;
struct student *next;
};
int n;
struct student *input(void){
int boolean =0;
struct student *head,*p1,*p2;
n=0;
head=p1=p2=(struct student*)malloc(sizeof(struct student));
printf("请输入学生学号: ");
scanf("%d",&p1->num);
printf("请输入学生姓名: ");
scanf("%s",p1->name);
printf("请输入学生各科成绩(FOR,C,ENGLISH): ");
scanf("%f,%f,%f",&p1->fox,&p1->c,&p1->english);
p1->sum=p1->fox+p1->c+p1->english;// COUNT;
printf("是否继续输入? 1/继续,0/结束");
scanf("%d",&boolean);
while(boolean)
{
n++;
p2=p1;
p1=(struct student*)malloc(sizeof(struct student));
printf("请输入学生学号: ");
scanf("%d",&p1->num);
printf("请输入学生姓名: ");
scanf("%s",p1->name);
printf("请输入学生各科成绩(FOR,C,ENGLISH): ");
scanf("%f,%f,%f",&p1->fox,&p1->c,&p1->english);
p1->sum=p1->fox+p1->c+p1->english;
p2->next=p1;
printf("是否继续输入? 1/继续,0/结束");
scanf("%d",&boolean);
}
p1->next=NULL;
return (head);
}
struct student *sort(struct student *head)
{
struct student *p1,*p2,*p;
int i,j,k;
k=n;
if(head!=NULL)
{
for(j=0;j<k-1;j++)
for(i=0,p=p1=head,p2=head->next; i<k-1-j&&p2!=NULL ;i++,p1=p->next,p2=p1->next)
{ if(p1->sum < p2->sum)
{ if(p==head&&i==0)
{
p1->next=p2->next;
p2->next=p1;
head=p2;
p=p2;
}
else
{
p1->next=p2->next;
p2->next=p1;
p->next=p2;
p=p2;
}
}
else p=p1;
}
return(head);
}
else
{
printf("木有人!");
return(head);
}
}
void print(struct student *head)
{ if(head!=NULL)
{
while(head!=NULL)
{
printf("%d,%s,FOR:%f,C:%f,English:%f,Sum:%f\n",head->num,head->name,head->fox,head->c,head->english,head->sum);
head=head->next;
}
}
else printf("没有人!");
}
void query(struct student *head)
{
int k;
printf("请输入要找的学号:\n");
scanf("%d",&k);
if(head!=NULL)
{
while(head!=NULL)
{
if(head->num==k)
{
printf("%d,%s,FOR:%f,C:%f,English:%f,Sum:%f\n",head->num,head->name,head->fox,head->c,head->english,head->sum);
return ;
}
head=head->next;
}
printf("你找谁啊?");
}
else printf("没有人!");
}
void main()
{ int boolean = 1;
struct student *p;
while(boolean)
{
printf(" 请选择:\n(1):信息输入(INPUT)\n(2):总分统计(COUNT)\n(3):总分排序(SORT)\n(4):查询(QUERY)\n(0):结束(end)\n");
scanf("%d",&boolean);
if(boolean==1)
{
p=input();
continue;
}
else if(boolean==2)
{
print(p);
}
else if(boolean==3)
{
print(sort(p));
}
else if(boolean==4)
{
query(p);
}
}
}
设计思路:通过建立链表,再通过调用函数。
调试情况:反复输入数据,进行调试,在算法上出现多处错误。
运行结果: