zoukankan      html  css  js  c++  java
  • C语言知识点复习


     

    代码涵盖了C语言大部分基本的知识点,涉及后面的链表,文件,结构体等内容

    在传参数的时候有对指针各种的操作,给出了一点思路。

    在链表创建时,采用的是最传统的静态创建节点,在数据结构中会应用动态创建节点。

    在文件中,需要在代码存放的地方放入两个 .txt 文件,并且在data.txt文件中放入数字,以空格隔开

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <windows.h>                        //清屏和颜色设置需要
    #include <stdbool.h>
    
    #define ENDMARK 9999                    //定义输入数据结束标志   
    #define ARRAYMAXLENTH 21                //定义数组大小
    #define CUTTINGLINESTART 1              //宏定义切分先开始位置
    #define CUTTINGLINELENGTH 25            //宏定义切分线长度
    //规范:纯数字定义时变量必须全部大写,必须写明变量含义,不考虑长度
    enum returninfo { success, fail };
    //用枚举类型保存各种返回信息的英语单词,以便分类显示某个功能运行后的返回结果
    typedef struct node {
        int data;                            //数据域
        struct node* next;                     //节点指针域
    }Node, * Nodep;                            //Node==struct node;Nodep==struct node* 
    
    
    
    void clearscreen(void);
    void showmenu(void);
    int assinteger(int num1, int num2);
    void showcuttingline(void);
    void getarraynums(int array[], int* arrayposnow);
    void countnums(int array[], int arraylenthnow, int* num1, int* num2, int* num3);
    int accumulator(int array[], int arraylenthnow);
    int combinationnum(int n, int m);
    int factorial(int num);
    enum returninfo getmaxmin(int array[], int arraylenthnow, int* max, int* min);
    enum returninfo sort3nums(int* num1, int* num2, int* num3);
    void exchange2nums(int* num1, int* num2);
    Nodep processlinklist(int num1, int num2, int num3);
    void displaylinklist(Nodep headp);
    void releaselinklist(Nodep headp);
    enum returninfo fileprocess();
    void processmenu(void);
    
    /***************************************************************
    *函数功能:清楚界面内容
    ****************************************************************/
    void clearscreen(void) {
        system("cls");
    }
    void showmenu(void) {
        //puts和printf不同,puts()会在字符串尾部加上换行符,而printf不会
        puts("=============================================");
        puts("C语言常见知识点复习系统 ");
        puts("=============================================");
        puts("程序功能说明:                                ");
        puts("   用菜单的方式管理数个C语言必须掌握的          ");
        puts("程序结构知识点,为数据结构的程序设计做          ");
        puts("好准备                                           ");
        puts("=============================================");
        puts("                   ★功能菜单★                ");
        puts("=============================================");
        puts("1.两个整数加法运算                               ");
        puts("2.统计正负数或零的个数                         ");
        puts("3.数组数据的累加                               ");
        puts("4.组合数的计算                                   ");
        puts("5.求多个数据中的最大值和最小值                  ");
        puts("6.三个数据的排序                               ");
        puts("7.链表的三个节点的挂链和数据显示                ");
        puts("8.文件链表数组等切换,数据全部加100             ");
        puts("0.结束程序                                    ");
        puts("=============================================");
        printf("请输入您的选择:");
    }
    
    /***************************************************************
    *函数功能:两个整数加法运算
    ****************************************************************/
    int assinteger(int num1, int num2) {
        int result;
        result = num1 + num2;
        return result;
        //直接 return  num1+num2
    }
    /***************************************************************
    *函数功能:根据用户输入选择调用不同的函数
    ****************************************************************/
    void showcuttingline(void) {
        int i;
        for (int i = 0; i < CUTTINGLINESTART + CUTTINGLINELENGTH; i++) {
            if (i < CUTTINGLINESTART) {
                printf(" ");
            }
            else {
                printf("=");         //这是一个分割线
            }
        }
        puts(" ");
    }
    /***************************************************************
    *函数功能:向给定数组中输入一定个数的数据,并返回数组数据和数据个数
    ****************************************************************/
    void getarraynums(int array[], int* arrayposnow) {
        int buffercache;                  //设置一个变量存储缓存区数据信息
        int overcount = 0;                //记录输入超界数据个数
        *arrayposnow = 0;                 //按照约定数组下标从1开始使用,但是此时初值依然设置为0
        puts("请用空格分开依此输入多个整数:");
        printf("以%d标志结束输入,个数超过%d的一律不承认:
    ", ENDMARK, ARRAYMAXLENTH - 1);
        scanf("%d", &buffercache);       //向缓存区输入一个数据
        while (buffercache != ENDMARK) {  //判断何时终止
            if (*arrayposnow < ARRAYMAXLENTH - 1) { //判断数据能否正常录入如果不能则统计溢出个数
                (*arrayposnow)++;
                array[*arrayposnow] = buffercache;
            }
            else {
                overcount++;
            }
            scanf("%d", &buffercache);
        }
        if (overcount > 0) {
            printf("
    输入数据越界,自动忽略后面%d个数据", overcount);
        }
    }
    /***************************************************************
    *函数功能:分别统计整数,负数,零的个数,
    ****************************************************************/
    void countnums(int array[], int arraylenthnow, int* num1, int* num2, int* num3) {
        int arrayposnow;
        *num1 = 0;
        *num2 = 0;
        *num3 = 0;
        for (arrayposnow = 1; arrayposnow <= arraylenthnow; arrayposnow++) {
            if (array[arrayposnow] > 0) {
                *num1 = *num1 + 1;
            }
            else if (array[arrayposnow] < 0) {
                *num2 = *num2 + 1;
            }
            else {
                *num3 = *num3 + 1;
            }
        }
    }
    
    /***************************************************************
    *函数功能:完成数组数据的累加
    ****************************************************************/
    int accumulator(int array[], int arraylenthnow) {
        int addresult = 0;
        int arrayposnow;
        for (arrayposnow = 1; arrayposnow <= arraylenthnow; arrayposnow++) {
            addresult = addresult + array[arrayposnow];
        }
        return addresult;
    }
    
    
    /***************************************************************
    *函数功能:从n个不同的元素中任取m个元素并成一组
    ****************************************************************/
    int combinationnum(int n, int m) {
        int cmn;
        if (n < m || n < 0 || m < 0) {
            return -1;
        }
        else {
            cmn = factorial(n) / (factorial(m) * factorial(n - m));
        }
        return cmn;
    }
    /***************************************************************
    *函数功能:给出起始数算出阶乘
    ****************************************************************/
    int factorial(int num) {
        int result = 1;
        int i;
        for (i = 1; i <= num; i++) {
            result = result * i;
        }
        return result;
    }
    
    /***************************************************************
    *函数功能:求出数组的最大值,最小值
    ****************************************************************/
    enum returninfo getmaxmin(int array[], int arraylenthnow, int* max, int* min) {
        int arrayposnow;
        *max = *min = array[1];
        for (arrayposnow = 2; arrayposnow <= arraylenthnow; arrayposnow++) {
            //先初始1为最小和最大 再从2开始遍历比较
            if (array[arrayposnow] > * max) {
                *max = array[arrayposnow];
            }
            if (array[arrayposnow] < *min) {
                *min = array[arrayposnow];
            }
        }
        return success;
    }
    
    
    /***************************************************************
    *函数功能:实现三个数的排序
    ****************************************************************/
    enum returninfo sort3nums(int* num1, int* num2, int* num3) {
        if (*num1 > * num2) exchange2nums(num1, num2);
        if (*num2 > * num3) exchange2nums(num2, num3);
        if (*num1 > * num3) exchange2nums(num1, num3);
    }
    
    
    /***************************************************************
    *函数功能:实现数据的交换
    ****************************************************************/
    void exchange2nums(int* num1, int* num2) {
        int temp;
        temp = *num1;
        *num1 = *num2;
        *num2 = temp;
    
    }
    
    
    /***************************************************************
    *函数功能:静态创建一个长度为三的已知链表
    *         用最原始的方式逐个挂上节点,来构造链表,然后显示数据
    *         由此来思考如何动态创建链表 (数据结构再做讨论)
    *
    ****************************************************************/
    Nodep processlinklist(int num1, int num2, int num3) {
        int num;
        Nodep headp = (Nodep)malloc(sizeof(Node));
        Nodep newnodep = (Nodep)malloc(sizeof(Node));
        Nodep lastnodep;
        num = num1;
        newnodep->data = num;
        newnodep->next = NULL;
        headp->next = newnodep;
        printf("
    向链表尾部挂上新数据%d后
    ",num1);
        displaylinklist(headp);
    
        //开始挂第二个节点
        num = num2;
        newnodep = (Nodep)malloc(sizeof(Node));
        newnodep->data = num;
        newnodep->next = NULL;
        lastnodep = headp->next;
        lastnodep->next = newnodep;
        lastnodep = newnodep;
        printf("
    向链表尾部挂上新数据%d后
    ",num2);
        displaylinklist(headp);
    
        //开始挂第三个节点
        num = num3;
        newnodep = (Nodep)malloc(sizeof(Node));
        newnodep->data = num;
        newnodep->next = NULL;
        lastnodep->next = newnodep;
        printf("
    向链表尾部挂上新数据%d后
    ",num3);
        displaylinklist(headp);
            return headp;
    }
    
    
    /***************************************************************
    *函数功能:根据用户输入选择调用不同的函数
    ****************************************************************/
    void displaylinklist(Nodep headp) {
        Nodep searchp = headp->next;
        printf("链表中的全部数据为:Headp->[|-]->");
        while (searchp != NULL) {
            printf("[ %d",searchp->data);
            if (searchp->next == NULL) {
                printf("|^]");
            }
            else {
                printf("|-]->");
            }
            searchp = searchp->next;
        }
        puts(" ");
    }
    
    
    /***************************************************************
    *函数功能:释放headp指针指向的所有链表节点的空间,还给操作系统
    ****************************************************************/
    void releaselinklist(Nodep headp) {
        Nodep searchp = headp->next, followp;
        while (searchp != NULL) {
            followp = searchp;
            searchp = searchp->next;
            free(followp);
        }
        headp->next = NULL;
    }
    
    
    /***************************************************************
    *函数功能:文件中存入数量不等的整数,读入后循环写入链表,然后把链表所有
    *数据增加100,再写入数组,然后再把所有数据写入另一个文件中。
    *文件数据最后一项要求不能有任何符号  否则会默认数据没有读完,导致多读
    ****************************************************************/
    enum returninfo fileprocess() {
        Nodep headp = (Nodep)malloc(sizeof(Node));
        FILE* in = fopen("data.txt","rb");
        FILE* out = fopen("result.txt","wb");
        int arrayposnow = 0;
        //读入数据个数计数器
        int count = 0;
        Nodep searchp = headp;
        Nodep Headp = headp;
        
        int* temparray = (int*)malloc(sizeof((int*)count));
        //int* temparray = (int*)calloc(count, sizeof(int*));
        if (feof(in)) {
            return fail;
        }
        else {
            int data;
            Nodep newnodep;
            printf("开始从文件中读入数据并且同时显示...
    ");
            printf("文件数据如下:
    ");
            while (!feof(in)) {
                /*从文件(data.txt)中读入数量不等的整数*/
                fscanf(in,"%d ",&data);
                printf("%d ",data);
                newnodep = (Nodep)malloc(sizeof(Node));
                newnodep->data = data;
                newnodep->next = NULL;
                searchp->next = newnodep;
                searchp = newnodep;
                count = count + 1;
            }
        }
        printf("
    
    文件中的数据已经转入链表...
    ");
        searchp = headp->next;
        while (searchp != NULL) {
            searchp->data = searchp->data + 100;
            searchp = searchp->next;
        }
        puts("所有数据加上100的运算已经结束...");
        puts("运算结果如下:");
        displaylinklist(headp);
    
    
        /*数据转入数组*/
        searchp = headp->next;
        while (searchp != NULL) {
            temparray[arrayposnow] = searchp->data;
            arrayposnow++;
            searchp = searchp->next;
        }
        puts("
    数据已经转入数组...");
        /*再把数据写入结果文件*/
        if (feof(out)) {
            return fail;
        }
        else {
            for (arrayposnow = 0; arrayposnow < count; arrayposnow++) {
                fprintf(out,"%d ",temparray[arrayposnow]);
            }
            puts("
    数据已经重新写入文件...
    ");
    
            ShellExecute(NULL,"open","result.txt",NULL,NULL,SW_SHOWNORMAL);
        }
        fclose(in);
        fclose(out);
        return success;
    }
    /***************************************************************
    *函数功能:根据用户输入选择调用不同的函数
    ****************************************************************/
    void processmenu(void) {
        int returnvalue;
        int num1, num2, num3;
        int arraylenthnow, arrayposnow, array[ARRAYMAXLENTH];
        int menuchoice;
        scanf("%d", &menuchoice);
        switch (menuchoice) {
        case 1:
            printf("请输入两个整数(用空格隔开):");
            scanf("%d %d", &num1, &num2);
            num3 = assinteger(num1, num2);
            showcuttingline();
            printf("%d +", num1);
            if (num2 >= 0) {
                printf("%d", num2);
            }
            else {
                printf("(%d)", num2);
            }
            printf("=%d", num3);
            showcuttingline();
            break;
        case 2:
            //下面的调用是向给定的数组中输入数据,并返回数组数据和数据个数
            getarraynums(array, &arraylenthnow);
            countnums(array, arraylenthnow, &num1, &num2, &num3);
            showcuttingline();
            printf("正数的个数:%d
    ", num1);
            printf("负数的个数:%d
    ", num2);
            printf("零  的个数:%d
    ", num3);
            showcuttingline();
            break;
        case 3:
            getarraynums(array, &arraylenthnow);
            showcuttingline();
            num3 = accumulator(array, arraylenthnow);
            for (arrayposnow = 1; arrayposnow < arraylenthnow; arrayposnow++) {
                if (array[arrayposnow] >= 0) {
                    printf("%d + ", array[arrayposnow]);
                }
                else {
                    printf("(%d) + ", array[arrayposnow]);
                }
            }
            printf("%d = %d
    ", array[arraylenthnow], num3);
            showcuttingline();
            break;
        case 4:
            puts("请输入两个正整数 n,m(提醒:n个数据中取m个,空格隔开,n >= m):");
            scanf("%d %d", &num1, &num2);
            num3 = combinationnum(num1, num2);
            showcuttingline();
            if (num3 != -1) {
                printf(" 组合计算结果为C(n,m)= %d
    ", num3);
            }
            else {
                puts("输入的数据不符合要求!
    ");
            }
            showcuttingline();
            break;
        case 5:
            getarraynums(array, &arraylenthnow);
            returnvalue = getmaxmin(array, arraylenthnow, &num1, &num2);
            showcuttingline();
            printf("最大数据:%d
    ", num1);
            printf("最小数据:%d
    ", num2);
            showcuttingline();
            break;
        case 6:
            puts("请输入三个整数(空格隔开):");
            scanf("%d %d %d", &num1, &num2, &num3);
            returnvalue = sort3nums(&num1, &num2, &num3);
            showcuttingline();
            printf("处理后数据(从小到大):%d %d %d
    ", num1, num2, num3);
            showcuttingline();
            break;
        case 7:
            puts("请输入三个整数用于创建链表(空格隔开):");
            scanf("%d %d %d", &num1, &num2, &num3);
            showcuttingline();
            releaselinklist(processlinklist(num1, num2, num3));
            showcuttingline();
            break;
        case 8:
            showcuttingline();
            fileprocess();
            //releaselinklist();
            showcuttingline();
            break;
        case 0:
            puts("
    您已经成功退出本系统,欢迎再次使用!!!");
            system("pause");
            exit(1);
        default:
            puts("对不起,您输入的功能编号有错!请重新输入!!!");
            break;
        }
    }
    int main(void) {                         //程序主入口
        SetConsoleTitle("C语言常见知识复习系统(C版)");
        system("color f0");                  //设置背景为白色,字体为黑色
        clearscreen();
        while (true) {
            showmenu();                     //显示菜单
            processmenu();                  //处理菜单窗口,出口就在其中
            system("pause");                //暂停一下,等用户给一个回车
            clearscreen();
        }
        return 0;
    }

    入门小白,如有错误,欢迎指正交流!!!


     

  • 相关阅读:
    Oracle 11g SQL Fundamentals Training Introduction02
    Chapter 05Reporting Aggregated data Using the Group Functions 01
    Chapter 01Restriicting Data Using The SQL SELECT Statemnt01
    Oracle 11g SQL Fundamentals Training Introduction01
    Chapter 04Using Conversion Functions and Conditional ExpressionsConditional Expressions
    Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
    我心目中计算机软件科学最小必读书目 (zz.is2120)
    北京将评估分时分区单双号限行 推进错时上下班 (zz)
    佳能G系列领军相机G1X
    选购单反相机的新建议——心民谈宾得K5(转)
  • 原文地址:https://www.cnblogs.com/WineinSeptember/p/12745184.html
Copyright © 2011-2022 走看看