对于程序的要求:(1)题目要求中的具体数值,要尽量参数化;(2)分函数,不能都写在main()里,IPO过程本身代表的就是函数;(3)要有一个操作的菜单;void showMenu() { while(1) { /* 显示一个菜单 / printf( 1 - ...) cout<<"hello"<<endl; /* 做出选择 */ do { scanf(...) cin>>x; while(sel<0 || sel>最大菜单); / 响应选择 / switch(sel) { case 1: fun1(); break; case 2: fun2(); break; } / 暂停 */ system("pause");` system("cls"); }}(4)要设计读写文本文件的操作FILE *fp;fp = fopen("D;\hello.txt", "w");fprintf(fp, "Hello, world.");fclose(fp):参考博客:https://blog.csdn.net/phynix1977/article/details/45919093论文的要求:(6)绘图建议用visio
一:如何写出至少150行代码,多次尝试自己各处找的资源都无法达到这个要求
二:对于二分法与其他方法的结合与优化不太熟练程序报错
二分法用来干啥? 二分法插入排序吗?
运行结果及代码如下:
(1)菜单
(2)读取文件数据,文件数据以空格分隔
(3)排序并输出第K大的数
(4)排序结果写入文件
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//打印数组
void showArray(int arr[],int len)
{
int i = 0;
for(;i<len;i++)
{
if(i<len-1)
printf("%d ",arr[i]);
else
printf("%d\n",arr[i]);
}
}
void Merge(int R[], int low, int m, int high)
{
//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
int i = low, j = m + 1, p = 0; //置初始值
int* R1; //R1是局部向量
R1 = (int*)malloc((high - low + 1) * sizeof(int));
if (!R1)
{
return; //申请空间失败
}
while (i <= m && j <= high) //两子文件非空时取其小者输出到R1[p]上
{
R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];
}
while (i <= m) //若第1个子文件非空,则复制剩余记录到R1中
{
R1[p++] = R[i++];
}
while (j <= high) //若第2个子文件非空,则复制剩余记录到R1中
{
R1[p++] = R[j++];
}
for (p = 0, i = low; i <= high; p++, i++)
{
R[i] = R1[p]; //归并完成后将结果复制回R[low..high]
}
free(R1);
}
void MergeSort(int R[], int low, int high)
{
//用分治法对R[low..high]进行二路归并排序
int mid;
if (low < high)
{ //区间长度大于1
mid = (low + high) / 2; //分解
MergeSort(R, low, mid); //递归地对R[low..mid]排序
MergeSort(R, mid + 1, high); //递归地对R[mid+1..high]排序
Merge(R, low, mid, high); //组合,将两个有序区归并为一个有序区
}
}
//从文件读取数组数据
void readData(int a[],int *len)
{
FILE* fp = fopen("data.txt","r");
int i = 0;
*len = 0;
if(fp == 0)
{
printf("文件读取失败!\n");
return;
}
while(!feof(fp))
{
if(fscanf(fp,"%d",&a[i]))
i++;
}
*len = i;
fclose(fp);
}
//随机生成数组数据
void randData(int a[],int len)
{
int i;
for(i=0;i<len;i++)
a[i] = rand()%200; //生成0-199的随机数
}
//写入文件
void writeFile(int a[],int len)
{
FILE* fp = fopen("sortdata.txt","w");
for(int i = 0;i<len;i++)
{
if(i<len-1)
fprintf(fp,"%d ",a[i]);
else
fprintf(fp,"%d",a[i]);
}
fclose(fp);
}
//
void showMenu()
{
int sel;
int a[10];
int nmb=0;
int k;
while(1)
{
printf("1.读取数据文件\n"); //数组数据从文件中读取
printf("2.数据随机生成\n"); //数组数据随机生成
printf("3.排序并找出第K大的数\n");
printf("4.排序结果写入文件\n");
printf("0.退出程序\n");
printf("请选择:");
scanf("%d",&sel);
switch(sel)
{
case 0:
return;
case 1:
readData(a,&nmb);
printf("读取的数据为:");
showArray(a,nmb);
break;
case 2:
nmb = 10;
randData(a,nmb);
printf("随机生成的数据为:");
showArray(a,nmb);
break;
case 3:
printf("请输入K(1-%d):",nmb);
scanf("%d",&k);
if(k>nmb)
{
printf("k大于数组长度\n");
}else
{
MergeSort(a,0,nmb-1);
printf("排序后数据为:");
showArray(a,nmb);
printf("第%d大的数是:%d\n",k,a[nmb-k]);
}
break;
case 4:
writeFile(a,nmb);
printf("排序结果写入sortdata.txt成功!\n");
break;
}
system("pause"); //暂停
system("cls"); //清屏
}
}
int main()
{
srand((unsigned int)time(NULL));
showMenu();
return 0;
}
看看https://wk.baidu.com/view/2eef38190a12a21614791711cc7931b765ce7be3
对数组排个序,下标为k-1就是你要的数了。
1、排序
2、拿到下标为k-1的值
拿去吧
#include<stdio.h>
int main(){
int a[10000];
int n,temp,i,k,j;
printf("请输入你要输入的数的个数n:\n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[j]<a[i]){
temp=a[j];
a[j]=a[i];
a[i]=temp;}
}
}
printf("请输入你要的到第几小/大的数K:\n");
scanf("%d",&k);
printf("第%d大的数为%d\n",k,a[k-1]);
printf("第%d小的数为%d\n",k,a[n-k]);
return 0;
}