课题华水的c语言.docx
- 文档编号:6249595
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:40
- 大小:61.34KB
课题华水的c语言.docx
《课题华水的c语言.docx》由会员分享,可在线阅读,更多相关《课题华水的c语言.docx(40页珍藏版)》请在冰豆网上搜索。
课题华水的c语言
华水的c语言
《C语言程序设计实验》实验报告
指导老师:
专业:
班级:
学号:
姓名:
日期:
2011-05-29
重庆邮电大学计算机科学与技术学院
实验一
实验名称:
一维数组程序设计
实验目的:
1、熟练掌握使用一维数组编程的方法。
2、熟练掌握排序算法。
实验内容:
1、调试示例
输入一个整数n(0 源程序: 略 调试好的程序: #include intmain() { inti,j,n,x,a[10]; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); printf("输入要插入的整数: "); scanf("%d",&x); for(i=0;i { if(x>a[i])continue; j=n-1; while(j>=i){ a[j+1]=a[j]; j--; } a[i]=x; break; } if(i==n)a[n]=x; for(i=0;i<=n;i++) printf("%d\t",a[i]); return0; } 2、编程题1 输入一个正整数n(0 程序代码: #include intmain() { inti,n,sum=0,a[10]; floatav; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); for(i=0;i { sum+=a[i]; } av=(float)sum/n; printf("%0.2f\t",av); return0; } 3、编程题2 输入一个正整数n(0 程序代码 #include intmain() { inti,n,a[10]; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); for(i=n-1;i>=0;i--) printf("%d\t",a[i]); return0; } 4、编程题3 输入一个正整数n(0 程序代码: #include intmain() { inti,j,n,x,a[10]; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); x=a[0]; for(i=0;i { if(a[i]>x){x=a[i];j=i;} } printf("最大数: %d\t下标: %d\t",x,j); return0; } 5、编程题4 输入一个正整数n(0 程序代码: #include intmain() { inti,n,j=0,k=0,x,y,a[10]; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); y=a[0]; x=a[0]; for(i=0;i { if(a[i]>x){x=a[i];j=i;} if(a[i] } a[j]=a[0]; a[0]=y; a[k]=a[i-1]; a[i-1]=x; for(i=0;i printf("%d\t",a[i]); return0; } 6、编程题5 输入一个正整数n(0 程序代码: #include intmain() { inti,n,j=0,x,a[10]; printf("输入数据的个数n: "); scanf("%d",&n); printf("输入%d个整数: ",n); for(i=0;i scanf("%d",&a[i]); x=a[0]; for(i=0;i { for(j=i;j { if(a[i]>a[j+1]) { x=a[i];a[i]=a[j+1];a[j+1]=x; } elsecontinue; } } for(i=0;i printf("%d\t",a[i]); return0; } 实验总结: 本次C语言上机实验,主要是对一维整数数组进行处理,通过本次实验,我熟练掌握了一维数组元素的处理组排序算法(冒泡排序法和选择排序法)。 实验二 实验名称: 字符串程序设计 【实验1】判断回文 从键盘输入一串字符,判断该字符串是否是回文,即该字符串从左向右读,与从右向左读都一样,如“ABCBA”、“ABCCBA”。 编程思路: 定义指针start和end,分别指向字符串首、尾。 分别从串首、尾开始向中间比较,若指针所指字符不同,则不是回文。 源程序: #include #include intis(char*ptr); voidmain() { charstr[100]; printf("inputastring\n"); gets(str); if(is(str)) {printf("%sisaPalindrome\n",str);} else {printf("%sisanotpalindrome\n",str);} } intis(char*ptr) { inti,a,flag=0; a=(int)strlen(ptr)-1;//数组下标从0开始! for(i=0;a>=0;i++,a--) { if(ptr[a]==ptr[i]) flag=1; else { flag=0; break; } } returnflag; } 【实验2】删除排序 已知某已排好序的数组,其元素为{1,3,5,7,9},从键盘输入x的值,若数组中存在与x相等的元素,则删除。 编程思路: 搜索整个数组判断x是否存在于数组中;如果在,定位待删除元素的下标;从该下标开始,将所有后续元素往前移。 注意移动顺序应从最后一个元素开始,还是先从待删除元素的位置开始! 源程序: #include #include int*Delete(inta[],intn,intx) { inti,pos,k; for(i=0;i { if(a[i]==x) {pos=i; break; } } for(k=pos;k a[k]=a[k+1]; returna; } intmain() { intarr[5]={1,3,5,7,9},x,i; printf("inputx="); scanf("%d",&x); printf("beforedelete"); for(i=0;i<5;i++) printf("%4d",arr[i]); printf("\n"); Delete(arr,5,x); printf("afterdelete"); for(i=0;i<4;i++) printf("%4d",arr[i]); printf("\n"); return0; } 实验总结: 通过这次实验,了解了字符串的特点,它在数组中有结束标志“\0”,而其长度又不将起算在内,牢记这点对编程速率很有帮助。 实验三 实验名称: 指针和二维数组 【实验1】对N个字符串进行排序 编程思路: 第一种实现方式: 要求从键盘输入N个字符串,将其存储在二维数组中,在主函数中进行排序。 第二种实现方式: 要求定义指针数组指向N个字符串,调用函数sort()进行排序。 sort()具有如下原型: /* 函数返回值: 多级指针类型char**,返回指针数组首地址 形式参数: 指针p,char*,用于操纵N个字符串 line,int,表示字符串个数 */ char**sort(char*p[],intlinel) 源程序: #include #include #defineN5 intmain() { /*定义二维数组*/ inti,k,j; chara[N][30],temp[20]; /*从键盘输入N个字符串*/ printf("从键盘输入%d个字符串\n",N); for(i=0;i gets(a[i]); for(i=0;i { k=i; /*若当前字符串大于str[k],记录其下标*/ for(j=i+1;j { if(strcmp(a[k],a[j])<0)//a[i]改为a[k] k=j; } if(k! =i) { /*交换字符串str[k]和str[i]*/ strcpy(temp,a[i]);strcpy(a[i],a[k]);strcpy(a[k],temp); } } puts("\nAftersort: "); for(i=0;i puts(a[i]); return0; } 【实验2】找众数 定义函数实现: (1)输出整数数组中重复出现的数和重复的次数。 (2)找出整数数组中的众数(即出现次数最多的数) 并编写相应的主函数测试之。 编程思路: 先对数组排序,排序后数组内的元素如有相同值就会紧邻存储。 定义maxCount、maxI、seek,分别表示最多重复次数、最多重复次数对应的元素下标、当前正在查找的数值,将两数置0。 从头扫描整个数组,统计每个元素出现的次数,如果出现次数大于maxCount,记录其出现次数和该元素对应下标。 扫描完毕即可找到众数及其出现次数。 源程序: #include #include #defineN6 intmain() { inta[N]; inti,j,k,temp; intmaxCount=0,maxI=0,seek=0,count=0; for(i=0;i { printf("请输入第%d个数: ",i+1); scanf("%d",a+i); } /*选择法对数组排序*/ for(i=0;i { k=i; for(j=i;j if(a[k]>a[j])//a[i]改为a[k] k=j; if(i! =k) {temp=a[i];a[i]=a[k];a[k]=temp;} } for(i=0,seek=a[0];i<=N;i++) { if(seek==a[i]) { /*计数器加1*/ count++; } else { /*输出前一元素的值和出现次数*/ printf("Number=%d,Count=%d\n",a[i-1],count); /*如果前一元素的出现次数比maxCount大,则修改maxCount和maxI*/ if(count>maxCount) { maxCount=count; maxI=i-1; } count=0; count++; seek=a[i]; } } printf("\nmaxNumber=%d,maxCount=%d\n",a[maxI],maxCount); return0; } 实验总结: 本次实验运用了选择法对数组进行排序,不管是二维数组,还是一维数组,其思路是一样的,只是具体的实现有所不同,比如比较字符串要用函数strcmp()。 实验四 实验名称: 结构体 【实验1】计算椭圆面积 已知坐标系统中两点p1、p2构成的矩形是椭圆的外切矩形,如图3-1所示。 定义结构体 structellipse { structpoint { intx; inty; }p1,p2; doublea; doubleb; }; 从键盘输入p1、p2的坐标值,计算椭圆面积,已知积计算公式为: S=Πab。 程序代码: #include #include structellipse { structpoint { intx; inty; }p1,p2; doublea; doubleb; }; typedefstructellipseell; intmain() { elle; doubles; 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=%lf\n",s); return0; } 实验总结: 这次实验用到了结构体的嵌套定义,通过实验,让我更深入了解结构体的定义,使用,访问等操作。 实验五 实验名称: 指针强化1 【实验1】字符串逆序存储 编写一个函数inverse,实现将字符串逆序存放,即原字符串为“abcdef”,将其重新存储为“fedcba”。 实验思路: 从字符串中第一个字符开始,使其和最后一个字符交换,第二个字符和倒数第二个字符交换,……,一直到字符串中间的字符为止。 程序代码: #include #include char*inverse(char*p) { /*定义需要用到的变量*/ inti,len; chartmp; 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; } returnp; } intmain() { charstr[100]; printf("请输入字符串: "); gets(str); puts(inverse(str)); return0; } 【实验2】字符串逆序存储 删除字符串s中所有出现的与变量c相同的字符。 程序代码: #include #include char*squeez(char*s,charc) { inti,j; for(i=j=0;i { if(s[i]! =c) { s[j]=s[i];//___请填空___ j++; } } s[j]='\0'; returns; } intmain() { chars[100],c; printf("请输入字符串: "); gets(s); printf("请输入变量: "); c=getchar(); puts(squeez(s,c)); return0; } 实验总结: 这次与前面的某次实验的内容差不多,用到了知识点是指针,字符串。 实验六 实验名称: 指针强化2 【实验1】实现库函数atoi 已知C标准库函数atoi实现将字符串转换为整数的功能,如: charstr[]="123456"; printf("对应的整数为: %d\n",atoi(str)); 自定义函数: intatoi(char*str),使其实现同名标准库函数的功能。 实验思路: 先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。 定义变量sign,若字符串中第一个元素是'﹣',则sign值为-1,并让字符串指针指向下一元素。 指针指向字符串“-123456”的第一个数字字符'1',将其转换为对应数字1,放入变量t中,指针下移至后一元素'2',再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。 返回变量t*sign即可。 程序代码: #include #include intatoi(char*str); intmain() { charstr[100]; printf("请输入字符串: "); gets(str);//此处不能否替换成scanf()! printf("对应的整数为: %d\n",atoi(str)); return0; } intatoi(char*str) { inti=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)<=57||i==0)) sign=-1; if(*(str+i)>=48&&*(str+i)<=57) { a=*(str+i)-48; s=s*10+a; if(*(str+i+1)<=48&&*(str+i+1)>=57&&p) p=0; } } if(sign) s*=sign; returns; } 【实验2】译码 编写change函数实现: 将大于0小于1000的阿拉伯数字转换为罗马数字输出。 阿拉伯数字和罗马数字对应关系如下: 并编写相应的主函数测试该函数。 实验思路: 先考虑最简单的情况,字符串中只有数字,如果是负数,字符串第一个元素是负号。 定义变量sign,若字符串中第一个元素是'﹣',则sign值为-1,并让字符串指针指向下一元素。 指针指向字符串“-123456”的第一个数字字符'1',将其转换为对应数字1,放入变量t中,指针下移至后一元素'2',再将其转换为对应数字2,将t中1变成10,再加2,如此循环,至字符串结束。 返回变量t*sign即可。 程序代码: #include /*定义数据结构code存储罗马字符*/ typedefstruct { chars[3];//别忘了'\0' inta; }COD; intchange(COD*code,intnum); intmain() { CODcode[13]={{"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}}; intx; printf("请输入一个阿拉伯数字: "); scanf("%d",&x); if(x>0&&x<4000) change(code,x); else printf("输入的阿拉伯数字超出范围! ! ! \n"); return0; } intchange(COD*code,intnum) { inti,a,last=0; while(num) { a=num/(*(code+last)).a; if(a<=0)last++; else {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课题 语言