《C语言程序设计》实验报告
实验五 数组程序设计
班级 学号 姓名
实验地点 完成日期 成绩
(一)实验目的与要求
1、掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2、掌握字符数组和字符串函数的使用; 3、掌握与数组有关的算法。
(二)实验内容
1、对于输入的n个整数,先进行升序排序,然后进行二分查找。(HLOJ 8005) 2、如果矩阵A中存在这样的一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。编写一个程序计算出矩阵A的马鞍点的值。(HLOJ 1208)
3、对给定的数据进行排序。每组测试数据的结构是:第一行为一个整数N (0 (三)实验具体步骤 1、对于输入的n个整数,先进行升序排序,然后进行二分查找。 解题思路: 首先,认真解读题目,该题首先是要用到排序,因为还要进行查找二分查找,所以就要有两个数组,设为a数组和b数组,即在a数组中查找b数组里的元素,如果查到就输出该元素在a数组中的位置(即下标),查不到就输出零。 具体步骤,在输入一个n时,由n控制a数组的元素个数,输入n个数,然后用冒泡法对a数组进行升序排序。然后输入一个m,用来控制b数组的元素个数(查找次数),然后是输入m个数到b数组,接下来就是要做二分查找。二分查找即折半查找,主要思想为:将n个元素分成个数大致相同的两半,取a[mid]与欲查 找的b[i]作比较,如果b[i]< a[mid],则在a[mid]左边在进行二分查找,否则就在a[i]的右边进行查找。如果b[i]=a[mid]则找到b[i];就.输出b[i]在数组a[i]里的下标(mid+1),并退出循环。如果找不到(即start>end了)就输出0。. 主要代码: [注:此处请填写自己的核心代码(须带必要的注释)] 运行结果: 《C语言程序设计》实验报告 2、如果矩阵A中存在这样的一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。 解题思路: 首先是要定义一个二维数组a[100][100],根据输入的m(行数),n(列数),得到一个矩阵,然后先求第i行的最小元素,先设一个min为最小,然后再跟该行里的第j个元素去比较,如果找到比min大的,就把a[i][j]赋值给min,当找到最小的那个值时,因为还要判断该值是否是第j列中值最大的元素,所以需要先把此时的j的值临时赋给一个变量t;然后就让min去列中比较,遇到比min大的就结束循环,如果一直到最后都没有遇到比min大的,就说明min此时是最大的,也就是说,它就是要找的鞍马点,然后输出a[i][j],否则就说明找不到鞍马点,输出Impossible。(因为要进行循环,所以要增加一个标签f,赋初值为0;当找到鞍马点是f=1;否则f=0;根据它来输出不存在的情况)。 主要代码: [注:此处请填写自己的核心代码(须带必要的注释)] 运行结果: 《C语言程序设计》实验报告 3、对给定的数据进行排序。每组测试数据的结构是:第一行为一个整数N (0 此题用字符串的方法来解决。首先定义一个长度为100的字符串数组s[100];然后根据输入的n,输入n组字符串。因为要根据长度排序,所以用冒泡排序法,对字符串进行排序,先假设k为假设的最小数的下标,把i赋值给k;然后j从i+1开始,又因为题目要求如果长度相等时则按大小排,所以当满足后一个字符串小于前一个字符串或者两个相等且后一个小于前一个时,就把j赋值给k;这样就能得到最小值k,再判断k跟i是否相等,如果不相等则说明当前最小数不在当前最前面,进行交换,循环结束后,再把数组进行输出。因为是对字符串进行处理,所以要添加头文件#include 主要代码: [注:此处请填写自己的核心代码(须带必要的注释)] 运行结果: 《C语言程序设计》实验报告 (四)实验结果 在做第一题二分查找的时候,由于没有学过数据结构,所以做的时候遇到了一点困难,开始总是运行不出正确的答案,运行结果都为零,后来发现是我在两边往中间去长度的时候,顺序出现了错误,经过改正,终于运行成功。第二题鞍马点测试基本上没什么问题。第三题按长度排序,开始我不太清楚,string型的字符串也可以直接定义数组,总是在输一个紧接着就去求长度,把长度存到一个数组,然后在判断,总是做不对,后来知道了可以这么定义,经过修改做出了正确答案。 (五)收获与体会 做了这次的实验报告,有一点值得肯定的是,对于数组的操作有了更深一步的了解。做二分查找,让我很有体会,很多时候的查找其实可以通过其他的方法使得程序的运行更加的有效率。比如二分查找就比顺序查找的效率要高的多,在做题的时候,也要考虑如何解题能够提高程序运行的效率。 经过这段时间的做题,不仅仅是做这个实验报告,从开始的看到题目,连头文件名都打不对,自己没有一些做C++题目的感觉,到慢慢的做了一些题目后,有了自己解题的一个思路,做题目也越来越顺利了,提交也不会总是WrongAnswer,遇到一些错误能自己把它解决掉,当中老师也给了很大的帮助,非常感谢老师。 就我自己而言,深刻的体会到,要能够使做题越来越熟练,唯一的方法就是多做点题目。当你拿到一个题目的时候,不能盲目的就去敲代码,要把题目理解清楚,考虑好解决这个题目需要用到哪些知识点。有了解题的基本框架,再去写代码,这样就能提高解题的效率,自己的思路也比较清晰,不会混乱。同时也发现,自己还是存在很多的不足,需要进一步的努力,不断巩固所学的知识,并加以扩充。