晚拂漾 2022-05-28 01:33 采纳率: 0%
浏览 77
已结题

大一C语言 寻找第K大的数

对于程序的要求:(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行代码,多次尝试自己各处找的资源都无法达到这个要求
二:对于二分法与其他方法的结合与优化不太熟练程序报错

  • 写回答

5条回答

  • qfl_sdu 2022-05-28 08:11
    关注
    获得5.00元问题酬金

    二分法用来干啥? 二分法插入排序吗?
    运行结果及代码如下:
    (1)菜单

    img

    (2)读取文件数据,文件数据以空格分隔

    img

    (3)排序并输出第K大的数

    img

    (4)排序结果写入文件

    img

    代码:

    #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;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