#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;
}
大家都知道一个字符占用一个字节,无符号字符型的范围是从0~255,而有符号字符型的范围是-128~127,那么对于有符号字符型而言,大于127或小于-128的数该怎么存储呢?请您往下欣赏:
以-129为例,我向大家展示一下吧
整数存的是源码,而负数存的是补码,所以说要存储-129,得先算出它的补码。
源码 本该是 1 1000 0001,但由于一个字节只能存储8位二进制数,所以源码为 1000 0001;反码为源码的除符号位之外,其余取反,0111 1110 即为反码;补码为反码+1,所以补码为0111 1111,原来-129在字符数组中存储的是127。
对于正数而言,源码反码补码都是一样的。