软基实验第五次上机实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//上机实验五 #include "stdafx.h" #include<stdlib.h> #include<string.h> #include<stdio.h>
#pragma warning(disable:4996) #define _CRT_SECURE_NO_WARNINGS typedef struct wk.baidu.comame { char *name; }*Nameptr; //ex5_1 查找——基本题 //顺序查找 void seqSearch(int *a); //二分查找 void binarySeach(int *a, int length); //******************哈希查找************** //ex5_2 扩展题 //将名字表保存到哈希表中 Name *HashSave(Name *nameList); //名字列表 void init(Name *nameList); //哈希查找 void Hash(char *name, Name *nameList); //***************************************** //ex5_3 排序 基本题 //选择排序 int *selectionSort(int *array, int length); //插入排序 int * InsertSort(int *array, int length); //冒泡排序 int *bubblesort(int *array, int length); //****************ex5_4 快速排序 扩展题*********** //快速排序 void quickSort(int *array, int left, int right); //*************************************** //打印数组元素 void printArray(int *a, int length); void main() { int a[] = { 3,10,13,17,40,43,50,70 }; int b[] = { 513,87,512,61,908,170,897,275,653,462 };
nameList[1].name = "xiaojun"; nameList[2].name = "xiaohua"; nameList[3].name = "zhangsan"; nameList[4].name = "lisi"; nameList[5].name = "wangwu"; nameList[6].name = "zhouliu"; nameList[7].name = "zhaoqi"; nameList[8].name = "qianba"; nameList[9].name = "qinshihuang"; nameList[10].name = "tangtaizhong"; nameList[11].name = "songtaizu"; nameList[12].name = "zhangfei"; nameList[13].name = "guanyu"; nameList[14].name = "liubei"; nameList[15].name = "sunshangxiang"; nameList[16].name = "sunquan"; nameList[17].name = "zhouyu"; nameList[18].name = "huangzhong"; nameList[19].name = "chaocao"; nameList[20].name = "bianque"; nameList[21].name = "direnjie"; nameList[22].name = "yase"; nameList[23].name = "anqila"; nameList[24].name = "kai"; nameList[25].name = "nvwa"; nameList[26].name = "zhenji"; nameList[27].name = "yuji"; nameList[28].name = "caiwenji"; nameList[29].name = "lvbu"; } Name *HashSave(Name *nameList) { Name *hashList = (Name*)malloc(30*sizeof(Name)); //乘以 30 否则越界 for (int n = 0; n < 30; n++) { //初始化,防止出现乱码 hashList[n].name = ""; } int sum = 0; int r = 0; int key; int j = 0; for (int i = 0; i < 30; i++) { sum = 0; char *mName = nameList[i].name; while (*(++mName) != '\0') //求 ASCII 码和
软件技术基础上机实验报告
(学生姓名)(学号) 上机实验五 ex5_1:查找——基本题 假设有序序列的数据元素为: (3,10,13,17,40,43,50,70) 1)编写顺序查找函数 2)编写二分查找函数 3)在主程序中输入关键字(43 和 5),分别调用两种查找函数,输出结果。 ex5_2:Hash 查找——扩展题 1)一个班有 30 位同学,安排装进一个有 30 个元素的数组,以姓名作为关键字进行哈希存 储,具体方法如下:将姓名字符串中的每个字节按 ASCII 码(中文也支持 的哦)加起来, 除以 30,取得的余数作为元素存放位置(数组下标)。冲突解决采用线性探查法。 2)输入少于 30 个学生姓名,按 Hash 方式存入表中。 3)验证能够按 Hash 方式找到表中学生,不在表中将提示错误 ex5_3:排序——基本题 1)编写简单选择法函数 2)编写直接插入法函数 3)编写冒泡法排序函数 4)在主程序中输入一组数据元素,如 513,87,512,61,908,170,897,275,653,462, 分别调用三种排序函数,输出每趟排序结果。 ex5-4:排序——扩展题 编写快速排序函数
scanf_s("%d", &key); while (a[i]) { if (key == a[i]) { printf("\nSuccess!key is the %d number!\n", i + 1); return; } i++; } printf("Search Error!"); } //二分查找 void binarySeach(int *a, int length) { int low, high, mid; low = 0; int key; high = length - 1; printf("\nPlease Inpuut The data you want to search :\n"); scanf_s("%d", &key); while (low <= high) { mid = (high + low) / 2; if (a[mid] == key) { printf("\nSuccess!key is the %d number!\n", mid + 1); return; } else if (key>a[mid]) { low = mid + 1; } else { high = mid - 1; } } printf("\nSearch Error!\n"); } //***************哈希查找************** //用来模拟输入 30 个人名,保存到哈希表中 void init(Name *nameList) { nameList[0].name = "xiaoming";
{ sum += (int)(*(mName + r)); } key = sum % 30; j = 0; while (hashList[(key + j) % 30].name != "") //如果有冲突,则线性探查 { j++; } if (hashList[(key + j) % 30].name == "") //如果没有冲突,则将名字存入 hashList[(key + j) % 30].name = nameList[i].name; //使用 strcpy 出错 } } return hashList; } //哈希查找函数 void Hash(char *name, Name *hashList) { int r = 0; int sum = 0; char *p=(char*)malloc(sizeof(char)); //为工作指针分配存储空间 strcpy(p,name); while (*(p) != '\0') { sum += (int)*(p); //求 ASCCI 码和 p++; } int j = sum%30; for (int i = 0; i<30; i++) { if (strcmp(name, hashList[j % 30].name) == 0) //比较两个名字是否相等,如果相等,输出在哈希表中的位置 { printf("\nSearch successs!The name's hashCode is:%d\n", j %30); return ; } else //线性探查 { j++; } if (i == 29) { //如果一直找不到,说明名字不存在 printf("\nSearch Error!\n"); } }
一、程序流程说明——有条理的文字或流程图* 由于此次上机题目较多,为了让老师看得更加容易,条理体现在代码注释中。 二、完整程序训练:(注:同样的,由于代码较多,所有方法的编写和调用都已经尽可能按 照实验 PPT 题目的顺序来, 所以基础部分和扩展题的代码都不分开编写, 已经在代码中有详 细注释。)
代码:
printf("\n**************seqSearch*************\n"); seqSearch(a); printf("\n**************binarySearch*************\n"); binarySeach(a,8); printf("\n**************InsertSort*************\n"); printArray(InsertSort(b, 10), 10); printf("\n**************selectionSort*************\n"); printArray(selectionSort(b, 10), 10); printf("\n**************bubblesort*************\n"); printArray(bubblesort(b, 10), 10); printf("\n**************quickSort*************\n"); quickSort(b, 0, 9); printArray(b, 10); printf("\n**************Hash Search*************\n"); Name nameList[30] = {}; char name[30] = {}; char buffer; init(nameList); Name * hashList = (Name*)malloc(30*sizeof(Name)); for (int i = 0; i <30; i++) { hashList[i].name = ""; } hashList = HashSave(nameList); printf("\nPlease input the name you want to search:\n"); rewind(stdin); //清除上一个 scanf_s 缓存区的回车字符 int length= 0; while (1) //输入查找名字 { scanf_s("%c",&buffer); if (buffer== '\n') break; name[length] = buffer; length++; } Hash(name, hashList); } //顺序查找 void seqSearch(int *a) { int i = 0; int key; printf("\nPlease Inpuut The data you want to search :\n");
#pragma warning(disable:4996) #define _CRT_SECURE_NO_WARNINGS typedef struct wk.baidu.comame { char *name; }*Nameptr; //ex5_1 查找——基本题 //顺序查找 void seqSearch(int *a); //二分查找 void binarySeach(int *a, int length); //******************哈希查找************** //ex5_2 扩展题 //将名字表保存到哈希表中 Name *HashSave(Name *nameList); //名字列表 void init(Name *nameList); //哈希查找 void Hash(char *name, Name *nameList); //***************************************** //ex5_3 排序 基本题 //选择排序 int *selectionSort(int *array, int length); //插入排序 int * InsertSort(int *array, int length); //冒泡排序 int *bubblesort(int *array, int length); //****************ex5_4 快速排序 扩展题*********** //快速排序 void quickSort(int *array, int left, int right); //*************************************** //打印数组元素 void printArray(int *a, int length); void main() { int a[] = { 3,10,13,17,40,43,50,70 }; int b[] = { 513,87,512,61,908,170,897,275,653,462 };
nameList[1].name = "xiaojun"; nameList[2].name = "xiaohua"; nameList[3].name = "zhangsan"; nameList[4].name = "lisi"; nameList[5].name = "wangwu"; nameList[6].name = "zhouliu"; nameList[7].name = "zhaoqi"; nameList[8].name = "qianba"; nameList[9].name = "qinshihuang"; nameList[10].name = "tangtaizhong"; nameList[11].name = "songtaizu"; nameList[12].name = "zhangfei"; nameList[13].name = "guanyu"; nameList[14].name = "liubei"; nameList[15].name = "sunshangxiang"; nameList[16].name = "sunquan"; nameList[17].name = "zhouyu"; nameList[18].name = "huangzhong"; nameList[19].name = "chaocao"; nameList[20].name = "bianque"; nameList[21].name = "direnjie"; nameList[22].name = "yase"; nameList[23].name = "anqila"; nameList[24].name = "kai"; nameList[25].name = "nvwa"; nameList[26].name = "zhenji"; nameList[27].name = "yuji"; nameList[28].name = "caiwenji"; nameList[29].name = "lvbu"; } Name *HashSave(Name *nameList) { Name *hashList = (Name*)malloc(30*sizeof(Name)); //乘以 30 否则越界 for (int n = 0; n < 30; n++) { //初始化,防止出现乱码 hashList[n].name = ""; } int sum = 0; int r = 0; int key; int j = 0; for (int i = 0; i < 30; i++) { sum = 0; char *mName = nameList[i].name; while (*(++mName) != '\0') //求 ASCII 码和
软件技术基础上机实验报告
(学生姓名)(学号) 上机实验五 ex5_1:查找——基本题 假设有序序列的数据元素为: (3,10,13,17,40,43,50,70) 1)编写顺序查找函数 2)编写二分查找函数 3)在主程序中输入关键字(43 和 5),分别调用两种查找函数,输出结果。 ex5_2:Hash 查找——扩展题 1)一个班有 30 位同学,安排装进一个有 30 个元素的数组,以姓名作为关键字进行哈希存 储,具体方法如下:将姓名字符串中的每个字节按 ASCII 码(中文也支持 的哦)加起来, 除以 30,取得的余数作为元素存放位置(数组下标)。冲突解决采用线性探查法。 2)输入少于 30 个学生姓名,按 Hash 方式存入表中。 3)验证能够按 Hash 方式找到表中学生,不在表中将提示错误 ex5_3:排序——基本题 1)编写简单选择法函数 2)编写直接插入法函数 3)编写冒泡法排序函数 4)在主程序中输入一组数据元素,如 513,87,512,61,908,170,897,275,653,462, 分别调用三种排序函数,输出每趟排序结果。 ex5-4:排序——扩展题 编写快速排序函数
scanf_s("%d", &key); while (a[i]) { if (key == a[i]) { printf("\nSuccess!key is the %d number!\n", i + 1); return; } i++; } printf("Search Error!"); } //二分查找 void binarySeach(int *a, int length) { int low, high, mid; low = 0; int key; high = length - 1; printf("\nPlease Inpuut The data you want to search :\n"); scanf_s("%d", &key); while (low <= high) { mid = (high + low) / 2; if (a[mid] == key) { printf("\nSuccess!key is the %d number!\n", mid + 1); return; } else if (key>a[mid]) { low = mid + 1; } else { high = mid - 1; } } printf("\nSearch Error!\n"); } //***************哈希查找************** //用来模拟输入 30 个人名,保存到哈希表中 void init(Name *nameList) { nameList[0].name = "xiaoming";
{ sum += (int)(*(mName + r)); } key = sum % 30; j = 0; while (hashList[(key + j) % 30].name != "") //如果有冲突,则线性探查 { j++; } if (hashList[(key + j) % 30].name == "") //如果没有冲突,则将名字存入 hashList[(key + j) % 30].name = nameList[i].name; //使用 strcpy 出错 } } return hashList; } //哈希查找函数 void Hash(char *name, Name *hashList) { int r = 0; int sum = 0; char *p=(char*)malloc(sizeof(char)); //为工作指针分配存储空间 strcpy(p,name); while (*(p) != '\0') { sum += (int)*(p); //求 ASCCI 码和 p++; } int j = sum%30; for (int i = 0; i<30; i++) { if (strcmp(name, hashList[j % 30].name) == 0) //比较两个名字是否相等,如果相等,输出在哈希表中的位置 { printf("\nSearch successs!The name's hashCode is:%d\n", j %30); return ; } else //线性探查 { j++; } if (i == 29) { //如果一直找不到,说明名字不存在 printf("\nSearch Error!\n"); } }
一、程序流程说明——有条理的文字或流程图* 由于此次上机题目较多,为了让老师看得更加容易,条理体现在代码注释中。 二、完整程序训练:(注:同样的,由于代码较多,所有方法的编写和调用都已经尽可能按 照实验 PPT 题目的顺序来, 所以基础部分和扩展题的代码都不分开编写, 已经在代码中有详 细注释。)
代码:
printf("\n**************seqSearch*************\n"); seqSearch(a); printf("\n**************binarySearch*************\n"); binarySeach(a,8); printf("\n**************InsertSort*************\n"); printArray(InsertSort(b, 10), 10); printf("\n**************selectionSort*************\n"); printArray(selectionSort(b, 10), 10); printf("\n**************bubblesort*************\n"); printArray(bubblesort(b, 10), 10); printf("\n**************quickSort*************\n"); quickSort(b, 0, 9); printArray(b, 10); printf("\n**************Hash Search*************\n"); Name nameList[30] = {}; char name[30] = {}; char buffer; init(nameList); Name * hashList = (Name*)malloc(30*sizeof(Name)); for (int i = 0; i <30; i++) { hashList[i].name = ""; } hashList = HashSave(nameList); printf("\nPlease input the name you want to search:\n"); rewind(stdin); //清除上一个 scanf_s 缓存区的回车字符 int length= 0; while (1) //输入查找名字 { scanf_s("%c",&buffer); if (buffer== '\n') break; name[length] = buffer; length++; } Hash(name, hashList); } //顺序查找 void seqSearch(int *a) { int i = 0; int key; printf("\nPlease Inpuut The data you want to search :\n");