首页上一页 1 下一页尾页 1 条记录 1/1页
C语言改错
发表在C语言图书答疑
2015-04-07
是否精华
是
否
版块置顶:
是
否
运行出现错误不知怎么改。。
#include <stdio.h>//标准输入输出头文件
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <time.h>//定义关于时间的函数
#define N 20000
clock_t Start,Now;//时钟
void Wrong()//错误输出
{
printf("n*****按键错误!请重新输入*****n");
getchar();//从标准输入获取字符并返回下一个字符
}
void change(int a[])//十个一行输出
{
int i;
system("cls");//清除之前的操作
for(i=0;i<N;i++)
{
if((i-1)==9)
printf("n");
printf("%-7d",a[i]);
}
}
//二分插入排序
void Sort_efcr (int a[],int p)
{
int t,i,j,low,high,mid;
for(i=2;i<N;i++)
{
t=a[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>t)
high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=t;
}
}
//插入排序
void Sort_charu (int a[],int p)
{
int i,j,temp;
for(i=1;i<N;i++)
{
temp=a[i];//设置监视哨
for(j=i;j>0&&a[j-1]>temp;j--)//寻找位置插入
a[j]=a[j-1];//交换
a[j]=temp;
}
}
//选择排序
void sort_xz(int a[],int p)
{
int i,j,k;
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)//寻找最小的记录序号
if(a[j]<a[k])
k=j;//记录
if(k!=i)
{
int temp;
temp=a[k];
a[k]=a[i];
a[i]=temp;
}//交换
}
}
void sort_mp(int a[],int p)
{
int i,j,temp;
for (i=0;i<N-1;i++)
{
for (j=N-1;j>i;j--)
if (a[j]<a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
void creatheap(int a[],int i,int n) //创建堆
{
int j;
int t;
t=a[i];//堆顶元素暂存
j=2*(i+1)-1;
while(j<=n)//堆顶元素下筛
{
if((j<n)&&(a[j]<a[j+1]))//确定下筛位置
j++;
if(t<a[j])
{
a[i]=a[j];
i=j;
j=2*(i+1)-1;
}//a[j]往堆顶方向移
else
j=n+1;
}
a[i]=t;
}//不移动,返回堆顶
void sort_d(int a[],int n,int p) //堆排序
{
int i;
int t;
for(i=n/2-1;i>=0;i--)//在序列的中间位置找一个数做堆顶
creatheap(a,i,n-1);
for(i=n-1;i>=1;i--)//n-1次筛选
{
t=a[0];
a[0]=a[i];
a[i]=t;
creatheap(a,0,i-1);}
}
//插入排序时间
double TSort_charu(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];//函数值的调用
Start=clock();
Sort_charu(b,p); //执行算法
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出
printf("n用直接插入排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:直接插入排序.txt","w");//在f盘保存一个文本文件
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
//选择排序时间
double Tsort_xz(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_xz(b,p);//执行函数
if(p!=6)
{change(b);getchar();}
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
printf("n用直接选择排序法用的时间为%f秒;",time);
FILE *fp;//文件指针
fp=fopen("F:直接选择排序.txt","w"); //存档
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);//读写一个文档
fclose(fp);
return(time);
}
//冒泡排序时间
double Tsort_mp(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_mp(b,p);
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}
printf("n用冒泡排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:冒泡排序.txt","w");
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
//二分插入排序时间
double TSort_efcr(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];//函数值的调用
Start=clock();
Sort_efcr(b,p); //执行算法
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出
printf("n用二分插入排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:二分插入排序.txt","w");//在f盘保存一个文本文件
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
double Tsort_d(int a[],int n,int p)//堆排序时间
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_d(b,N,p);
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}
printf("n用堆排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:堆排序.txt","w");
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);return(time);
}
void BubleSort(double a[]) //时间数组的排序(冒泡)
{
int i,j;
double temp;
for(i=1;i<6;i++)
{
for(j=4;j>=i;j--)
if(a[j+1]<a[j])
{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
void menu()
{
printf(" n");
printf(" ***************************尊敬的用户您好*************************** n");
printf(" ********************************************************************* n");
printf(" n");
printf(" ************** 1:直接插入排序 ***********n");
printf(" ************** 2:直接选择排序 ***********n");
printf(" ************** 3:冒泡排序 ***********n");
printf(" ************** 4:二分插入排序 ***********n");
printf(" ************** 5:堆排序 ***********n");
printf(" ************** 6:时间效率比较 ***********n");
printf(" ************** 7:显示随机数 ***********n");
printf(" ************** 0:退出 ***********n");
printf(" n");
printf(" ******************************************************************** n");
}
void main()
{
int i,p,a[N];
double TIMES[5],TIMES1[5];//时间数组
srand((int)time(NULL));
for(i=0;i<N;i++)
a[i]=rand() 000+1; //随机为数组赋值
//循环执行,直到按0退出
while(1)
{
system("cls");
menu(); //显示选择界面
scanf("%d",&p); //等待输入
//输入0退出
if(p==0)
{
printf(" ************************谢谢!欢迎下次使用*************************!n");
getchar();
break;
}
//判断输入值,选择相应的操作
switch(p)
{
case 1:TSort_charu(a,p);printf("n请按任意键继续...");getchar();break;
case 2:Tsort_xz(a,p);printf("n请按任意键继续...");getchar();break;
case 3:Tsort_mp(a,p);printf("n请按任意键继续...");getchar();break;
case 4:TSort_efcr(a,p);printf("n请按任意键继续...");getchar();break;
case 5:Tsort_d(a,N,p);printf("n请按任意键继续...");getchar();break;
case 6:system("cls");
TIMES1[1]=TIMES[1]=TSort_charu(a,p);
TIMES1[2]=TIMES[2]=Tsort_xz(a,p);
TIMES1[3]=TIMES[3]=Tsort_mp(a,p);
TIMES1[4]=TIMES[4]=TSort_efcr(a,p);
TIMES1[5]=TIMES[5]=Tsort_d(a,N,p);
getchar();
BubleSort(TIMES);
printf("nn");
{
printf("排序这组数据两种较快的排序法分别是:n");
if(TIMES[1]==TIMES1[1]) printf("直接插入排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[2]) printf("直接选择排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[3]) printf("冒泡排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[4]) printf("二分插入排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[5]) printf("堆排序:%f秒!n",TIMES[1]);
if(TIMES[1]!=TIMES[2])
{
if(TIMES[2]==TIMES1[1]) printf("直接插入排序:%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[2]) printf("直接选择排序%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[3]) printf("冒泡排序%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[4]) printf("二分插入排序:%f秒!n",TIMES[1]);
if(TIMES[2]==TIMES1[5]) printf("堆排序%f秒!n",TIMES[2]);
}
}
printf("n请按任意键继续...");
srand((int)time(NULL));
for(i=0;i<N;i++)
{
a[i]=rand() 000+1;
}
getchar();break;
case 7:change(a);
FILE *fp;
fp=fopen("E:随机数.txt","w");
for(i=0;i<N;i++) fprintf(fp,"%d ",a[i]);
fclose(fp);getchar();
printf("n请按任意键继续...");
getchar();break;
default:Wrong();
getchar();break;
}
}
}
#include <stdio.h>//标准输入输出头文件
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <time.h>//定义关于时间的函数
#define N 20000
clock_t Start,Now;//时钟
void Wrong()//错误输出
{
printf("n*****按键错误!请重新输入*****n");
getchar();//从标准输入获取字符并返回下一个字符
}
void change(int a[])//十个一行输出
{
int i;
system("cls");//清除之前的操作
for(i=0;i<N;i++)
{
if((i-1)==9)
printf("n");
printf("%-7d",a[i]);
}
}
//二分插入排序
void Sort_efcr (int a[],int p)
{
int t,i,j,low,high,mid;
for(i=2;i<N;i++)
{
t=a[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>t)
high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=low;j--)
a[j+1]=a[j];
a[low]=t;
}
}
//插入排序
void Sort_charu (int a[],int p)
{
int i,j,temp;
for(i=1;i<N;i++)
{
temp=a[i];//设置监视哨
for(j=i;j>0&&a[j-1]>temp;j--)//寻找位置插入
a[j]=a[j-1];//交换
a[j]=temp;
}
}
//选择排序
void sort_xz(int a[],int p)
{
int i,j,k;
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)//寻找最小的记录序号
if(a[j]<a[k])
k=j;//记录
if(k!=i)
{
int temp;
temp=a[k];
a[k]=a[i];
a[i]=temp;
}//交换
}
}
void sort_mp(int a[],int p)
{
int i,j,temp;
for (i=0;i<N-1;i++)
{
for (j=N-1;j>i;j--)
if (a[j]<a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
void creatheap(int a[],int i,int n) //创建堆
{
int j;
int t;
t=a[i];//堆顶元素暂存
j=2*(i+1)-1;
while(j<=n)//堆顶元素下筛
{
if((j<n)&&(a[j]<a[j+1]))//确定下筛位置
j++;
if(t<a[j])
{
a[i]=a[j];
i=j;
j=2*(i+1)-1;
}//a[j]往堆顶方向移
else
j=n+1;
}
a[i]=t;
}//不移动,返回堆顶
void sort_d(int a[],int n,int p) //堆排序
{
int i;
int t;
for(i=n/2-1;i>=0;i--)//在序列的中间位置找一个数做堆顶
creatheap(a,i,n-1);
for(i=n-1;i>=1;i--)//n-1次筛选
{
t=a[0];
a[0]=a[i];
a[i]=t;
creatheap(a,0,i-1);}
}
//插入排序时间
double TSort_charu(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];//函数值的调用
Start=clock();
Sort_charu(b,p); //执行算法
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出
printf("n用直接插入排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:直接插入排序.txt","w");//在f盘保存一个文本文件
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
//选择排序时间
double Tsort_xz(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_xz(b,p);//执行函数
if(p!=6)
{change(b);getchar();}
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
printf("n用直接选择排序法用的时间为%f秒;",time);
FILE *fp;//文件指针
fp=fopen("F:直接选择排序.txt","w"); //存档
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);//读写一个文档
fclose(fp);
return(time);
}
//冒泡排序时间
double Tsort_mp(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_mp(b,p);
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}
printf("n用冒泡排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:冒泡排序.txt","w");
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
//二分插入排序时间
double TSort_efcr(int a[],int p)
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];//函数值的调用
Start=clock();
Sort_efcr(b,p); //执行算法
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}//如果用户输入选择不为计算时钟,则要选择换行输出
printf("n用二分插入排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:二分插入排序.txt","w");//在f盘保存一个文本文件
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);
return(time);
}
double Tsort_d(int a[],int n,int p)//堆排序时间
{
int i;double time;
int b[N];
for(i=0;i<N;i++)
b[i]=a[i];
Start=clock();
sort_d(b,N,p);
Now=clock();
time=((double)(Now- Start))/CLK_TCK;//执行算法前后的时间差
if(p!=6)
{change(b);getchar();}
printf("n用堆排序法用的时间为%f秒;",time);
FILE *fp;
fp=fopen("E:堆排序.txt","w");
for(i=0;i<N;i++)
fprintf(fp,"%d ",b[i]);
fclose(fp);return(time);
}
void BubleSort(double a[]) //时间数组的排序(冒泡)
{
int i,j;
double temp;
for(i=1;i<6;i++)
{
for(j=4;j>=i;j--)
if(a[j+1]<a[j])
{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
void menu()
{
printf(" n");
printf(" ***************************尊敬的用户您好*************************** n");
printf(" ********************************************************************* n");
printf(" n");
printf(" ************** 1:直接插入排序 ***********n");
printf(" ************** 2:直接选择排序 ***********n");
printf(" ************** 3:冒泡排序 ***********n");
printf(" ************** 4:二分插入排序 ***********n");
printf(" ************** 5:堆排序 ***********n");
printf(" ************** 6:时间效率比较 ***********n");
printf(" ************** 7:显示随机数 ***********n");
printf(" ************** 0:退出 ***********n");
printf(" n");
printf(" ******************************************************************** n");
}
void main()
{
int i,p,a[N];
double TIMES[5],TIMES1[5];//时间数组
srand((int)time(NULL));
for(i=0;i<N;i++)
a[i]=rand() 000+1; //随机为数组赋值
//循环执行,直到按0退出
while(1)
{
system("cls");
menu(); //显示选择界面
scanf("%d",&p); //等待输入
//输入0退出
if(p==0)
{
printf(" ************************谢谢!欢迎下次使用*************************!n");
getchar();
break;
}
//判断输入值,选择相应的操作
switch(p)
{
case 1:TSort_charu(a,p);printf("n请按任意键继续...");getchar();break;
case 2:Tsort_xz(a,p);printf("n请按任意键继续...");getchar();break;
case 3:Tsort_mp(a,p);printf("n请按任意键继续...");getchar();break;
case 4:TSort_efcr(a,p);printf("n请按任意键继续...");getchar();break;
case 5:Tsort_d(a,N,p);printf("n请按任意键继续...");getchar();break;
case 6:system("cls");
TIMES1[1]=TIMES[1]=TSort_charu(a,p);
TIMES1[2]=TIMES[2]=Tsort_xz(a,p);
TIMES1[3]=TIMES[3]=Tsort_mp(a,p);
TIMES1[4]=TIMES[4]=TSort_efcr(a,p);
TIMES1[5]=TIMES[5]=Tsort_d(a,N,p);
getchar();
BubleSort(TIMES);
printf("nn");
{
printf("排序这组数据两种较快的排序法分别是:n");
if(TIMES[1]==TIMES1[1]) printf("直接插入排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[2]) printf("直接选择排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[3]) printf("冒泡排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[4]) printf("二分插入排序:%f秒!n",TIMES[1]);
if(TIMES[1]==TIMES1[5]) printf("堆排序:%f秒!n",TIMES[1]);
if(TIMES[1]!=TIMES[2])
{
if(TIMES[2]==TIMES1[1]) printf("直接插入排序:%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[2]) printf("直接选择排序%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[3]) printf("冒泡排序%f秒!n",TIMES[2]);
if(TIMES[2]==TIMES1[4]) printf("二分插入排序:%f秒!n",TIMES[1]);
if(TIMES[2]==TIMES1[5]) printf("堆排序%f秒!n",TIMES[2]);
}
}
printf("n请按任意键继续...");
srand((int)time(NULL));
for(i=0;i<N;i++)
{
a[i]=rand() 000+1;
}
getchar();break;
case 7:change(a);
FILE *fp;
fp=fopen("E:随机数.txt","w");
for(i=0;i<N;i++) fprintf(fp,"%d ",a[i]);
fclose(fp);getchar();
printf("n请按任意键继续...");
getchar();break;
default:Wrong();
getchar();break;
}
}
}