5. 11 C语言 算法

其他算法 

对于简单的程序逻辑,以上几种算法基本够用。感兴趣的同学,可以尝试着了解下以下几种算法: 

  1. 分治算法:把一个复杂问题分割成几个小问题。例:快速排序、归并排序。 

  2. 贪心算法:每次都选择最优条件。例:霍夫曼编码(最优二叉树)。


    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",   {1990101}, 091.0}, 

                          {"2","Lily","Female", {1991515}, 080.0}, 

                          {"3","Mike","Male",   {1988321}, 090.0}, 

                          {"4","Lee","Male",    {1985711}, 076.0}, 

                          {"5","Lucy","Female",   {1986328}, 092.0}, 

                          {"6","Jan","Female",   {19926,  1},  088.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.yearstudents[i].birthday.monthstudents[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; 

    } 

     

    5. 13 C语言 考试

    // 

    //  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] = {-10123}; 

        int b[5] = {234, -16}; 

        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; 

    } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值