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

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


 

原文地址:https://www.cnblogs.com/WineinSeptember/p/12745184.html