谭浩强C语言第五版课后练习题7-15

`## C语言练习题

  • 写几个函数:
    1、输入职工姓名和职工号
    2、按职工号从小到大排序
    3、输入职工号,用折半查找法找出姓名并输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 10

int main()
{

    void input_s(int s[],char [][8]);//函数声明
    void sort_sno(int s[],char [][8]);//函数声明
    void search_sno(int key,int s[],char [][8]);//函数声明
    int c,number;//定义查找关键字
    int s[M];//全局数组
    char name[M][8];//全局数组
    while(1)
    {


        printf("*****************MENU******************\n");
        printf("0:录入职工信息\n");
        printf("1:按职工号排序\n");
        printf("2:查找职工\n");
        printf("3:退出\n");
        printf("please choose:");
        scanf("%d",&c);
        switch(c)
        {
        case 0:
            input_s(s,name);//函数调用
            break;
        case 1:
            sort_sno(s,name);//函数调用
            break;
        case 2:
            printf("input sno you wnat to search:");
            scanf("%d",&number);
            search_sno(number,s,name);//函数调用
            break;
        case 3:
            exit(1);//退出系统
        default:
            break;
        }
    }
    return 0;
}
void input_s(int s[M],char name[][8])//录入职工信息
{
    int i;
    for(i=0; i<M; i++)
    {
        printf("input sno:");
        scanf("%d",&s[i]);
        printf("input name:");
        getchar();//
        gets(name[i]);
    }
}
void sort_sno(int s[M],char name[][8])//
{

    int i,j,temp;
    char tem[8];
    for(i=0; i<M; i++)//冒泡排序
        for(j=0; j<M-i; j++)
            if(s[j]>s[j+1])
            {
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
                strcpy(tem,name[j]);//字符串赋值,等号赋值只适用于单个字符(用'='需要for循环)
                strcpy(name[j],name[j+1]);//同上
                strcpy(name[j+1],tem);//同上
            }
    printf("staff sorted by sno:\n");
    for(i=0; i<M; i++)
        printf("%4d  %5s\n",s[i],name[i]);
}

void search_sno(int key,int s[M],char name[][8])//找职工
{
    int top,bot,mid,loca,flag;
    bot=0;
    top=M-1;
    loca=0;//定义位置
    flag=1;//标记
    if((key<s[0])||(key>s[M-1]));//看关键字是否在范围内,不在可直接判断出答案
    loca=-1;
    while((bot<=top)&&(flag==1))//折半查找法
    {
        mid=(bot+top)/2;
        if(key==s[mid])
        {
            loca=mid;
            printf("sno.%d,his name is %s\n",key,name[loca]);
            flag=-1;
        }
        else
        {
            if(key>s[mid])//取右半区间
                bot=mid+1;
            else
                top=mid-1;//取左半区间
        }
    }
    if(flag==1||loca==-1)
        printf("查无此人\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值