zl程序教程

您现在的位置是:首页 >  其他

当前栏目

习题 7.15 写几个函数:1.输入10个职工的姓名和职工号;2.按职工号由小到大顺序排序,姓名顺序也随之调整;。。。

输入排序 函数 10 几个 顺序 调整 习题
2023-09-14 09:06:57 时间

C程序设计(第四版) 谭浩强 习题7.15 个人设计

习题 7.15 写几个函数:

1. 输入10个职工的姓名和职工号;

2. 按职工号由小到大顺序排序,姓名顺序也随之调整;

3. 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

代码块:

方法1:

#include <stdio.h>
#include <string.h>
void input (char na[][20], int nu[]);                 //定义输入函数
void sorts (char na[][20], int nu[]);                 //定义排序函数
void search (char na[][20], int nu[], int x);         //定义查找函数
int main()
{
    char name[10][20];
    int num[10], numb, i;
    input(name, num);                                 //调用输入函数
    sorts(name, num);                                 //调用排序函数
    for (i=0; i<10; i++){
        printf("%8s ", name[i]);
        printf("%d\n", num[i]);
    }
    printf("Input your number:");                     //输入一个职工号
    scanf("%d", &numb);
    search(name, num, numb);                          //调用查找函数
    return 0;
}
//输入函数
void input (char na[][20], int nu[])
{
    int i;
    for (i=0; i<10; i++){
        printf("Input No.%d name:", i+1);
        scanf("%s", na[i]);
        printf("Input No.%d number:", i+1);
        scanf("%d", &nu[i]);
    }
}
//排序函数
void sorts (char na[][20], int nu[])
{
    int i, j, temp;
    char tm[20];
    for (i=0; i<10; i++)
        for (j=i+1; j<10; j++){
            if (nu[i]>nu[j]){
                temp=nu[i];
                nu[i]=nu[j];
                nu[j]=temp;
                strcpy(tm, na[i]);
                strcpy(na[i], na[j]);
                strcpy(na[j], tm);
            }
        }
}
//查找函数
void search (char na[][20], int nu[], int x)
{
    int low, high, mid;
    low = 0;
    high = 9;
    while (low<=high){
        mid=(low+high)/2;
        if (x>nu[mid])
            low=mid + 1;
        else if (x<nu[mid])
            high=mid-1;
        else if (x==nu[mid]){
            printf("%s\n", na[mid]);
            break;
        }
    }
    if (x!=nu[mid])
        printf("No match!\n");
}

方法2:

#include <stdio.h>
#include <string.h>
void input(char na[][20], int nu[], int n);                    //定义输入函数
void sort(char na[][20], int nu[], int n);                     //定义排序函数
void search(int numb, char na[][20], int nu[], int n);         //定义查找函数
int main()
{
	char name[10][20];
	int num[10], number;
	input(name, num, 10);                                      //调用输入函数
	sort(name, num, 10);                                       //调用排序函数
	printf("Please enter number: ");                           //输入一个职工号
	scanf("%d", &number);
	search(number, name, num, 10);                             //调用查找函数
	return 0;
}
//输入函数
void input(char na[][20], int nu[], int n)
{
	int i;
	for (i=0; i<n; i++){
		printf("Please enter No.%d name: ", i+1);
		gets(na[i]);
		printf("please enter No.%d number: ", i+1);
		scanf("%d", &nu[i]);
		getchar();                                              //此处是为了避免把回车作为输入流输进数组中
	}
}
//排序函数
void sort(char na[][20], int nu[], int n)
{
	int i, j, t;
	char temp[20];
	for (i=0; i<n; i++)
		for (j=i+1; j<n; nu[i]>nu[j] ? t=nu[j], nu[j]=nu[i], nu[i]=t, strcpy(temp, na[j]), strcpy(na[j], na[i]), strcpy(na[i], temp), j++ : j++);
	for (i=0; i<n; printf("%d  %s\n", nu[i], na[i]), i++);
}
//查找函数
void search(int numb, char na[][20], int nu[], int n)
{
	int mid, low=0, high=n-1;
	mid=(low+high)/2;
	for (low=0, high=n-1, mid=(low+high)/2; low<=high; mid=(low+high)/2){
		if (numb<nu[mid]) high=mid-1;
		if (numb>nu[mid]) low=mid+1;
		if (numb==nu[mid]){
			printf("Name: %s\n", na[mid]);
			break;
		}
	}
	if (numb!=nu[mid]) printf("No Match!\n");
}

解答评论(拆开for循环)
问号是涉及条件运算符,拆开如下:

for (j=i+1; j<n; j++)
    if (nu[i]>nu[j]){
        t=nu[j], nu[j]=nu[i], nu[i]=t;
        strcpy(temp, na[j]);
        strcpy(na[j], na[i]);
        strcpy(na[i], temp);
        }