其他算法
对于简单的程序逻辑,以上几种算法基本够用。感兴趣的同学,可以尝试着了解下以下几种算法:
-
分治算法:把一个复杂问题分割成几个小问题。例:快速排序、归并排序。
-
贪心算法:每次都选择最优条件。例:霍夫曼编码(最优二叉树)。
5. 12 C语言 考试准备题
模拟一个学生成绩管理系统,学生最大人数为100人(注意可以使用链表进行动态实现大小分配)
实现以下功能:
学生是一个结构体(学号(唯一标识),姓名,性别,出生日期, 年龄)(如果为链表还需要指针域)(20)
1.学生结构体中的出生日期同样是一个结构体,其中包含年、月、日,而学生中的年龄是根据出生日期动态计算出来当前年龄为多少(20)
2.增加一个学生(需要使用键盘进行录入,当然初始化的时候可以默认几个学生出来,方便进行操作)(20)
3.删除一个学生(根据学号,进行删除)(10)
4.根据学号查看学生成绩(10)
5.根据学号修改学生成绩(10)
6.显示所有学生列表(每个学生应该输出相应的结构体中的基本信息)(10)
方法二:数组
//
// main.c
// Examination_Prepare
//
// Created by Knight on 5/12/15.
// Copyright (c) 2015 Knight. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#pragma mark - 定义全局变量
typedef struct Birthday Birth;
typedef struct Student Stu;
struct Birthday {
int year;
int month;
int day;
};
struct Student {
char number[20];
char name[20];
char sex[10];
Birth birthday;
int age;
float score;
};
Stu students[100] = {{"1","Jone","Male", {1990, 10, 1}, 0, 91.0},
{"2","Lily","Female", {1991, 5, 15}, 0, 80.0},
{"3","Mike","Male", {1988, 3, 21}, 0, 90.0},
{"4","Lee","Male", {1985, 7, 11}, 0, 76.0},
{"5","Lucy","Female", {1986, 3, 28}, 0, 92.0},
{"6","Jan","Female", {1992, 6, 1}, 0, 88.0},
};
int count = 6;
#pragma mark - 计算指定同学的年龄
void calculateAge(Stu *Stu) {
if (Stu->birthday.month < 5) {
Stu->age = 2015 - Stu->birthday.year - 1;
} else if (Stu->birthday.month == 5) {
if (Stu->birthday.day < 12) {
Stu->age = 2015 - Stu->birthday.year - 1;
} else {
Stu->age = 2015 - Stu->birthday.year;
}
} else {
Stu->age = 2015 - Stu->birthday.year;
}
}
#pragma mark - 打印全部学生信息
void printStudents() {
printf("\n..............................................................\n\n");
printf("Number\tName\t\tSex\t\tBirthday\t\tAge\t\tScore\n\n");
for (int i = 0 ; i < count; i ++) {
if (students[i].birthday.year != 0) {
printf("%s\t\t%s\t\t%s \t", students[i].number,
students[i].name,
students[i].sex);
printf("%d.%d.%d\t\t",students[i].birthday.year, students[i].birthday.month, students[i].birthday.day);
printf("%d\t\t", students[i].age);
printf("%.1f\n", students[i].score);
}
}
printf("\n..............................................................\n\n");
}
#pragma mark - 增加一个学生
void addStudent() {
Stu newStudent;
printf("Add student's number: \n");
scanf("%s", newStudent.number);
getchar();
printf("Add student's name: \n");
scanf("%s", newStudent.name);
getchar();
printf("Add student's sex: \n");
scanf("%s", newStudent.sex);
getchar();
printf("Add student's birthday(e.g. 1995 10 3): \n");
scanf("%d%d%d", &newStudent.birthday.year,
&newStudent.birthday.month,
&newStudent.birthday.day);
getchar();
printf("Add student's score: \n");
scanf("%f", &newStudent.score);
calculateAge(&newStudent);
students[count] = newStudent;
count++;
printStudents();
}
#pragma mark - 找出目标学号所在下标
/**
* 指定一个数,找到这个数所在元素的下标
*
* @param targetNumber 目标数据
*
* @return 返回目标所在下标号
*/
int findIndexWithNumber(char *targetNumber) {
for (int i = 0; i < count; i++) {
if (strcmp(students[i].number, targetNumber) == 0) {
return i;
}
}
return -1;
}
#pragma mark - 根据学号删除学生
void deleteStudent() {
printf("Input student's number to delete this student: \n");
char deleStudt[20];
scanf("%s", deleStudt);
getchar();
int findIndex = -1;
findIndex = findIndexWithNumber(deleStudt);
if (findIndex == -1) {
printf("\nStudent not found!\n");
return;
}
//实现删除:移动元素,覆盖前一个,注意这里for循环的条件怎样推算。
for (int i = findIndex; i < count - 1; i++) {
students[i] = students[i + 1];
}
count--;
printStudents();
}
#pragma mark - 根据学号查看学生成绩
void getStudent() {
printf("Input student's number: \n");
char readStudt[20];
scanf("%s", readStudt);
getchar();
int findIndex = -1;
findIndex = findIndexWithNumber(readStudt);
if (findIndex == -1) {
printf("\nStudent not found!\n");
return;
}
printf("\n..............................................................\n\n");
printf("Number\tName\t\tSex\t\tBirthday\t\tAge\t\tScore\n\n");
printf("%s\t\t%s\t\t%s \t", students[findIndex].number,
students[findIndex].name,
students[findIndex].sex);
printf("%d.%d.%d\t\t", students[findIndex].birthday.year,
students[findIndex].birthday.month,
students[findIndex].birthday.day);
printf("%d\t\t", students[findIndex].age);
printf("%.1f\n", students[findIndex].score);
printf("\n..............................................................\n\n");
}
#pragma mark - 根据学号修改学生成绩
void modifyStudent() {
printf("Input student's number: \n");
char modifyStudt[20];
scanf("%s", modifyStudt);
getchar();
printf("Modify student's score: \n");
float modifyScore;
scanf("%f", &modifyScore);
getchar();
int findIndex = -1;
findIndex = findIndexWithNumber(modifyStudt);
if (findIndex == -1) {
printf("\nStudent not found!\n");
return;
}
students[findIndex].score = modifyScore;
printf("\n..............................................................\n\n");
printf("Number\tName\t\tSex\t\tBirthday\t\tAge\t\tScore\n\n");
printf("%s\t\t%s\t\t%s \t", students[findIndex].number,
students[findIndex].name,
students[findIndex].sex);
printf("%d.%d.%d\t\t", students[findIndex].birthday.year,
students[findIndex].birthday.month,
students[findIndex].birthday.day);
printf("%d\t\t", students[findIndex].age);
printf("%.1f\n", students[findIndex].score);
printf("\n..............................................................\n\n");
}
#pragma mark - main函数
int main(int argc, const char * argv[]) {
for (int i = 0; i < count; i ++) {
calculateAge(&students[i]);
}
printStudents();
addStudent();
deleteStudent();
getStudent();
modifyStudent();
printStudents();
return 0;
}
//
// main.c
// C Examination
//
// Created by Knight on 5/13/15.
// Copyright (c) 2015 Knight. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma mark - 全局变量
typedef struct Seat Seat;
struct Seat {
int number;
int mark;
char *customerName;
};
Seat seats[12];
#pragma mark - deleteSpace(删除字符串中的空格)
void deleteSpace(char *str, unsigned long length) {
char newString[20] = {0};
char *p = newString;
for (int i = 0; i < length; i ++) {
if (str[i] != ' ') {
*p = str[i];
p++;
}
}
p = '\0';
printf("Question1 answer:\n");
printf("%s\n\n", newString);
}
#pragma mark - 实现数组元素相加
void addArray(int *p, int *q, int *sum) {
*sum = *p + *q;
}
#pragma mark - initializeSeats(初始化座位,座位编号1~12 , mark全部置0, 姓名全部置' ')
void initializeSeats() {
printf("Question3 answer:\n\n");
for (int i = 0; i < 12; i ++) {
char noName = ' ';
seats[i].number = i + 1;
seats[i].mark = 0;
seats[i].customerName = &noName;
}
}
#pragma mark - printSeat(打印座位信息)
void printSeat(Seat *p){
printf(" %d\t\t %d\t\t%s\n",p->number, p->mark, p->customerName);
}
#pragma mark - showMainMenuAndInputCommand (显示主菜单界面, 提示用户输入)
char showMainMenuAndInputCommand() {
char choice;
while (1) {
printf("To choose a function, enter its letter lable:\n\na. Show number of empty seat\nb. Show list of empty seats\nc. Show all seats\nd. Assign a customer to a seat assignment\ne. Delete a seat assignment\nf. Quit\n\n");
scanf("%c", &choice);
getchar();
if (choice == 'a' || choice == 'b' || choice == 'c' || choice == 'd' || choice == 'e' || choice == 'f' ) {
break;
}
printf("Input Invalid!\n");
}
return choice;
}
#pragma mark - 实现a功能: 显示空座位数量
void functionA() {
int count = 0; //count 统计空座位数量
for (int i = 0; i < 12; i ++) {
if (seats[i].mark == 0) {
count ++;
}
}
printf("\nThere are %d empty seats.\n\n",count);
}
#pragma mark - 实现b功能: 显示空座位清单
void functionB() {
printf("\nEmpty seat number: \n\n");
for (int i = 0; i < 12; i ++) {
if (seats[i].mark == 0) {
printf("%d\t", seats[i].number);
}
}
printf("\n\n");
}
#pragma mark - 实现c功能: 显示全部座位信息
void functionC() {
printf("\nNumber\tMark\t\tName\n");
printf("..........................\n");
for (int i = 0; i < 12; i ++) {
printSeat(&seats[i]);
}
printf("..........................\n");
}
#pragma mark - 实现d功能: 预定座位
void functionD() {
functionB();
int assignSeatNumber = -1;
do {
//输入预定座位号
printf("Press '0' to cancle assignment.\n");
printf("Pick up a seat:\n");
scanf("%d", &assignSeatNumber);
getchar();
} while (assignSeatNumber < 0 || assignSeatNumber > 12);
//用户输入0, 直接结束
if (assignSeatNumber == 0) {
return;
}
if (seats[assignSeatNumber - 1].mark == 1) {
printf("\nThis seat has been assigned by nother costomer. Please choose nother seat: \n");
functionD();
} else {
seats[assignSeatNumber - 1].mark = 1;
//接收预定人姓名
Seat assignSeat;
assignSeat.customerName = malloc(sizeof(char[20]));
printf("What's your name?\n");
scanf("%s", assignSeat.customerName);
getchar();
seats[assignSeatNumber - 1].customerName = assignSeat.customerName;
}
}
#pragma mark - 实现e功能: 删除座位
void functionE() {
int deleteAssignment = -1;
do {
printf("Press '0' to cancle delete.\n");
printf("Detele seat assignment. Input seat number:\n");
scanf("%d", &deleteAssignment);
getchar();
} while (deleteAssignment < 0 || deleteAssignment > 12);
//用户输入0, 直接结束
if (deleteAssignment == 0) {
return;
}
seats[deleteAssignment - 1].mark = 0;
Seat deleteSeat;
deleteSeat.customerName = malloc(sizeof(char[20]));
seats[deleteAssignment - 1].customerName = deleteSeat.customerName;
}
#pragma mark - 题目1: 编写一个函数,字符串做参数,删除字符串中的空格
void question1() {
char string[20] = "ef 3rr 1 2d ";
unsigned long stringLength = strlen(string);
deleteSpace(string, stringLength);
}
#pragma mark - 题目2: 编写一个函数,将两个数组内相应元素相加,结果存到第三个数组
void question2() {
int a[5] = {-1, 0, 1, 2, 3};
int b[5] = {2, 3, 4, -1, 6};
int c[5] = {0};
printf("Question2 answer:\n");
for (int i = 0; i < 5; i ++) {
addArray(&a[i], &b[i], &c[i]);
printf("%d ", c[i]);
}
printf("\n\n");
}
#pragma mark - 题目3: 订座程序
/**
* 写一个订座程序,默认共有12个座位,实现以下要求:
* (1)座位是一个结构体类型,拥有编号,表示座位是否被预订的标记,预定人姓名。
* (2)程序显示以下菜单:
* To choose a function, enter its letter lable:
*
* a. Show number of empty seat
* b. Show list of empty seats
* c. Show all seats
* d. Assign a customer to a seat assignment
* e. Delete a seat assignment
* f. Quit
* (3)程序执行相应功能,d,e需要额外输入,每一个选项都允许用户终止输入。
* (4)执行完成一个特定功能后返回主菜单,选择f可以结束程序。
*
*
*/
void question3() {
//初始化座位
initializeSeats();
char option;
do {
option = showMainMenuAndInputCommand();
switch (option) {
case 'a':
functionA();
break;
case 'b':
functionB();
break;
case 'c':
functionC();
break;
case 'd':
functionD();
break;
case 'e':
functionE();
break;
default:
break;
}
} while (option != 'f');
printf("Quit program.\n");
}
#pragma mark - main函数
int main(int argc, const char * argv[]) {
question1();
question2();
question3();
return 0;
}