一、項目需求:
1. 創建一對文件Teacher.h Teacher.m。
2. 在Teacher.h中,定義一個Teacher結構體,成員變量包括:姓名、性別、年齡、員工編號、評分。
3. 聲明一個打印Teacher的函數,void printTeacher(Teacher* teacher)。
4. 定義一個函數指針類型,typedef BOOL(*CompareFunctionPointer)(Teacherteacher1, Teacher teacher2);
5. 聲明一個老師數組排序的函數,void sortTeachers(Teacher teacher[ ] ,int count, CompareFunctionPointer cfp);
6. 聲明一個打印數組中所有老師的函數,void printTeachers(Teacher * teachers, int count);
7. 分別聲明兩個比較Teacher姓名的函數:BOOL compareNameByAscending(Teacher teacher1 , Teacher teacher2);(升序方式)、BOOLcompareNameByDescending(Teacher teacher1, Teacher teacher2);(降序方式)。
8. 分別聲明兩個比較Teacher員工編號的函數:BOOL compareNumberByAscending(Teacher teacher1 , Teacher teacher2);(升序方式)、BOOLcompareNumberByDescending(Teacher teacher1, Teacher teacher2);(降序方式)
9. 分別聲明兩個比較Teacher員工評分的函數:BOOL compareScoreByAscending(Teacher teacher1 , Teacher teacher2);(升序方式)、BOOLcompareScoreByDescending(Teacher teacher1, Teacher teacher2);(降序方式)
10. 聲明一個輸出教師數組中全部男老師的函數,void printMaleTeacher(Teacher * teachers, int count);
11. 聲明一個輸出教師數組中全部女老師的函數,void printFemaleTeacher(Teacher * teacher, int count);
12. 聲明一個枚舉FunctionName,其中的每個枚舉值於用戶從控制檯輸入的功能數字一一對應。例如:當從控制檯輸入1時,此時實現按照姓名進行升序排列。
13. 要求在控制檯中,有用戶操作說明。如圖:
14. 在Teacher.m中,實現上述的全部函數。
15. 在main.m文件中要求:
① 創建一個Teacher數組,利用上面的sortTeachers(Teacher teacher[ ] ,int count,CompareFunctionPointer cfp)函數,調用函數(使用switch…case,通過控制檯輸入的數字與枚舉值匹配實現調用不同的函數)來分別實現按姓名、員工編號、評分排序,其中每種排序的升、降方式都要實現。比如:分別實現對年齡按照升序、降序排列。
② 輸出教師數組中全部的男老師。
③ 輸出教師數組中的所有女老師。
// main.m
// exam1
//
// Created by ******* on 15/9/16.
// Copyright (c) 2015年 ******. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Teacher.h"
int main(int argc, const char * argv[]) {
Teacher tea1 = {"zhangsan","nan",20,021,89};
Teacher tea2 = {"lisi","nan",29,012,80};
Teacher tea3 = {"wangwu","nv",33,032,88};
Teacher tea4 = {"zhaoliu","nv",21,054,87};
Teacher tea[] = {tea1,tea2,tea3,tea4};
enum FunctionName i = 0;
CompareFunctionPointer cfp = NULL;
documOptions();
while(1){
scanf("%d",&i);
switch (i) {
case CompareNameByAscending:
cfp = compareNameByAscending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case CompareNameByDescending:
cfp = compareNameByDescending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case CompareNumberByAscending:
cfp = compareNumberByAscending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case CompareNumberByDescending:
cfp = compareNumberByDescending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case CompareScoreByAscending:
cfp = compareScoreByAscending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case CompareScoreByDescending:
cfp = compareScoreByDescending;
sortTeachers(tea, 4, cfp);
printTeachers(tea, 4);
break;
case PrintFemaleTeacher:
printFemaleTeacher(tea, 4);
break;
case PrintMaleTeacher:
printMaleTeacher(tea, 4);
break;
default:printf("請重新輸入");
break;
}
}
return 0;
}
// Teacher.h
// exam1
//
// Created by ******* on 15/9/16.
// Copyright (c) 2015年 ******. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef struct Teacher{
char name[20];
char sex[5];
int age;
int number;
float score;
}Teacher;
enum FunctionName{
CompareNameByAscending = 1,
CompareNameByDescending,
CompareNumberByAscending,
CompareNumberByDescending,
CompareScoreByAscending,
CompareScoreByDescending,
PrintFemaleTeacher,
PrintMaleTeacher
};
//打印結構體函數
void printTeacher(Teacher *teacher);
//定義一個函數指針
typedef BOOL(*CompareFunctionPointer)(Teacher teacher1, Teacher teacher2);
//聲明一個老師數組排序的函數
void sortTeachers(Teacher teacher[ ] ,int count, CompareFunctionPointer cfp);
//打印所有的老師信息
void printTeachers(Teacher * teachers, int count);
//升序、降序排老師姓名方式
BOOL compareNameByAscending(Teacher teacher1 , Teacher teacher2);
BOOL compareNameByDescending(Teacher teacher1, Teacher teacher2);
//升序、降序排老師員工編號
BOOL compareNumberByAscending(Teacher teacher1 , Teacher teacher2);
BOOL compareNumberByDescending(Teacher teacher1, Teacher teacher2);
//升序、降序排員工評分高低
BOOL compareScoreByAscending(Teacher teacher1 , Teacher teacher2);
BOOL compareScoreByDescending(Teacher teacher1, Teacher teacher2);
//聲明一個輸出教師數組中全部男/女老師的函數
void printMaleTeacher(Teacher * teachers, int count);
void printFemaleTeacher(Teacher * teacher, int count);
void documOptions();
// Teacher.m
// exam1
//
// Created by ****** on 15/9/16.
// Copyright (c) 2015年 *****. All rights reserved.
//
#import "Teacher.h"
void printTeacher(Teacher *teacher){
printf("姓名:%s,性別:%s,年齡:%d,員工編號:%d,評分:%.2f\n",teacher->name,teacher->sex,teacher->age,teacher->number,teacher->score);
}
void sortTeachers(Teacher teacher[ ] ,int count, CompareFunctionPointer cfp){
for (int i = 0; i < count - 1; i ++) {
for (int j = 0; j < count - 1 - i; j++) {
if (cfp(teacher[j] ,teacher[j+ 1])) {
Teacher temp = teacher[j];
teacher[j] = teacher[j+1];
teacher[j+1] = temp;
}
}
}
}
void printTeachers(Teacher * teachers, int count){
for (int i = 0; i < count; i ++) {
printf("姓名:%s,性別:%s,年齡:%d,員工編號:%d,評分:%.2f\n",teachers[i].name,teachers[i].sex,teachers[i].age,teachers[i].number,teachers[i].score);
}
}
//升序排老師姓名方式
BOOL compareNameByAscending(Teacher teacher1 , Teacher teacher2){
return strcmp(teacher1.name, teacher2.name) > 0 ;
}
//降序排老師姓名方式
BOOL compareNameByDescending(Teacher teacher1, Teacher teacher2){
return strcmp(teacher1.name, teacher2.name) < 0 ;
}
//升降排編號
BOOL compareNumberByAscending(Teacher teacher1 , Teacher teacher2){
return teacher1.number > teacher2.number;
}
BOOL compareNumberByDescending(Teacher teacher1, Teacher teacher2){
return teacher1.number < teacher2.number;
}
//升序排評分高低
BOOL compareScoreByAscending(Teacher teacher1 , Teacher teacher2){
return teacher1.score >teacher2.score;
}
//降序排評分高低
BOOL compareScoreByDescending(Teacher teacher1, Teacher teacher2){
return teacher1.score <teacher2.score;
}
void printMaleTeacher(Teacher * teachers, int count){
for (int i = 0; i < count; i ++) {
if(strcmp(teachers[i].sex,"nan") == 0){
printf("姓名:%s,性別:%s,年齡:%d,員工編號:%d,評分:%.2f\n",teachers[i].name,teachers[i].sex,teachers[i].age,teachers[i].number,teachers[i].score);
}
}
}
void printFemaleTeacher(Teacher * teacher, int count){
for (int i = 0; i < count; i ++) {
if(strcmp(teacher[i].sex,"nv") == 0){
printf("姓名:%s,性別:%s,年齡:%d,員工編號:%d,評分:%.2f\n",teacher[i].name,teacher[i].sex,teacher[i].age,teacher[i].number,teacher[i].score);
}
}
}
void documOptions(){
printf("輸入1:實現按照姓名進行升序排列\n");
printf("輸入2:實現按照姓名進行降序排列\n");
printf("輸入3:實現按照員工編號進行升序排列\n");
printf("輸入4:實現按照員工編號進行降序排列\n");
printf("輸入5:實現按照評分進行升序排列\n");
printf("輸入6:實現按照評分進行降序排列\n");
printf("輸入7:實現輸出所有的女老師\n");
printf("輸入8:實現輸出所有的男老師\n");
printf("==================================\n");
printf("請輸入實現功能對應的數字:\n");
}