代码涵盖了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的一律不承认:\n", 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("\n输入数据越界,自动忽略后面%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("\n向链表尾部挂上新数据%d后\n",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("\n向链表尾部挂上新数据%d后\n",num2); displaylinklist(headp); //开始挂第三个节点 num = num3; newnodep = (Nodep)malloc(sizeof(Node)); newnodep->data = num; newnodep->next = NULL; lastnodep->next = newnodep; printf("\n向链表尾部挂上新数据%d后\n",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("开始从文件中读入数据并且同时显示...\n"); printf("文件数据如下:\n"); 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("\n\n文件中的数据已经转入链表...\n"); 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("\n数据已经转入数组..."); /*再把数据写入结果文件*/ if (feof(out)) { return fail; } else { for (arrayposnow = 0; arrayposnow < count; arrayposnow++) { fprintf(out,"%d ",temparray[arrayposnow]); } puts("\n数据已经重新写入文件...\n"); 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\n", num1); printf("负数的个数:%d\n", num2); printf("零 的个数:%d\n", 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\n", 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\n", num3); } else { puts("输入的数据不符合要求!\n"); } showcuttingline(); break; case 5: getarraynums(array, &arraylenthnow); returnvalue = getmaxmin(array, arraylenthnow, &num1, &num2); showcuttingline(); printf("最大数据:%d\n", num1); printf("最小数据:%d\n", num2); showcuttingline(); break; case 6: puts("请输入三个整数(空格隔开):"); scanf("%d %d %d", &num1, &num2, &num3); returnvalue = sort3nums(&num1, &num2, &num3); showcuttingline(); printf("处理后数据(从小到大):%d %d %d\n", 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("\n您已经成功退出本系统,欢迎再次使用!!!"); 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