电子科技大学软件技术基础查找和排序.docx
《电子科技大学软件技术基础查找和排序.docx》由会员分享,可在线阅读,更多相关《电子科技大学软件技术基础查找和排序.docx(18页珍藏版)》请在冰豆网上搜索。
电子科技大学软件技术基础查找和排序
软件技术基础上机实验报告
罗子建2016010902012
上机实验五
5.1
一、程序流程说明——有条理的文字或流程图*
二、程序代码
#include
#include
#include"stdafx.h"
#defineMAXNUM20
typedefstruct
{
intdata[MAXNUM];
intlength;
}list_type;
voidcreatelist(list_type*lp)
{
inti,elem;
lp->length=0;
printf("\npleaseinputdatasofthelist\n");
for(i=0;i{
scanf_s("%d",&elem);
if(elem==-1)break;
lp->data[i]=elem;
lp->length++;
}
}
intsort(list_type*list,intkey)
{
inti;
for(i=0;ilength;)
{
if(list->data[i]!
=key)
{
i++;
}
else
{
printf("成功查找\n");
break;
}
}
returni+1;
}
intbinsearch(list_type*list,intkey)
{
intlow=0,mid,high=list->length-1;
while(low<=high)
{
mid=(low+high)/2;
if(keydata[mid])
{
high=mid-1;
}
elseif(key>list->data[mid])
{
low=mid+1;
}
else
{
returnmid;
}
}
}
intmain()
{
intm;
inti;
list_typelist;
createlist(&list);
printf("请输入你想顺序查找的元素值:
");
scanf_s("%d",&m);
i=sort(&list,m);
printf("你所查找的元素位置为:
%d",i);
printf("请输入你想二分查找的元素值:
");
scanf_s("%d",&m);
i=binsearch(&list,m);
printf("你所查找的元素位置为:
%d",i);
}
三、测试数据
pleaseinputdatasofthelist
3
10
13
17
40
43
50
70
-1
请输入你想顺序查找的元素值:
43
成功查找
你所查找的元素位置为:
6请输入你想二分查找的元素值:
5
你所查找的元素位置为:
1请按任意键继续...
四、上机时遇到的问题(可分为编译问题和逻辑问题)
对于二分查找,我之前使用的mid一直不能求解到最正确的位置,后来通过编译调试得到正确的答案。
五、实际运行结果:
六、小结体会:
对于顺序查找和二分查找的理解,我又有一定的进一步认识,对于二分查找的mid的定义,对于一串数字的奇偶性判断,一定要知道int为求整类型。
一,程序流程说明——有条理的文字或流程图*
二,程序代码
#include"stdafx.h"
#include
#include
intHash(char*cp)
{
intn,i;
intsum=0;
n=strlen(cp);
for(i=0;isum+=(int)*cp;
cp++;
}
return(sum%30);
}
intmain()
{
charhash[30][20];
for(inti=0;i<30;i++)
{
hash[i][0]='?
';
}
chartemp[21];
intx;
printf("请输入姓名:
");
gets_s(temp,20);
printf("\n");
while(temp[0]!
='\0')
{
x=Hash(temp);
while(hash[x][0]!
='?
')
{
x++;
}
if(x>=30)
{
printf("班级人数已满!
\n");
}
else
{
strcpy_s(hash[x],temp);
}
printf("请输入姓名:
");
gets_s(temp,20);
printf("\n");
}
printf("请输入要查找的姓名:
");
gets_s(temp,25);
printf("\n");
x=Hash(temp);
while(hash[x]!
=NULL&&x<30)
{
if(!
strcmp(hash[x],temp))
{
printf("查找成功,序号为:
%d",x);
break;
}
x++;
}
if(x>=30||hash[x]==NULL)
{
printf("查找失败!
\n");
}
}
三,测试数据
请输入姓名:
alalall
请输入姓名:
assa
请输入姓名:
asasas
请输入姓名:
s
请输入姓名:
as
请输入姓名:
aas
请输入姓名:
as
请输入姓名:
请输入要查找的姓名:
sa
查找成功,序号为:
2请按任意键继续...
四、上机时遇到的问题(可分为编译问题和逻辑问题)
在对于字符串的输出的时候,确实是需要对字符串的处理函数要清楚,比如就要添加string.h的库文件。
五、实际运行结果:
六、小结体会:
本题利用哈西查找,需要用到字符处理的一系列函数。
这次编写程序让我温习了C语言中字符处理的一些函数,string库函数中有复制strcpy函数、查找strchr函数、拼接strcat等函数,都是一些常用函数。
5.3
一,程序流程说明——有条理的文字或流程图*
二,程序代码
#include
#include"malloc.h"
#include"stdafx.h"
#include
#defineMAXNUM20
typedefstructlist
{
intlength;
intdata[MAXNUM];
}list_type;
list_typeselect_sort(list_type*a)
{
inthead=0;
while(headlength)
{
intj=head;
intmin=j;
while(jlength)
{
if(a->data[j]data[min])
min=j;
j++;
}
inttemp=a->data[head];
a->data[head]=a->data[min];
a->data[min]=temp;
head++;
}
return*a;
}
list_typeinsert_sort(list_type*a)
{
inttail=1;
intj;
inttemp;
while(taillength)
{
temp=a->data[tail];
j=tail-1;
while(j>-1)
{
if(tempdata[j])
{
a->data[j+1]=a->data[j];
a->data[j]=temp;
}
else
{
a->data[j+1]=temp;
break;
}
j--;
}
tail++;
}
return*a;
}
list_typebubble_sort(list_type*a)
{
intturn;
intflag;
inti;
inttemp;
for(turn=a->length-1;turn>1;turn--)
{
flag=0;
for(i=0;iif(a->data[i]>a->data[i+1])
{
temp=a->data[i];
a->data[i]=a->data[i+1];
a->data[i+1]=temp;
flag=1;
}
}
if(flag==0)
printf("完成冒泡排序\n");
return*a;
}
voidshow(list_type*a)
{
inti=0;
printf("排序后的结果为:
\n");
while(ilength)
{
printf("%d",a->data[i]);
i++;
}
}
list_typemenu(list_type*list)
{
intm;
intk;
inti;
printf("输入n个数据");
scanf_s("%d",&m);
printf("n:
%d\n",m);
list->length=0;
for(i=0;i{
printf("第%d个元素为:
",i+1);
scanf_s("%d",&k);
list->data[i]=k;
list->length++;
}
return*list;
}
intmain()
{
list_typelist;
list=menu(&list);
printf("简单选择");
select_sort(&list);
show(&list);
printf("\n直接插入");
insert_sort(&list);
show(&list);
printf("\n冒泡排序\n");
bubble_sort(&list);
show(&list);
}
三,测试数据
输入n个数据5
n:
5
第1个元素为:
12
第2个元素为:
56
第3个元素为:
78
第4个元素为:
1
第5个元素为:
0
简单选择排序后的结果为:
01125678
直接插入排序后的结果为:
01125678
冒泡排序
完成冒泡排序
排序后的结果为:
11125678请按任意键继续...
四、上机时遇到的问题(可分为编译问题和逻辑问题)
逻辑问题:
在编写冒泡排序的时候,我不能对未排序的部分有所区分,想起老师说的,可以设置标志变量flag;当有需要的时候,我就可以做相应的条件判断。
五、实际运行结果:
六、小结体会:
在对这个概念的训练中,我强化了简单选择,直接插入,冒泡排序的基本概念的理解。
其实在整个训练过程中,我发现自己的码字的速度有了很大的强化。
哈哈哈哈哈,虽然有点赶,但还是在整个学期的过程中做了很大的功夫,不说自己记会了多少,还是可以摸着自己的良心说,我付出过
4.4
一,程序流程说明——有条理的文字或流程图*
二,程序代码
#include"stdafx.h"
#include
#include
#include
#defineMAX10
typedefintelemtype;
voidswap(elemtype*x,elemtype*y)
{
*x=*x+*y;
*y=*x-*y;
*x=*x-*y;
}
voidquick_sort(elemtype*num,intlow,inthigh)
{
inti=low,j=high;
low++;
if(low>=high)
return;
while(low<=high)
{
while(low*(num+i))
high--;
while(lowlow++;
if(lowswap(num+low,num+high);
if(*(num+high)<*(num+i))
swap(num+high,num+i);
else
high--;
}
quick_sort(num,i,low-1);
quick_sort(num,high+1,j);
}
intmain()
{
intnum[8];
ints;
printf("请输入需要排序的数:
\n");
for(inti=0;i<8;i++)
{
printf("inputadate:
");
scanf_s("%d",&s);
num[i]=s;
}
printf("\n排序前:
");
for(inti=0;i<8;i++)
printf("%d",num[i]);
printf("\n排序后:
");
quick_sort(num,0,8-1);
for(inti=0;i<8;i++)
printf("%d",num[i]);
return0;
}
三,测试数据
请输入需要排序的数:
inputadate:
8
inputadate:
56
inputadate:
41
inputadate:
23
inputadate:
85
inputadate:
0
inputadate:
0
inputadate:
6
排序前:
856412385006
排序后:
006841235685请按任意键继续...
四、上机时遇到的问题(可分为编译问题和逻辑问题)
无
五、实际运行结果:
六、小结体会:
这一个程序是对快速排序的方法的应用,对于我熟悉快速排序的方法有了很大的意义,这是我在这一学期编写的最后的一个程序,感触颇多。
从开始什么都不会做,到最后的熟练地操作调试这一工作,的确,我收获了很多很多。
首先感谢段老师,很亲近学生。
不管哪个水平的学生都付出了无微不至的关怀,这是让我很感动的事情。
在最关键的时候没有放弃我。
最终还是要感谢自己,一个不肯放弃自己的人,终究还是要继续取得自己的小目标的,这学期结束报名计算机考试。