当前位置:文档之家› 华中科技大学电信学院C语言上机报告

华中科技大学电信学院C语言上机报告

《标准C语言程序设计》上机报告实验指针、函数程序设计专业:电信工程班级:xxxxxxxx学号:xxxxxxxxxxx姓名:xxxxx完成日期:2013年5月11日一、实验目的1.进一步掌握调试方法;2.掌握一维数组、二维数组的定义、初始化和引用;3.掌握字符串和数组的结合(存储和处理);4.掌握并熟练使用字符串处理库函数;5.熟悉数组的操作(矩阵等数学运算、顺序及二分法查找、设标签选择法及交换法排序等);6.了解数组下标越界的形式和后果。

二、实验内容1.深入理解《上机实践训练教程》2.5实验五案例示范和有关概念文字描述中的知识点,给出你的理解。

理解:数组的初始化和赋值:数组的初始化是在声明后面紧跟一个用花括号括起来的初始化列表,各初始化表达式用逗号分隔,字符数组还可以用一个字符串初始化。

而赋值时数组不能作为一个整体操作,只能对数组的元素进行操作。

数组越界:使用数组时,编译器不会检查下标是否越界,这使程序灵活,快速的同时也产生了安全隐患。

使用越界的数组可能修改内存中其他程序甚至操作系统的代码,可能使程序出错甚至系统崩溃,所以在使用数组的时候要留意是否越界,比如循环调用的时候判断条件是否正确。

另外,一些处理字符数组的函数例如puts(),strcmp,strcat()都是非常危险的,他们以’\0’为结束的标志,如果用户输入超过了数组定义的大小,这可能发生数组越界。

有人曾经利用这一特点发明了在UNIX操作系统传播的蠕虫病毒,它通过很长的输入覆盖操作系统的代码。

为了解决这一问题,可以使用fputs(),strncmp,strncat()等函数,添加限制条件保证不会越界。

在今后的编程中应该注意这一点。

2.运行实战训练11,理解程序功能并指出其中排序是交换法还是设标签选择法,以及说明is_modified变量的作用?要求:在后续实战训练中使用相应技巧!交换排序法is_modified用来判断内层循环是否进行了交换(没有交换意味着相邻两位的值总是升序或者降序,即整个数组已经满足升序或者降序排列),如果交换则is_modified被赋值为TRUE(即1),否则其值为FALSE(即0)。

当其值为FALSE时数组已经完成排序,直接退出外层循环,这样可以减少循环次数,提高程序的效率。

3.用交换法对10个整数进行升序和降序排列后输出,要求外层循环变量分别从0和1编号实现#include<stdio.h> //升序#define N 10int main(){int a[N];int i,j,m,temp;printf("输入%d个数:\n",N);for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N-1;i++){for(j=0;j<N-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数组:\n");for(i=0;i<N;i++){printf("%d ",a[i]);}printf("\n");return 0;}------------------------------------------------------------------------------- #include<stdio.h> //降序#define N 10int main(){int a[N];int i,j,m,temp;printf("输%d个数:\n",N);for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=1;i<N;i++){for(j=0;j<N-i;j++){if(a[j]<a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序的数组:\n");for(i=0;i<N;i++){printf("%d ",a[i]);}printf("\n");return 0;}4.有15个数存放在一个数组中,输入一数,要求用折半查找法(二分法)找出该数是数组中第几个元素。

若该数不在数组中,则输出“查无次数”。

