• 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;
    }

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


     

  • 相关阅读:
    linux tmux基本操作
    AJAX json集合传入Controller后台
    python 数据读取
    appium
    接口测试设计思路
    python 常用模块
    接口测试程序部分
    测试用例设计思路
    mock_待续
    网站收藏
  • 原文地址:https://www.cnblogs.com/WineinSeptember/p/12745184.html
Copyright © 2020-2023  润新知