Sakura_j_h_ 2023-05-07 10:53 采纳率: 25%
浏览 46
已结题

能不能给我这个数组系统优化一下啊,谢谢你们啊


#include<stdio.h>
float func1(int *arr)
{
    int i,sum;
    float ave;
    for(i=0;i<10;i++)
    sum+=arr[i];
    ave=sum/10.0;
    return ave;
}
void func2(int *arr)
{
    int i,j,t;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9-i;j++)
        {
            if(arr[j]<arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}
void func3(int *arr,int x,int data)
{
    int i;
    for(i=9;i>=x;i--)
    arr[i+1]=arr[i];
    arr[x]=data;
}
void func4(int *arr,int out)
{
    int i;
    for(i = out; i < 9; i++) {
        arr[i] = arr[i+1];
    }   
}
void menu()
{
    printf("**欢迎使用系统!!!*********\n");
    printf("***1.求数组平均值*********\n");
    printf("***2.数组元素降序排序*****\n");
    printf("***3.数组添加元素*********\n");
    printf("***4.数组删减元素*********\n");
    printf("**************************\n");
    printf("**请选择要使用的功能:*****\n");
}
int main()
{
     int arr[10];
     int i,index,in,out,data;
     float aver;
     printf("请输入数组的元素:\n");
     for(i=0;i<10;i++)
     scanf("%d",&arr[i]);
     
    for(i=0;i<10;i++)
    printf("%d ",arr[i]); 
    printf("\n");
    menu();
    printf("请输入你要选择的功能:\n");
    scanf("%d",&index);
    while(index>0&&index<5)
     {
         switch(index)
         {
             case 1:
                 aver=func1(arr);
                 printf("数组元素平均值为:%lf\n",aver);
                 break;
             case 2:
                 func2(arr);
                 printf("降序后的结果为:\n");
                 for(i=0;i<10;i++)
                 printf("%3d",arr[i]);
                 break;
             case 3:
                 printf("请输入要插入的位置和元素:\n");
                 scanf("%d %d",&in,&data);
                 func3(arr,in,data);
                 for(i=0;i<11;i++)
                 printf("%3d",arr[i]);
                 printf("\n");
                 break;
                 break;
             case 4:
                 printf("请输入要删除的位置:\n");
                 scanf("%d",&out);
                 func4(arr,out);
                 for(i=0;i<9;i++)
                 printf("%3d",arr[i]);
                 printf("\n");
                 break;
                 break;
             default:
                 printf("输入错误,重新输入:\n");
        }
        printf("请继续选择实现的功能:\n");
        scanf("%d",&index);
     }
     return 0;
}
  • 写回答

4条回答 默认 最新

  • 语言-逆行者 2023-05-07 11:37
    关注

    基于new bing的建议:以下是对这个数组系统的一些优化建议:

    1、在定义 sum 变量时,应该进行初始化。如果不初始化,可能会得到一个随机值,导致计算出错。

    2、在函数 func2 中,使用了类似于冒泡排序的方法对数组进行排序。但是这种方法是比较慢的,时间复杂度为O(n^2),数组规模较大时会很耗时。推荐使用快速排序算法(Quick Sort),时间复杂度为平均情况下的O(nlogn),效率更高。
    3、在函数 func3 和 func4 中,采用的是挪动元素的方法来实现插入和删除操作。这种方法虽然简单易懂,但也比较慢,时间复杂度为O(n),推荐使用单向链表(Single Linked List)或双向链表(Double Linked List)来实现插入和删除操作,时间复杂度为O(1)
    4.在菜单 menu 函数中,最好对用户输入进行校验。如限制用户只能输入 1-4 之间的数字,避免用户输入无效内容。

    5.在输入数组元素时,最好进行数据有效性校验,如限制输入的元素在某一合法范围内,避免非法数据的出现。

    6.最后,在代码中加入注释可以让阅读者更好的理解代码,增加代码的可读性。

    综上所述,对于这个数组系统,可以进行如下的优化:

    #include <stdio.h>
    
    // 求数组平均值
    float func1(int *arr) {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += arr[i];
        }
        float ave = sum / 10.0f;
        return ave;
    }
    
    // 快速排序
    void quicksort(int *arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int i = left, j = right;
        int key = arr[left];
        while (i < j) {
            while (i < j && arr[j] <= key) {
                j--;
            }
            arr[i] = arr[j];
            while (i < j && arr[i] >= key) {
                i++;
            }
            arr[j] = arr[i];
        }
        arr[i] = key;
        quicksort(arr, left, i - 1);
        quicksort(arr, i + 1, right);
    }
    
    // 数组元素降序排序
    void func2(int *arr) {
        quicksort(arr, 0, 9);
    }
    
    // 数组添加元素,使用单向链表实现
    typedef struct node {
        int data;
        struct node *next;
    } Node;
    
    void func3(Node **head, int index, int data) {
        Node *p = malloc(sizeof(Node));
        p->data = data;
        if (index == 0) {
            p->next = *head;
            *head = p;
        } else {
            Node *q = *head;
            for (int i = 0; i < index - 1; i++) {
                q = q->next;
            }
            p->next = q->next;
            q->next = p;
        }
    }
    
    // 数组删除元素,使用双向链表实现
    typedef struct dnode {
        int data;
        struct dnode *prev;
        struct dnode *next;
    } DNode;
    
    void func4(DNode **head, int index) {
        if (index == 0) {
            DNode *p = *head;
            *head = p->next;
            if (p->next != NULL) {
                p->next->prev = NULL;
            }
            free(p);
        } else {
            DNode *p = *head;
            for (int i = 0; i < index; i++) {
                p = p->next;
            }
            p->prev->next = p->next;
            if (p->next != NULL) {
                p->next->prev = p->prev;
            }
            free(p);
        }
    }
    
    // 菜单
    void menu() {
        printf("**欢迎使用系统!!!*********\n");
        printf("***1.求数组平均值*********\n");
        printf("***2.数组元素降序排序*****\n");
        printf("***3.数组添加元素*********\n");
        printf("***4.数组删减元素*********\n");
        printf("**************************\n");
        printf("**请选择要使用的功能:*****\n");
    }
    
    int main() {
        int arr[10];
        int i, index, in, out, date;
        float aver;
        printf("请输入数组的元素:\n");
        for (i = 0; i < 10; i++) {
            scanf("%d", &arr[i]);
        }
    
        for (i = 0; i < 10; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    
        menu();
        printf("请输入你要选择的功能:\n");
        scanf("%d", &index);
        while (index > 0 && index < 5) {
            switch (index) {
                case 1:
                    aver = func1(arr);
                    printf("数组元素平均值为:%lf\n", aver);
                    break;
                case 2:
                    func2(arr);
                    printf("降序后的结果为:\n");
                    for (i = 0; i < 10; i++) {
                        printf("%3d", arr[i]);
                    }
                    break;
                case 3:
                    printf("请输入要插入的位置和元素:\n");
                    scanf("%d %d", &in, &date);
                    Node *head = NULL;
                    for (i = 0; i < 10; i++) {
                        func3(&head, i, arr[i]);
                    }
                    func3(&head, in, date);
                    Node *p = head;
                    while (p != NULL) {
                        printf("%3d", p->data);
                        p = p->next;
                    }
                    printf("\n");
                    break;
                case 4:
                    printf("请输入要删除的位置:\n");
                    scanf("%d", &out);
                    DNode *dhead = malloc(sizeof(DNode));
                    dhead->data = arr[0];
                    dhead->prev = NULL;
                    dhead->next = NULL;
                    DNode *p1 = dhead;
                    for (i = 1; i < 10; i++) {
                        DNode *q = malloc(sizeof(DNode));
                        q->data = arr[i];
                        q->prev = p1;
                        q->next = NULL;
                        p1->next = q;
                        p1 = q;
                    }
                    func4(&dhead, out);
                    p1 = dhead;
                    while (p1 != NULL) {
                        printf("%3d", p1->data);
                        p1 = p1->next;
                    }
                    printf("\n");
                    break;
                default:
                    printf("输入错误,重新输入:\n");
            }
            printf("请继续选择实现的功能:\n");
            scanf("%d", &index);
        }
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 请采纳用户回复 5月8日
  • 修改了问题 5月7日
  • 展开全部

悬赏问题

  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?
  • ¥15 Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?