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


#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;
}

基于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;
}


你的英文捉急啊
data 数据
date 日期

供参考


#include <stdio.h>
int cnt = 10;        // 数组中使用元素的数量
const int SIZE = 20; // 数组总大小

float func1(int *arr)
{
    float sum = 0; //
    for (int i = 0; i < cnt; i++)
        sum += arr[i];
    sum = sum / cnt;
    return sum;
}
void func2(int *arr)
{
    int i, j, t;
    for (i = 0; i < cnt - 1; i++)
    {
        for (j = 0; j < cnt - i - 1; j++)
        {
            if (arr[j] < arr[j + 1])
            {
                t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
}

int func3(int *arr, int x, int date)
{
    if (x < 1 || x > cnt + 1 || x >= SIZE)
    {
        printf("要插入的位置超出数组范围!\n");
        return 0;
    }
    int i;
    for (i = cnt - 1; i >= x - 1; i--)
        arr[i + 1] = arr[i];
    arr[x - 1] = date;
    cnt++; // 插入后有效元素+1
    return 1;
}

int func4(int *arr, int out)
{
    if (out < 1 || out > cnt || out >= SIZE)
    {
        printf("要删除的位置超出数组范围!\n");
        return 0;
    }
    int i;
    for (i = out - 1; i < cnt; i++)
        arr[i] = arr[i + 1];
    cnt--;
    return 1;
}

void print(int *arr)
{
    for (int i = 0; i < cnt; i++)
        printf("%3d ", arr[i]);
    printf("\n");
}

void menu()
{
    printf("**欢迎使用系统!!!*********\n");
    printf("***1.求数组平均值*********\n");
    printf("***2.数组元素降序排序*****\n");
    printf("***3.数组添加元素*********\n");
    printf("***4.数组删减元素*********\n");
    printf("**************************\n");
    printf("**请选择要使用的功能:*****\n");
}
int main()
{
    int arr[SIZE]; // 有添加操作,数组要大一点
    int i, index, in, out, date;
    float aver;
    printf("请输入数组的元素:\n");
    for (i = 0; i < cnt; i++)
        scanf("%d", &arr[i]);

    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");
            print(arr);
            break;
        case 3:
            printf("请输入要插入的位置和元素:\n");
            scanf("%d%d", &in, &date);
            if (func3(arr, in, date))
                print(arr);

            break;
        case 4:
            printf("请输入要删除的位置:\n");
            scanf("%d", &out);
            if (func4(arr, out))
                print(arr);
            break;
        default:
            printf("输入错误,重新输入:\n");
        }
        printf("请继续选择实现的功能:\n");
        scanf("%d", &index);
    }
    return 0;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7547411
  • 这篇博客也不错, 你可以看下一种不依赖计时器的键盘长按,双击实现
  • 除此之外, 这篇博客: 整型在字符数组中的存储中的 首先我们来讨论一下字符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 大家都知道一个字符占用一个字节,无符号字符型的范围是从0~255,而有符号字符型的范围是-128~127,那么对于有符号字符型而言,大于127或小于-128的数该怎么存储呢?请您往下欣赏:

    以-129为例,我向大家展示一下吧
    整数存的是源码,而负数存的是补码,所以说要存储-129,得先算出它的补码。
    源码 本该是 1 1000 0001,但由于一个字节只能存储8位二进制数,所以源码为 1000 0001;反码为源码的除符号位之外,其余取反,0111 1110 即为反码;补码为反码+1,所以补码为0111 1111,原来-129在字符数组中存储的是127。
    对于正数而言,源码反码补码都是一样的。

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 无处不在的链表小节, 巩固相关知识点