C程序设计 (第四版) 谭浩强 习题7.15
习题 7.15 写几个函数:
1. 输入10个职工的姓名和职工号;
2. 按职工号由小到大顺序排序,姓名顺序也随之调整;
3. 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
void inputEmployee(char employeeName[][20], int employeeNo[], int n){
for(int i = 0; i < n; i++){
printf("Enter No.%d employee name: ", i+1);
gets(employeeName[i]);
printf("Enter No.%d employee number: ", i+1);
scanf("%d", &employeeNo[i]);
while(employeeNo[i] <= 0){
printf("Number Error! Retry!\nEnter No.%d employee number: ", i+1);
scanf("%d", &employeeNo[i]);
}
getchar();
}
}
void ascendingSort(char employeeName[][20], int employeeNo[], int n){
char tempName[20];
int tempNo;
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
if(employeeNo[i] > employeeNo[j]){
tempNo = employeeNo[i];
employeeNo[i] = employeeNo[j];
employeeNo[j] = tempNo;
strcpy(tempName, employeeName[i]);
strcpy(employeeName[i], employeeName[j]);
strcpy(employeeName[j], tempName);
}
}
}
}
int search(char employeeName[][20], int employeeNo[], int n, int searchNo, char searchName[]){
int low = 0;
int high = n - 1;
int mid;
int pos = -1;
while(low <= high){
mid = (low + high) / 2;
if(searchNo < employeeNo[mid]){
high = mid - 1;
}
else if(searchNo > employeeNo[mid]){
low = mid + 1;
}
else{
pos = 1;
strcpy(searchName, employeeName[mid]);
break;
}
}
return pos == -1 ? 0: 1;
}
int main(){
char employeeName[N][20];
int employeeNo[N];
int searchNo;
char searchName[20];
int sign;
inputEmployee(employeeName, employeeNo, N);
ascendingSort(employeeName, employeeNo, N);
printf("\nEnter search number: ");
scanf("%d", &searchNo);
sign = search(employeeName, employeeNo, N, searchNo, searchName);
if(sign == 1){
printf("Name: %s\n", searchName);
}
else{
printf("No Record!\n");
}
system("pause");
return 0;
}
方法2:使用指针、结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
struct Employee{
char name[20];
int number;
};
void inputEmployee(Employee *employee, int n){
for(int i = 0; i < n; i++){
printf("Enter No.%d employee name: ", i+1);
gets(employee[i].name);
printf("Enter No.%d employee number: ", i+1);
scanf("%d", &employee[i].number);
while(employee[i].number <= 0){
printf("Number Error! Retry!\nEnter No.%d employee number: ", i+1);
scanf("%d", &employee[i].number);
}
for(int j = 0; j < i; j++){
while(employee[i].number <= 0 || employee[i].number == employee[j].number){
if(employee[i].number <= 0){
printf("Number Error! Retry!\nEnter No.%d employee number: ", i+1);
}
else if(employee[i].number == employee[j].number){
printf("Duplicate Number! Retry!\nEnter No.%d employee number: ", i+1);
}
j = 0;
scanf("%d", &employee[i].number);
}
}
getchar();
}
}
void ascendingSort(Employee *employee, int n){
Employee temp;
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n; j++){
if(employee[i].number > employee[j].number){
temp = employee[i];
employee[i] = employee[j];
employee[j] = temp;
}
}
}
}
int search(Employee *employee, int n, int searchNo, char *searchName){
int low = 0;
int high = n - 1;
int mid;
int pos = -1;
while(low <= high){
mid = (low + high) / 2;
if(searchNo < employee[mid].number){
high = mid - 1;
}
else if(searchNo > employee[mid].number){
low = mid + 1;
}
else{
pos = 1;
strcpy(searchName, employee[mid].name);
break;
}
}
return pos == -1 ? 0: 1;
}
void testOutput(Employee *employee, int n){
printf("\nEmployee Info:\n");
for(int i = 0; i < n; i++){
printf("%-4d %s\n", employee[i].number, employee[i].name);
}
}
void outputEmployee(Employee *employee, int n, int (*fun)(Employee*, int, int, char*)){
int searchNo;
char *searchName = (char*)malloc(20 * sizeof(char));
int sign;
printf("\nEnter search number: ");
scanf("%d", &searchNo);
sign = search(employee, N, searchNo, searchName);
if(sign == 1){
printf("Name: %s\n", searchName);
}
else{
printf("No Record!\n");
}
free(searchName);
}
int main(){
Employee *employee = (Employee*)malloc(N * sizeof(Employee));
inputEmployee(employee, N);
ascendingSort(employee, N);
testOutput(employee, N);
outputEmployee(employee, N, search);
free(employee);
system("pause");
return 0;
}
解答评论(拆开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);
}
}