【50分】c语言程序优化

发布网友 发布时间:2022-04-27 00:14

我来回答

2个回答

热心网友 时间:2022-06-21 07:22

本题一个完整的c程序如下,在win-tc和Dev-c++下调试通过。
这里没有使用结构体,也可以改写为结构体。这里利用的是交换数组的编号,同时程序可以判断当输入职工号重复时,提醒重新输入,效果不错。
/*职工管理系统
该系统的功能包括输入、排序、查找。主程序中包括3个函数其中input()函数的功能是:
输入职工的姓名和职工号。sort()函数的功能是:按职工号由小到大排序,姓名顺序也随之调整。 search()函数的功能是:根据主函数提供的职工号进行查找,若找到该职工则输出对应职工的姓名, 若找不到则输出“not find”。
*/
#include<stdio.h>
#include"string.h"
#define NUMMAX 100
int order[NUMMAX];
void input(int a[],char b[][20],int n)
{
int i=0,j,k,flag;
do
{ flag=0;
printf("please input No.%d worker's code:\n",i+1);
scanf("%d",&a[i]);
printf("please input No.%d worker's name:\n",i+1);
scanf("%s",b[i]);
for(j=0;j<i;j++)
{ for(k=j+1;k<i+1;k++)
if(a[k]==a[j])
{ printf("The code has been inputted! Please input again!\n");
flag=1;
break; /*如有重复立即退出该层循环,提高判断速度*/
}
if(flag==1)
break; /*如有重复立即退出该层循环,提高判断速度*/
}
if(flag==0)
{ order[i]=i;
i++;
}
}while(i<n);
}

void sort(int a[],int n)
{
int i,j,k;
char t[20];
for(i=0;i<n-1;i++) /* 选择排序 */
for(j=i+1;j<n;j++)
if(a[order[i]]>a[order[j]]) /* 交换的是次序不是元素 */
{k=order[i]; /* 这是处理不用结构体使数据一起移动的一种好方法 */
order[i]=order[j];
order[j]=k;
}
}

void search(int n,int num,int a[],char b[][20])
{int i,flag=0;
for(i=0;i<n;i++)
if(num==a[order[i]])
{printf("The worker you find is:%s\n",b[order[i]]);
flag=1;
}
if(flag==0)
printf("Not find!\n");
}

int main()
{
char c,name[NUMMAX][20]; /*职工号数值应在int可以表示的范围内*/
int i,n,code[NUMMAX],num,flag=1;
printf("please input number of workers(<100):\n");
scanf("%d",&n);
input(code,name,n);
sort(code,n);
printf("The sequence of workers after sort are:\n");
for(i=0;i<n;i++)
printf("%-10d%s\n",code[order[i]],name[order[i]]);
while(flag==1)
{
printf("\nInput code to search:");
scanf("%d",&num);
search(n,num,code,name);
printf("\ncontinue or not(Y/N)?");
c=getch();
if(c=='N'||c=='n')
flag=0;
}
return 0;
}

参考资料:如果使用结构体请参阅http://zhidao.baidu.com/question/80443544.html

热心网友 时间:2022-06-21 07:22

int num[NUMMAX]; 这个在程序中没用上,可以去掉
另外你这里sort()只是实现了按序输出功能,根本不涉及排序

初始输入数假如超过NUMMAX的话,会溢出
还是加入一个循环判断吧,假如不超过就继续,超过就重新输入

还有不清楚你想优化什么,想怎么优化……

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com