拓展变化:15个人名存放在二维数组中,输入一个人名,二分法查找,确定是否存在(排序均采用设标签选择法)#include <stdio.h> //用二分法查找数组中的数字#define N 15int main(){int num[N];int local[N]; //储存数字的位置int x,right,left,mid;int i,j,t,m;printf("输入%d个整数:\n",N); //输入数据for(i=0;i<N;i++){scanf("%d",&num[i]);local[i]=i+1;}printf("输入的数组是:\n"); //输出数组for(int i=0;i<N;i++)printf("%4d",num[i]);for(i=0;i<N-1;i++) //用选择排序法升序排列{for(m=i,j=i+1;j<N;j++){if(num[m]>num[j])m=j;}if(m!=i){t=num[i];num[i]=num[m];num[m]=t;t=local[i];local[i]=local[m];local[m]=t;}}printf("\n输入一个数:"); //输入要查找的数scanf("%d",&x);left=0; //二分法查找right=N-1;while(left<=right){mid=(left+right)/2;if(x>num[mid])left=mid+1;else if(x<num[mid])right=mid-1;else{printf("%d是第%d个元素\n",x,local[mid]);return 1;}}printf("查无次数\n",x);return 0;}------------------------------------------------------------------------------- #include <stdio.h> //用二分法查找名字#include <string.h>#define N 15#define M 20int main(){char name[N][M];char x[M];int right,left,mid;int i,j,m;char t[M];printf("输入%d个名字(每次输入按回车):\n",N); //输入数据for(i=0;i<N;i++)gets(name[i]);for(i=0;i<N-1;i++) //用选择排序法升序排列{for(m=i,j=i+1;j<N;j++){if(strcmp(name[m],name[j])>0)m=j;}if(m!=i){strcpy(t,name[i]);strcpy(name[i],name[m]);strcpy(name[m],t);}}printf("输入的数组是:\n"); //输出排序后的数组for(int i=0;i<N;i++)printf("%s ",name[i]);printf("\n输入一个名字:"); //输入要查找的名字gets(x);left=0; //二分法查找right=N-1;while(left<=right){mid=(left+right)/2;if(strcmp(x,name[mid])>0)left=mid+1;else if(strcmp(x,name[mid])<0)right=mid-1;else{printf("%s 存在\n",x);return 1;}}printf("%s 不存在\n",x);return 0;}5.输入一组实数,按录入顺序保存进数组arr中,采用设标签的选择法对其排序。

任意输入一数,直接在arr中将其按序插入相应位置。

#include <stdio.h>#define N 100int main(){int arr[N];int i,j,t,m,x,n;printf("输入的个数(小于%d):",N-1); //确定元素个数scanf("%d",&n);printf("输入%d个数",n); //输入数据for(i=0;i<n;i++)scanf("%d",&arr[i]);for(i=0;i<n-1;i++) //用选择排序法使元素升序排列{for(m=i+1,j=i;j<n;j++){if(arr[m]>arr[j])m=j;}if(m!=i){t=arr[i];arr[i]=arr[m];arr[m]=t;}}for(i=0;i<n;i++) //输出排序后的数组printf("%5d",arr[i]);printf("\n输入要插入的数:"); //输入要插入的数xscanf("%d",&x) ;for(i=0;i<n;i++) //用遍历法找出数组中比x大的最小的那个数的下标i if(x<=arr[i]){break;}for(j=n;j>i;j--) //下标i及其之后的数全部向后移一位{arr[j]=arr[j-1];}arr[i]=x; //在i处插入xn++;for(i=0;i<n;i++) //输出插入之后的数组printf("%5d",arr[i]);printf("\n");return 0;}------------------------------------------------------------------------------- #include <stdio.h> //使用函数使程序模块化,用循环可以不断插入数字#define N 100int getarr(int []); //输入数据void paixu(int [],int n); //排序int chazhao(const int [], int n, int x); //二分法查找x的位置mvoid charu(int [], int n, int m, int x); //在m处插入xvoid showarr(const int [], int); //输出数组int main(){int arr[N];int m,x,n;n=getarr(arr); //得到元素个数paixu(arr,n);showarr(arr,n);printf("\n输入要插入的数");while(scanf("%d",&x)==1) //用循环不断插入数字,输入非数字时退出{m=chazhao(arr,n,x);charu(arr,n,m,x);n++;showarr(arr,n);printf("\n输入要插入的数:");}return 0;}int getarr(int arr[]){int n;printf("输入长度:");scanf("%d",&n);printf("输入%d个数字:\n",n);for(int i=0;i<n;i++)scanf("%d",&arr[i]);return n;}void paixu(int arr[], int n) //选择排序法使元素升序排列{int i,j,m,t;for(i=0;i<n-1;i++){for(m=i+1,j=i;j<n;j++){if(arr[m]>arr[j])m=j;}if(m!=i){t=arr[i];arr[i]=arr[m];arr[m]=t;}}}void showarr(const int arr[],int n){int i;for(i=0;i<n;i++)printf("%5d",arr[i]);}int chazhao(const int arr[],int n, int x) //二分法查找数组中比x大的最小的元素的位置m {int i=0, j=n-1,m;m=(i+j+1)/2;while(i<=j){if(x>arr[m])i=m+1;else if(x<arr[m])j=m-1;elsebreak;m=(i+j+1)/2;}return m;}void charu(int arr[],int n ,int m ,int x) //在位置m插入x{for(int i=n;i>m;i--){arr[i]=arr[i-1];}arr[m]=x;}6.输入一串字符(长度小于100),以’?’结束。

相关主题