




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(此文档为word格式,下载后您可任意编辑修改!)C语言程序设计实验实验报告指导老师: 专业: 班级: 学号: 姓名: 日期: 重庆邮电大学计算机科学与技术学院实验一实验名称:一维数组程序设计实验目的:1、 熟练掌握使用一维数组编程的方法。2、 熟练掌握排序算法。实验内容:1、 调试示例输入一个整数n(0n9)和一组数,再输入一个整数,把x插入到这个数据中,使该组数据仍然有序。源程序:略调试好的程序:#includeint main()int i,j,n,x,a10;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;in;i+)scanf(%d,&ai);printf(输入要插入的整数:);scanf(%d,&x);for(i=0;iai)continue;j=n-1;while(j=i)aj+1=aj;j-;ai=x;break;if(i=n)an=x;for(i=0;i=n;i+)printf(%dt,ai);return 0;2、 编程题1输入一个正整数n(0n=10),再输入n个整数,输出平均值(保留两位小数)。程序代码:#includeint main()int i,n,sum=0,a10;float av;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;in;i+)sum+=ai;av=(float)sum/n;printf(%0.2ft,av);return 0;3、 编程题2输入一个正整数n(0n=10),再输入n个整数,按逆序输出这些数。程序代码#includeint main()int i,n,a10;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;i=0;i-)printf(%dt,ai);return 0;4、 编程题3输入一个正整数n(0n=10),再输入n个整数,输出最大值及其下标(设最大值唯一,下标从零开始)。程序代码:#includeint main()int i,j,n,x,a10;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;in;i+)scanf(%d,&ai);x=a0;for(i=0;ix)x=ai;j=i;printf(最大数:%dt下标:%dt,x,j);return 0;5、 编程题4输入一个正整数n(0n=10),再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。程序代码:#includeint main()int i,n,j=0,k=0,x,y,a10;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;in;i+)scanf(%d,&ai);y=a0;x=a0;for(i=0;ix)x=ai;j=i;if(aiy)y=ai;k=i;aj=a0;a0=y;ak=ai-1;ai-1=x;for(i=0;in;i+)printf(%dt,ai);return 0;6、 编程题5输入一个正整数n(0n=10),再输入n个整数,再将它们从小到大排序后输出。程序代码:#includeint main()int i,n,j=0,x,a10;printf(输入数据的个数n:);scanf(%d,&n);printf(输入%d个整数:,n);for(i=0;in;i+)scanf(%d,&ai);x=a0;for(i=0;in-1;i+)for(j=i;jaj+1)x=ai;ai=aj+1;aj+1=x;else continue;for(i=0;in;i+)printf(%dt,ai);return 0;实验总结:本次C语言上机实验,主要是对一维整数数组进行处理,通过本次实验,我熟练掌握了一维数组元素的处理组排序算法(冒泡排序法和选择排序法)。实验二实验名称:字符串程序设计 【实验1】判断回文 从键盘输入一串字符,判断该字符串是否是回文,即该字符串从左向右读,与从右向左读都一样,如“ABCBA”、“ABCCBA”。编程思路:定义指针start和end,分别指向字符串首、尾。分别从串首、尾开始向中间比较,若指针所指字符不同,则不是回文。源程序: #include#includeint is(char*ptr);void main()char str100;printf(input a stringn);gets(str);if(is(str)printf(%s is a Palindromen,str);elseprintf(%s is a not palindromen,str);int is(char*ptr)int i,a,flag=0;a=(int)strlen(ptr)-1;/数组下标从0开始!for(i=0;a=0;i+,a-)if(ptra=ptri)flag=1;elseflag=0;break;return flag;【实验2】删除排序已知某已排好序的数组,其元素为1,3,5,7,9,从键盘输入x的值,若数组中存在与x相等的元素,则删除。编程思路:搜索整个数组判断x是否存在于数组中;如果在,定位待删除元素的下标 ;从该下标开始,将所有后续元素往前移。注意移动顺序应从最后一个元素开始,还是先从待删除元素的位置开始! 源程序:#include#includeint *Delete(int a,int n,int x)int i,pos,k;for(i=0;in;i+)if(ai=x)pos=i; break; for(k=pos;kn-1;k+)ak=ak+1;return a;int main()int arr5= ,x,i;printf(input x= );scanf(%d,&x);printf(before delete);for(i=0;i5;i+)printf(%4d,arri);printf(n);Delete(arr,5,x);printf(after delete);for(i=0;i4;i+)printf(%4d,arri);printf(n);return 0;实验总结:通过这次实验,了解了字符串的特点,它在数组中有结束标志“0”,而其长度又不将起算在内,牢记这点对编程速率很有帮助。实验三实验名称:指针和二维数组【实验1】对N个字符串进行排序编程思路:第一种实现方式:要求从键盘输入N个字符串,将其存储在二维数组中,在主函数中进行排序。第二种实现方式:要求定义指针数组指向N个字符串,调用函数sort()进行排序。sort()具有如下原型:/*函数返回值:多级指针类型char*,返回指针数组首地址形式参数:指针p,char *,用于操纵N个字符串line,int,表示字符串个数*/char * sort(char * p,int linel)源程序:#include #include #define N 5int main() /*定义二维数组*/int i,k,j;char aN30,temp20; /*从键盘输入N 个字符串*/ printf(从键盘输入%d个字符串n,N);for(i = 0;i N;i+)gets(ai); for(i=0;iN-1;i+) k = i; /*若当前字符串大于 strk,记录其下标*/ for(j=i+1;jN;j+)if(strcmp(ak,aj)0)/ai改为akk=j; if(k!=i) /*交换字符串 strk和 stri*/ strcpy(temp,ai);strcpy(ai,ak);strcpy(ak,temp); puts(nAfter sort:); for( i = 0;i N;i+) puts(ai); return 0; 【实验2】找众数定义函数实现: (1)输出整数数组中重复出现的数和重复的次数。(2)找出整数数组中的众数(即出现次数最多的数) 并编写相应的主函数测试之。编程思路:先对数组排序,排序后数组内的元素如有相同值就会紧邻存储。 定义maxCount、maxI、seek,分别表示最多重复次数、最多重复次数对应的元素下标、当前正在查找的数值,将两数置0。从头扫描整个数组,统计每个元素出现的次数,如果出现次数大于maxCount,记录其出现次数和该元素对应下标。扫描完毕即可找到众数及其出现次数。源程序:#include #include #define N 6 int main() int aN; int i,j,k,temp; int maxCount = 0,maxI = 0,seek = 0,count = 0; for(i = 0;i N ;i+) printf(请输入第%d 个数:,i + 1); scanf(%d,a + i); /*选择法对数组排序*/ for(i=0;iN-1;i+) k=i; for(j=i;jaj)/ai改为ak k=j; if(i!=k) temp=ai;ai=ak;ak=temp; for(i = 0,seek = a0;i maxCount)maxCount=count;maxI=i-1; count = 0; count+; seek = ai; printf(nmaxNumber = %d,maxCount = %dn,amaxI,maxCount); return 0; 实验总结:本次实验运用了选择法对数组进行排序,不管是二维数组,还是一维数组,其思路是一样的,只是具体的实现有所不同,比如比较字符串要用函数strcmp()。实验四实验名称:结构体【实验1】计算椭圆面积 已知坐标系统中两点p1、p2构成的矩形是椭圆的外切矩形,如图3-1所示。定义结构体struct ellipse struct point int x; int y; p1,p2; double a ; double b ; ; 从键盘输入p1、p2的坐标值,计算椭圆面积,已知积计算公式为:S = ab。程序代码:#include #include struct ellipsestruct pointint x;int y;p1,p2;double a ;double b ;typedef struct ellipse ell;int main()ell e;double s;printf(请输入左上角顶点坐标:);/*输入坐标*/scanf(%d%d,&e.p1.x,&e.p1 .y);printf(请输入右下角顶点坐标:);/*输入坐标*/scanf(%d%d,&e.p2.x,&e.p2.y);/*计算椭圆面积*/e.a=abs(e.p1 .y-e.p2 .y)/2.0;/取整函数abs()e.b=abs(e.p1 .x-e.p2 .x)/2.0;s=3.14*e.a*e.b;printf(area = %lfn,s);return 0;实验总结:这次实验用到了结构体的嵌套定义,通过实验,让我更深入了解结构体的定义,使用,访问等操作。实验五实验名称:指针强化1【实验1】字符串逆序存储编写一个函数inverse,实现将字符串逆序存放,即原字符串为“abcdef”,将其重新存储为“fedcba”。实验思路:从字符串中第一个字符开始,使其和最后一个字符交换,第二个字符和倒数第二个字符交换,一直到字符串中间的字符为止。 程序代码:#include #include char * inverse(char *p)/*定义需要用到的变量*/int i,len;char tmp;len = strlen(p);/*将原字符串逆序存储于p所指数组中*/for(i=len-1;i=len/2;i-)tmp=*(p+i);*(p+i)=*(p+len-1-i);*(p+len-1-i)=tmp;return p;int main()char str100;printf(请输入字符串:);gets(str);puts(inverse(str);return 0;【实验2】字符串逆序存储删除字符串s中所有出现的与变量c相同的字符。程序代码:#include #include char * squeez(char *s,char c)int i,j;for(i = j = 0;istrlen(s);i+)/_请填空_if(si != c) sj=si;/_请填空_j+;sj = 0;return s;int main()char s100,c;printf(请输入字符串:);gets(s);printf(请输入变量:);c = getchar();puts(squeez(s,c);return 0;实验总结:这次与前面的某次实验的内容差不多,用到了知识点是指针,字符串。实验六实验名称:指针强化2【实验1】实现库函数atoi已知C标准库函数atoi实现将字符串转换为整数的功能,如: char str = 123456; printf(对应的整数为:%dn,atoi(str); 自定义函数:int atoi(char *str),使其实现同名标准库函数的功能。实验思路:先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。定义变量sign,若字符串中第一个元素是,则sign值为-1,并让字符串指针指向下一元素。指针指向字符串“”的第一个数字字符1,将其转换为对应数字1,放入变量t中,指针下移至后一元素2,再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。返回变量t*sign即可。程序代码:#include#includeint atoi(char *str);int main() char str100; printf(请输入字符串:); gets(str); /此处不能否替换成 scanf()! printf(对应的整数为:%dn,atoi(str); return 0; int atoi(char*str)int i=0,a,s=0,sign=0,p=1;for(i=0;*(str+i)!=0&p;i+)if(*(str+i)=-&(*(str+i+1)=48&*(str+i+1)=48&*(str+i)=57)a=*(str+i)-48;s=s*10+a;if(*(str+i+1)=57&p)p=0;if(sign)s*=sign;return s;【实验2】译码编写change函数实现:将大于0小于1000的阿拉伯数字转换为罗马数字输出。阿拉伯数字和罗马数字对应关系如下: 并编写相应的主函数测试该函数。实验思路:先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。定义变量sign,若字符串中第一个元素是,则sign值为-1,并让字符串指针指向下一元素。指针指向字符串“”的第一个数字字符1,将其转换为对应数字1,放入变量t中,指针下移至后一元素2,再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。返回变量t*sign即可。程序代码:#include/*定义数据结构code 存储罗马字符*/ typedef struct char s3;/别忘了0int a;COD;int change(COD *code,int num);int main() COD code13=M,1000,CM,900,D,500,CD,400,C,100,XC,90,L,50,XL,40,X,10,IX,9,V,5,IV,4,I,1; int x; printf(请输入一个阿拉伯数字:); scanf(%d,&x); if(x0&x4000)change(code,x); else printf(输入的阿拉伯数字超出范围!n); return 0; int change(COD *code,int num)int i,a,last=0;while(num)a=num/(*(code+last).a;if(a=0)last+;elsefor(i=0;ia;i+)printf(%s,(*(code+last).s);num%=(*(code+last).a;/有点类似进制型问题putchar(10);return 0;实验总结:这次实验译码实验给我的印象比较深,开始在算法上有点纠结,后来想到了以上程序中的算法,其实是个逐减和取余的问题,另外还用到了结构体,指针等知识,综合性还是比较大的。但算法是面向过程程序设计的灵魂,想到算法就好办了。实验七实验名称:模拟1简单题:计算卡片的最大数量将一摞卡片按照图1所示叠放,使其中一部分悬于桌外(卡片数量为n,每张卡片长度为1)。当n=1时,仅有一张卡片,其最大可悬空长度为1/2;当n=2时, 置于底部的那张卡片其悬空长度是1/3,而置于顶部的卡片其悬空长度是1/2,故悬于桌外的总长度是1/2 + 1/3 = 5/6。可以推断,当有n张卡片时,悬空部分的总长度是:1/2 + 1/3 + 1/4 + . + 1/(n + 1)。从键盘输入一个最大悬空长度值,判断该长度下最多能叠放几张卡片。图1 卡片最大可悬空长度示意图程序代码:#includeint main() int i,maxl;float l,sum=0;printf(input length:n);scanf(%f,&l);for(i=1;suml;i+)sum+=(floata)1/(i+1);maxl=i;printf(最多能放%d张。n,maxl);return 0; 高难度题:图书管理(可选用结构体数组或链表完成)图书馆的书对应的数据类型定义如下:struct book Char name_of_book100; Char author25; ; 编写函数实现: (1)统计某一作者编写了几本书。(2)将所有书的记录存储到文件a.txt。然后编写相应的主函数调用这两个函数。程序代码:#include#include#includetypedef struct bookchar book_name50, author20;struct book *next;BOOK;/*输入链表单元内容*/void input(BOOK *p)printf(book name:n);scanf(%s,p-book_name);printf(please input the author name:n);scanf(%s,p-author); /*创建一个链表单元*/BOOK *creat_node()BOOK *p;p=(BOOK *)malloc(sizeof(BOOK);if(p = NULL) printf(No enough memory !);exit(0);input(p);p-next=NULL;return p;/*创建一个链表*/BOOK *creat_list()BOOK *head=NULL,*tail=NULL,*p;char str4;printf(List creating.n);doprintf(Do you want to continue (yes/no) :);scanf(%s,str);if(strcmp(str,yes)=0)p=creat_node();if(head=NULL)head=tail=p;continue;tail-next=p;tail=p;if(strcmp(str,yes)!=0&strcmp(str,no)!=0)printf(You must input yes or no.n);/getchar();continue;if(strcmp(str,no)=0)break;/getchar();while(1);printf(List create end.nn);return head;/*输出一个链表头部*/void print_a_head()printf(bname authorn);/*输出链表*/int print_list(BOOK *book)BOOK *p=book;if(book=NULL)printf(no records!n);return (0);print_a_head();while(p!=NULL)printf(%s;t%s;n,book-book_name,book-author);p=p-next;putchar(10);return (0);/*查找统计链表name*/int count(BOOK *book,char name)int count=0;BOOK *p=book;while(p!=NULL)if(strcmp(p-author,name)=0)count+;p=p-next;return count;/*输入外部*/int output(BOOK *book)FILE *fp;BOOK *p=book;if(fp=fopen(a.txt,w)=NULL)printf(can not open!);return -1;while(p!=NULL)fputs(p-book_name,fp);fputc(32,fp);fputs(p-author,fp);fputc(10,fp);p=p-next;return 0;int main() char name20;BOOK *book;book=creat_list();/print_list(book);printf(输入某作者的名字:n);scanf(%s,name);printf(%s写的的书数:%dn,name,count(book,name);output(book);return 0; 实验总结:这次试验的第一题算法上想得到的话能很开做出来。“图书管理(可选用结构体数组或链表完成)”这题用到的知识点比较多,综合性也比较大,和我们之前布置的一道作业题目很相似,我用了动态链表+文件做这道题,算法上基本没什么难度,就是工作量比较大,做出来的代码也很长,这样编程的速率就很重要了,要求编程者各方面的能力都必须过硬,比如打字、对知识点的熟练程度、编程调试技巧等。实验八实验名称:文件【实验1】抓交通肇事犯(复习循环)一辆卡车交通肇事后逃逸。现场有三人目击事件,但是都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位车号组成的数字刚好是一个整数的平方。请根据以上线索求出车号的四位数字。程序代码:#include #include int main()int i,j,k,num;for(i=0;i=9;i+)for(j=0;j=9;j+)if(i=j) continue;num=1100*i+11*j;for(k=0;k=(int)sqrt(num);k+)if(num=k*k)printf(The number is: %6dn,num);【实验2】写入数据至文件 从键盘输入一个字符串,将其中的小写字母全部转换为大写字母,然后输出到磁盘文件“test”中保存。输入的字符串以“!”结束。程序代码:#include #include void PutToFile(char *FileName); void ReadFromFile(char *FileName); void PutToFile(char *FileName) char ch; FILE *fp = fopen(FileName,w); if(fp = NULL) printf(打开文件失败!n); exit(EXIT_FAILURE); printf(请输入数据:); while(ch=getchar()!=!) /*当前输入字符不是!*/ if(ch96&chx和p-y赋值,再将该节点连接到head指针所指链表尾部(具体办法见8-0)。定义函数void DestroyLink(pt * head)实现链表的销毁。具体办法是:让指针p指向头指针head所指的第一个节点,此时p所指节点即为本次循环要销毁的当前节点,然后让头指针指向下一个节点,即head = head -next,最后free(p)。这样就销毁了一个节点。利用循环即可按此方法消除所有节点。定义函数void PrintLink(pt * head)实现链表的打印。具体办法是:用p遍历整个链表所有节点,每遍历一个节点,即打印当前节点的横纵坐标,直到p指向链表的最后一个节点。定义函数double CalcLen(pt *head)实现折线长度的计算。具体办法是:定义指针pr、p,分别指向第一节点和第二节点的前一个节点,计算两个节点的距离,累加到累加器中,再让pr、p分别挪向下一结点,指向第二节点和第三节点,在计算它们的距离,再进行累加,直到p指向最后一个节点。最后返回累加器的结果。程序代码:#include #include #include #include struct point int x; /横坐标 int y; /纵坐标 struct point *next; ; typedef struct point PT; void PrintLink(PT * head) PT *p = head; puts(打印所有点的坐标:); puts(-); while(p) printf(%d,%d)n ,p - x , p - y ); p = p-next; PT * CreateLink()/前插法PT *p,*head=NULL;int i=0;while(getchar()=n&ix=rand()%101-1;p-y=rand()%101-1;p-next=head;head=p;i+;printf(%d,%d)n,p-x,p-y);return head; double CalcLen(PT * head) double length=0;PT * p1=head,* p2=head-next;while(p2!=NULL)length+=sqrt(pow(p2-x-p1-x),2)+pow(p2-y-p1-y),2);p1=p1-next;p2=p2-next;return length; void DestroyLink(PT * head)/脱节再释放 PT * p=head,*p1; while(p!=NULL) p1=p;p=p-next;p1-next=NULL;free(p1); printf(成功释放链表!n); int main() PT * head = CreateLink(); double length; srand(time(NULL); PrintLink(head); length = CalcLen(head); printf(length = %lfn,length); DestroyLink(head); /这个函数没有,考试至少扣 5 分! return 0; 实验总结:这次试验主要练习链表处理,把那些相关的知识点记牢了,加上前面的编程的经验积累,虽然难度是比较大的,但多练,多实践,总会有收获的。实验十实验名称:综合程序设计1【任务1】获取当前系统日期和时间已知标准C库文件中,有如下结构体和函数可以获取系统当前的日期和时间: (1)与系统时间和日期相关的结构体 struc tm int tm_sec; /秒,0-59 int tm_min; /分,0-59 int tm_hour; /时,0-23 int tm_mday; /天数,1-31 int tm_mon; /月数,0-11 int tm_year; /自1900的年数 int tm_wday; /自星期日的天数0-6 int tm_yday; /自1月1日起的天数,0-365 int tm_isdst; /是否采用夏时制,采用为正数; (2)获取时间的两个函数long time(long *tloc) /本函数给出自格林威治时间1970年1月1日凌晨至现在所经/过的秒数,并将该值存于tloc所指的单元中 struct tm *localtime(long *clock) /把clock所指的时间(如函数time()返回的时间) /转换成当地标准时间,并以结构体tm形式返回程序代码:#include#includeint main() struct tm *cc;long tt=0;time(&tt);/printf(%ldn,tt);c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 附睾炎的相关知识及护理
- 三明学院《化学教学设计与案例分析》2023-2024学年第二学期期末试卷
- 荆州学院《武术B(1)》2023-2024学年第二学期期末试卷
- 2025至2031年中国油花珠核行业投资前景及策略咨询研究报告
- 南京邮电大学通达学院《媒体产业经营与管理》2023-2024学年第二学期期末试卷
- 巫溪餐厅铝扣板施工方案
- 宁夏民族职业技术学院《财政金融》2023-2024学年第二学期期末试卷
- 盐城工业职业技术学院《学前儿童英语教育双语》2023-2024学年第一学期期末试卷
- 消竹式明洞施工方案
- 防爆电气安全培训
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
- 贯彻落实八项规定精神情况自查表
- DB33∕1050-2016 城市建筑工程日照分析技术规程
- 灯具安装施工组织设计(完整版)
- 网络项目割接方案V8
- 国家职业技能标准 (2021年版) 鉴定估价师(机动车鉴定评估师)
- 幼儿园老师爱的故事——感受一个听障儿童的成长
- 水利工程监理安全台账
- 《美丽的集邮册》朗诵
- 35kV-220kV架空送电线路维护管理方案
- GB 1886.304-2020 食品安全国家标准 食品添加剂 磷酸(湿法)_(高清-现行)
评论
0/150
提交评论