C语言实验报告
实验1-1:
hello world程序: 源代码:
#include
printf(\ system(\ }
实验1-2:
完成3个数据的输入、求和并输出计算结果的程序: 源代码:
#include
int i,j,k,sum;
scanf(\ sum=i+j+k;
printf(\ system(\
实验1-3:
在屏幕上输出如下图形:
A
BBB CCCCC 源代码:
#include
printf(\ A\\n\ printf(\ BBB\\n\ printf(\ system(\ }
实验2-1:
计算由键盘输入的任何两个双精度数据的平均值 源代码:
#include
main() {
double a,b;
scanf(\ printf(\ system(\ }
实验2-2:
写一个输入7个数据的程序,把输入的数据代入a + b * (c – d ) / e * f – g 表达式进行运算 源代码:
#include
float a,b,c,d,e,f,g,x;
scanf(\ x=a + b * (c - d ) / e * f - g; printf(\ system(\ }
实验2-3:
编写一个C语言程序,测试下列各表达式: i, j
i + 1 , j + 1 i++ , j++ ++i , ++j i+++++j
源代码:
#include
int i=1,j=1;
printf(\ printf(\ printf(\ printf(\ system(\ }
实验2-4:
输入存款金额money,存期year和年利率rate,根据下列公式计算存款到期时的利息interest(税前),输出时保留2位小数。
interest = money(1+rate)year - money
源代码:
#include
int year=2;
float rate=0.1,money=1000; float futureMoney;
futureMoney=money*pow((1+rate),year); printf(\ system(\ }
实验2-5:
输入华氏温度,输出对应的摄氏温度。计算公式如下: c = 5 * ( f - 32) / 9
其中,c表示摄氏温度,f表示华氏温度
源代码:
#include
int c,f;
scanf(\ c = 5 * ( f - 32) / 9; printf(\ system(\}
实验3-1:
编写一个程序完成输入一个整数,输出它的符号 源代码:
#include
int i;
scanf(\ if(i>0) printf(\ else
printf(\
system(\ }
实验3-2:
请编写居民应交水费,并提供各种测试数据。
居民应交水费y(元)与月用水量x(吨)的函数关系式如下: 0 x < 0 y = f(x) = 4x / 3 0 ≤ x ≤ 15 2.5x – 10.5 x > 15
源代码:
#include
float x,y;
scanf(\ if(x<0) printf(\
else if(x>=0&&x<=15) { y=4*x/3; printf(\ }
else if(x>15) { y=2.5*x-10.5; printf(\ }
system(\}
实验3-3:
请根据输入的学生成绩给出成绩等级的判断,判断规则如下: 如果输入的成绩大于等于90,则输出优秀;
如果输入的成绩小于90、大于等于80,则输出良好; 如果输入的成绩小于80、大于等于70,则输出中等; 如果输入的成绩小于70、大于等于60,则输出及格; 其他输出不及格
源代码:
#include
int x;
scanf(\ if (x>=90)
printf(\优秀\\n\
else if (x>=80&&x<90) printf(\良好\\n\
else if (x>=70&&x<80) printf(\中等\\n\
else if (x>=60&&x<70) printf(\及格\\n\ else
printf(\不及格\\n\ system(\}
实验3-4:
运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s = 250km 没有折扣 250km ≤ s < 500km 2%折扣 500km ≤ s < 1000km 5%折扣 1000km ≤ s < 2000km 8%折扣 2000km ≤ s < 3000km 10%折扣 3000km ≤ s 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:
f = p * w * s * ( 1 – d )
请编程实现:从键盘输入基本运费p,货物重w,距离s,计算输出用户最终需要支付的运费
源代码:
#include
int p,w,s,f;
scanf(\ float d;
f = p * w * s * ( 1 - d ); if (s=250) { d==0; printf(\ }
else if (s>=250&&s<500) { d==0.02; printf(\ }
else if (s>=500&&s<1000) { d==0.05;
printf(\ }
else if (s>=1000&&s<2000) { d==0.08; printf(\ }
else if (s>=2000&&s<3000) { d==0.1; printf(\ }
else if (s>=3000) { d==0.15; printf(\ }
system(\}
实验4-1:
已知xyz + yzz = 532,其中x、y、z都是数字(0~9),编写一个程序求出x、y、z分别代表什么数字
源代码:
#include
int x,y,z;
for(x=1;x<=9;x++) for(y=1;y<=9;y++) for(z=1;z<=9;z++)
if(100*x+10*y+z+100*y+10*z+z==532) printf(\ system(\ }
实验4-2:
编写一个程序打印如下对称图形(行数由键盘输入1~9范围的值),例如下面是输入的数字4时的情形:
4444444 33333 222 1 222
33333 4444444
源代码:
#include
int i,j,k,n;
printf(\请输入一个数字\\n\ scanf(\ i=n;
for(i=0;i<2*n-1;i++) {
k=i;
if(i>=n) k=2*n-2-i; for(j=0;j for(j=0;j<2*(n-k)-1;j++) printf(\ printf(\ } system(\} 实验4-3: 学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数 源代码: #include int i; for(i=900;i<=1100;i++) { if(i%5==2&&i%7==3&&i%3==1) { printf(\ break; } } system(\ } 实验4-4: 学校某班A、B、C、D四位同学中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做了好事,四位回答如下: A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知三个人说的是真话,一个人说的是假话。请根据这些信息,找出做了好事的人 源代码: #include int i,j,a,b,c,d; for(i=0;i<=4;i++) { for(j=0;j<=4;j++) if(j==i) switch(j) { case 0:a=1;b=0;c=0;d=0; break; case 1:a=0;b=1;c=0;d=0; break; case 2:a=0;b=0;c=1;d=0; break; case 3:a=0;b=0;c=0;d=1; break; default:break; } if(a+b+c==1&&b+c==1&&c+d==1&&b+c+d==1) printf(\做好事的人是%c\\n\ } system(\ } 实验5-1: 从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移到数组的后端,等于零的元素留在数组中间。比如原来数组为:2 -5 -89 75 0 -89 0 93 48 0,经过处理后的数组为:-5 -89 -89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法 源代码: #include #define N 10 main() { int a[N]={2,-5,-89,75,0,-89,0,93,48,0}; int i,t,j; for(i=0;i for(i=0;i system(\} 实验5-2: 设数组a的定义如下: int a[20] = {2,4,6,8,10,12,14,16}; 已存入数组中的数据值已经按由小到大的顺序存放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能 源代码: #include int a[9]={2,4,6,8,10,12,14,16}; int i,j,number; printf(\原数组\\n\ for(i=0;i<=8;i++)//输出数组原有的元素 printf(\ printf(\ printf(\请输入一个数据\\n\ scanf(\ i=0;//以下三行找到插入位置 while(a[i] for(j=7;j>=i;j--)//将插入点以后的元素顺序往后移一位 a[j+1]=a[j]; a[i]=number;//插入数据 printf(\输出改变后的数组\\n\ for(i=0;i<=8;i++)//输出插入后仍有序的数组 printf(\ system(\ } 实验5-3: 写一个3 x 5矩阵的转置程序,输出其原矩阵的值和转置以后的结果 源代码: #include int i,j; int a[3][5]={1,2,3,4,5,6,7,8,9,4,5,6,7,8,9}; for(i=0;i<3;i++){ for(j=0;j<5;j++) printf(\ printf(\ } printf(\转置后的矩阵为\\n\ for(i=0;i<5;i++){ for(j=0;j<3;j++) printf(\ printf(\ } system(\} 实验5-4: 编程实现随机产生10个位于区间[100 200]互不相等的整数,并将其按降序排序和输出 源代码: #include #define random(x)(rand()1+100) main() { int i,j,k,n;//产生随机数 int a[10]; srand((int)time(0)); for(i=0;i<=9;i++){ a[i]=random(200); printf(\ } printf(\ for(i=0;i<=9;i++){//排序 k=i; for(j=i;j<10;j++) if(a[k] printf(\排序后的数组为\\n\ for(i=0;i<10;i++) printf(\ system(\ } 实验6-1: 写一个函数int digit( int n , int k ),它返回数n的从右向左的第k个十进数字值。例如,函数调用digit(1234,2)将返回值3 源代码: #include { int i,j,a,b; b=n; a=(n/10); j=(n/100); i=(n/1000); n=1000*i+100*j+10*a+b; if(k==1) printf(\ else if(k==2) printf(\ else if(k==3) printf(\ else if(k==4) printf(\ } main() { int x,y; printf(\请输入一个数据\\n\ scanf(\ digit(x,y); system(\ } 实验6-2: 写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值 源代码: #include int i; for(i=2;i return (1); } } main() { int x; printf(\请输入一个数据\\n\ scanf(\ printf(\ system(\ } 实验6-3: 写一个函数reverse( char s[]),将字符串s[]中的字符串倒序输出。试分别用递归和非递归两种形式编写 源代码: 递归: #include void res(char s[],int len) { if(len>=0) { printf(\ len--; res(s,len); getchar(); } } void reverse(char b[]) { res(b,strlen(b)); } void main() { char a[100]; gets(a); reverse(a); system(\} 源代码: 非递归: #include void reverse(char s[]); void main() { char s[100]; gets(s); reverse(s); } void reverse(char s[]) //非递归调用的reverse函数 { int j,i=0; do { i++; }while(s[i]!='\\0'); for(j=i-1;j>=0;j--) printf(\ printf(\ system(\} 实验6-4: 写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性 源代码: #include if(a>b) return a; if(a main() { int a,b; scanf(\ printf(\} 实验6-5: 一个数如果从左到右和从右到左读,数字是相同的,则称这个数字为回文数,比如898、1221、15651都是回文数。求:既是回文数又是质数的5位十进制数有多少个?要求:回文判断和 质数判断都需要通过子函数实现,输出的时候要求5个数字一行 源代码: #include\int hw(int n) { int a[5],i,k=n,j; for(i=2;i int main() { int i,s,j=0; for(i=10000;i<=99999;i++) { s=hw(i); if(s) { printf(\ j++; if(j%5==0) printf(\ } } getchar(); system(\} 实验6-6: 在n个已排好序(设为从小到大)的数据(数或字符串)中查找某一个数据,如果找到了,就指出其在n个数中的位置;否则给出无该数据的信息。请用递归的方法实现二分查找来实 现这一查找过程 源代码: #include\ void found(int s[],int max,int min,int l) { int mid; mid=(max+min)/2; if(mid>max||mid int main() { int a[100],i,n; for(i=0;i<10;i++) scanf(\ scanf(\ found(a,9,0,n); system(\ } 实验7-1: 编写一个函数char *delk( char *sp),把sp所指向的字符串中所有的“$”字符删除,并把处理后的字符串指针返回 源代码: #include #include void delchar(char *s,char c) { char s2[50]; int i,j; for(i=0,j=0;s[i]!='\\0';i++){ if(s[i]!=c){ s2[j]=s[i]; j++; } } s2[j]='\\0'; for(i=0;s2[i]!='\\0';i++){ s[i]=s2[i]; } s[i]=\ } int main() { char str[20]=\ delchar (str,'c'); puts(str); system(\ } 实验7-2: 写一个函数int find( char *s1, char *s2),函数find的功能是查找串s1中是否包含指定的词(s2指向),如果存在则返回第1次出现的位置,否则返回-1.约定串中的词由1个或1个以上的空格符分隔。 源代码: #include int find(char *s1,char *s2) { int i=0,j=0; char *p=s2; for(;s1!='\\0';s1++,i++) { if(*s1!=*s2) { s2=p; j=0; } if(*s1==*s2) { j++; s2++; if(*s2=='\\0') { return i-j+2; } } } return -1; } int main() { char *s1=\ printf(\ printf(\ } 实验7-3: 编程实现将输入的十进制整数n通过函数DtoH转换为十六进制数,并将转换结果以字符形式输出。例如:输入十进制数79,将输出十六进制数4f 源代码: #include int i=0; while(n!=0){ int bit=n; a[i]=bit; i++; n=n/16; } return i; } int main() { int x; printf(\ scanf(\ int a[10]={0}; int nbits=DtoH(x,a); int i; printf(\转换后的数为\\n\ for(i=nbits-1;i>=0;i--){ if(a[i]>9) printf(\ else printf(\ } printf(\ system(\ } 实验7-4: 定义函数void Merge(int a[], int n, int b[], int m),参数a、b为一维数组,数组中的数据为升序排列,n和m分别为它们的元素个数。函数的功能为:将数组a和b合并为一个数组,合并后的结果存放于数组a中,要求合并后的数组a仍旧为升序排列。请编程实现,并编写main函数对其测试。 源代码: #include void Merge(int a[],int n,int b[],int m) { int *p,*q,i,j,k; p=a; q=b; for(i=0;i<10;i++) { if(i>0&&*(p+i)<*(p+i-1)) { *(p+i)=*q; q++; } } for(i=0;i<10;i++) for(j=i+1;j<10;j++) if(*(p+i)>*(p+j)) { k=*(p+i); *(p+i)=*(p+j); *(p+j)=k; } } main() { int a[10]={2,3,5,7,9},b[5]={1,4,6,8,10}; int i; Merge(a,10,b,5); for(i=0;i<10;i++) printf(\ } 实验8-1: 编写一个书名排序程序,输入10个书名存入一个二维数组,用函数void sortstring( char *name[] , int n)实现它们的字典顺序。 源代码: #include #include void sortstring(char *name[],int n) { char *p; int i,j; for(i=0;i main() { char *name[]={\ \ int a; sortstring(name,10); for(a=0;a<10;a++) printf(\ } 实验8-2: 编写函数void search( char *s1, char *s2, char *s3)。函数search()从已知的两个字符串s1与s2中找出它们都包含的最长的单词放入字符串s3,约定字符串中只有小写字母和空格字符,单词用1个或1个以上空格分隔 源代码: #include void search(char *s1, char *s2, char *s3) { char *p; int word,i,m,n; char a[20]; p=s1; s3[0]='\\0'; while (*p!='\\0') { word=0; for (i=0;p[i]!='\\0';i++)//记录单词的长度i { if (p[i]!=' '&&word==0) { word=1; m=i; } else if (p[i]==' '&&word==1) { n=i; break; } } if (p[i]=='\\0'&&word==1) n=i; if (word==1) {//将单词复制到atemp中 strncpy(a,p+m,n-m); a[n-m]='\\0'; //puts(s3); char *pfind;// strstr:找出atemp字符串在s2字符串中第一次出现的位置。 if ( (pfind=strstr(s2,a))!=NULL ) { // finded // 只是找到包含,如果完全一致,应该将找到对应的单词取出来再比较 if ( *(pfind+strlen(a))==' ' || *(pfind+strlen(a))=='\\0' ) if (strlen(a)>strlen(s3)) strcpy(s3,a); } p=p+n; } else break; } } main() { char *s1=\char *s2=\ char s3[20]; search(s1,s2,s3); printf(\} 实验8-3: 编写一个主函数,测试上述两个函数的正确性。 结果如上两题所示。 实验8-4: 输入一个字符串,内有数字和非数字字符,例如: A123cdf 456.78cpc876.9er 849.1 将其中连续的数字作为一个实数,依次存放到一数组a中。例如123存放在a[0],456.78存放在a[2],依次类推,统计共有多少个数,并输出这些数。 源代码: #include void f(char *sp,float b[]) { char *p; float value; int power,i=0,j=0; p=sp; while(*p) { for(;!(*p>='0'&&*p<='9');p++) value=0; for(value=0;(*p>='0'&&*p<='9');p++,i++) value=value*10+*p-'0'; if(*p=='.') p++; for(power=1;(*p>='0'&&*p<='9');p++,i++) { value=value*10+*p-'0'; power=power*10; } value=value/power; b[j++]=value; } printf(\数字个数为:%d\\n\} void main() { int j; float b[4]={0}; char *a=\ f(a,b); for(j=0;j<4;j++) printf(\} 实验9-1: 编写一个建立单链表的函数,设链表的表元素信息包含学号、姓名、一门课的成绩;写一个按照学号查学生成绩的函数;最后写一个主函数,它先调用建立函数,再调用查询函数,显示查到学生的姓名和成绩。 源代码: #include }stu[4]={{1,\main() { int i,j; printf(\请输入学号:\\n\ scanf(\ for(j=0;j<4;j++) if(stu[j].num==i) printf(\} 实验9-2: 编一程序,能把从终端输入的一个字符串中的小写字母全部转换成大写字母,要求输入的字符的同时指定该字符在字符串中的序号(即字符在字符串中的顺序号,例如第1个字符的序号为1),字符和序号存入结构体中,字符串存入结构体数组中,然后显示结构体数组的结 果(用字符!表示输入字符串的结束)。 源代码: #include 实验9-3: 在本实验的实验内容1的基础上,实现在链表元素index之前插入元素的操作Insert( struct node *head, int index)和删除指定位置元素的操作Delete( struct node * head, int index),并编写主函数测试。 源代码: #include char name[15]; char num[15]; char risk[15]; struct student *next; }; struct student * fun() { struct student *p,*q,*head; q=head=NULL; char str[15]={'\\0'}; printf(\请依次输入学生的姓名,学号,成绩:(以'0'作为结束标志)\\n\ while(1) { scanf(\ if(str[0]=='0') break; p=(struct student *)malloc(sizeof(struct student)); strcpy(p->name,str); scanf(\ scanf(\ if(head==NULL) head=q=p; else { q->next=p; q=p; } } q->next=NULL; return head; } struct student * park(struct student *head) { int i; char str[15]; struct student *p,*q; printf(\你想要删除某个学生的信息吗?是/否(1/0)\\n\ scanf(\ if(!i) return head; printf(\请输入你想要删除的学生姓名\\n\ scanf(\ for(p=head,q=NULL;p!=NULL;q=p,p=p->next) if(!strcmp(p->name,str)) break; if(p==NULL) { printf(\没有你要删除的学生的信息\\n\ return head; } else { if(q==NULL) head=p->next; else { q->next=p->next; } free(p); } return head; } struct student *wall(struct student *head) { int i,j,k=1; struct student *p,*q,*r; printf(\你想要添加某个学生的信息吗?是/否(1/0)\\n\ scanf(\ if(!i) return head; printf(\请输入你想要添加的学生的信息:(依次为:姓名,学号,成绩)\\n\ p=(struct student *)malloc(sizeof(struct student)); scanf(\ scanf(\ scanf(\ printf(\请输入你想要添加到的位置\\n\ scanf(\ for(q=head,r=NULL;q!=NULL;r=q,q=q->next) { if(j==1) { p->next=head; head=p; break; } if(k==j) { p->next=q; r->next=p; break; } k++; } if(q==NULL&&j==k) { q=p; p->next=NULL; } if(q==NULL&&j>k) printf(\你的添加的位置不合法\\n\ return head; } void prin(struct student *head) { struct student *p; for(p=head;p!=NULL;p=p->next) { printf(\ printf(\ printf(\ printf(\ } } main() { struct student *head; head=fun(); head=wall(head); head=park(head); prin(head); } 实验10-1: 编写一个程序,读取磁盘上的一个C语言程序文件,要求加上注释后再存放到磁盘上,文件可以另外命名。 源代码: #include } fscanf(p,\fclose(p); if((p=fopen(\{ printf(\ exit(1); } fputs(\fprintf(p,a); fputs(\fclose(p); 实验10-2: 编写一个程序,将文件old.txt从第10行起存放到new.txt中。 源代码: #include int i=0; char c; FILE *p1,*p2; if((p1=fopen(\ { printf(\ exit(1); } if((p2=fopen(\ { printf(\ exit(1); } while(!feof(p1)) { if((c=fgetc(p1))=='\\n') i++; if(i>=9) { fputc(c,p2); } } system(\ fclose(p1); fclose(p2); } 实验10-3: 有一个整数文件,读取其中的数值,如果为奇数加1,如果为偶数减1,然后存放到新的文件中去。 源代码: #include int i=0; char c; FILE *p1; if((p1=fopen(\ { printf(\ exit(1); } while(!feof(p1)) { c=fgetc(p1); if((c-'0')%2==0) i--; else if((c-'0')%2==1) i++; } fclose(p1); printf(\} 实验10-4: 二进制文件d.dat中包含若干个整数,用键盘输入一个整数,请在文件中找出该整数的下一个数并输出。若找不到则输出“Not Found!”。 源代码: #include int i=0; int a[8]={3,4,6,8,7,1,2,9}; pf = fopen(\ if( pf==NULL ){ printf(\ } else{ fwrite((char *)a,sizeof(int),8,pf); fclose(pf); } if((pf=fopen(\ printf(\ } else{ scanf(\ while(!feof(pf)){ fread((char*)&y,sizeof(int),1,pf); i++; if(y==x) break; } fread((char*)&y,sizeof(int),1,pf); if(!feof(pf)){ printf(\在第%d个,下一个数字为%d\\n\ } else{ printf(\ } fclose(pf); } }