c语言

C语言程序设计100例之(31):全排列问题

瘦欲@ 提交于 2020-03-03 09:40:20
例31 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 n(1≤n≤9) 输出格式 由1~n组成的所有不重复的数字序列,每行一个序列。序列中每个数字占5个宽度。 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 (1)编程思路。 采用递归的方法来生成全排列。 (2)源程序。 #include <stdio.h> int a[9],flag[10]={0}; void dfs(int pos,int n) { if (pos==n) // 已有n个数 { for (int i=0;i<n;i++) printf("%5d",a[i]); printf("\n"); } else { for(int i=1;i<=n;i++) { if(flag[i]) continue; a[pos]=i; flag[i]=1; dfs(pos+1,n); flag[i]=0; } } } int main() { int n; scanf("%d",&n); dfs(0,n); return 0; } 习题31 31-1 选书 本题选自洛谷题库 (https://www.luogu.org/problem/P1657) 题目描述 学校放寒假时,信息学奥赛辅导老师有1,2

C语言程序设计100例之(32):组合问题

元气小坏坏 提交于 2020-03-03 09:39:13
例32 组合问题 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 例如n=5,r=3,所有组合为:123,124,125,134,135,145,234,235,245,345。 输入格式 一行两个自然数n,r(1<n<21,1≤r≤n)。 输出格式 所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。 输入样例 5 3 输出样例 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 (1)编程思路。 用递归来完成。 设函数void dfs(int pos,int num)表示为第pos(0≤pos≤r-1)个数取值,取值可以为num~n之一。显然,若r-pos>n-num+1,则后面剩下的数不够,直接剪枝;否则,在num~n中取一个数i(num≤i≤n)赋给a[pos],继续为下一个位置pos+1取数,即递归调用函数dfs(pos+1,i+1)。 (2)源程序。 #include <stdio.h> int a[21],n,r; void dfs(int pos,int num) { if (pos==r) // 已有r个数 { for

C语言程序设计100例之(29):拉丁方阵

非 Y 不嫁゛ 提交于 2020-03-03 08:28:12
例29 拉丁方阵 问题描述 构造 NXN 阶的拉丁方阵,使方阵中的每一行和每一列中数字1到N只出现一次。如N=4时: 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 输入格式 一个正整数n(2<=n<=9)。 输出格式 生成的n*n阶方阵。 输入样例 4 输出样例 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 (1)编程思路。 观察给出的例子,可以发现:若将每一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照此规律可以很容易的写出程序。 (2)源程序。 #include <stdio.h> int main() { int n; scanf("%d",&n); int i,k,t; for(i=0; i<n; i++) { t=i%n; // 确定该拉丁方阵第i行的第一个元素的值 for(k=0; k<n; k++) // 按照环的形式输出该行中的各个元素 printf("%d ",(k+t)%n+1); printf("\n"); } return 0; } 习题29 29-1 奇数阶魔方 本题选自杭州电子科技大学OJ题库 (http://acm.hdu.edu.cn/showproblem.php?pid=1998) Problem Description 一个 n

Linux环境下C语言getopt函数的详细解析

别等时光非礼了梦想. 提交于 2020-03-03 07:11:40
该函数在头文件 getopt.h 中。 函数原型: int getopt ( int argc , char * const argv [ ] , const char * optstring ) ; 返回值为int类型,其实解析成功一个选项时(可能这时看不懂,没关系,后面会解释)这个返回的就是一个字符,因为字符可以转为整数。 若解析完毕,则返回-1。 前两个参数大家都知道,就是main函数的参数选项: argc 是参数个数, argv 是参数的字符串数组(不要忘记 argv[0] 是"./可执行文件名")。而第三个参数就是 选项字符串 。 什么是 选项字符串 ? 选项 大家都知道,比如: gcc -o test test.c gcc -v 上面的 -o 、 -v 就是选项,其中 -o 是带参数的选项,其参数为 test ,而 -v 是不带参数的选项。 那么说了这么多, 选项字符串其实就是一定格式的字符串,它决定了传给程序的参数 argv中 可以有哪些选项,而这些选项中哪些可以有参数。然后运行程序时, getopt 函数对 argv 进行解析,依次返回成功解析的选项,解析完毕后返回-1。 举个例子:选项字符串给定:“ab:c::”,那么说明运行程序可以给最多三个参数,分别为 -a , -b 和 -c , 其中 -a ,因为 没有后跟冒号 是不可以有参数的; -b ,因为

c语言 关键字之typedef 详解

本秂侑毒 提交于 2020-03-03 06:34:01
 在C语言中有一个typedef关键字,其用来定义用户自定义类型。当然,并不是真的创造了一种数据类型,而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之,可以使用typedef关键字定义一个我们自己的类型名称。   那么,究竟如何定义,又有哪些情况下可已使用呢?接下来我们就对它的几种用法进行说明: (1)基本数据类型定义   有些时候,我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时,其实他们的定义如下:   typedef unsigned char uint8_t; //无符号8位数   typedef signed char int8_t; //有符号8位数   typedef unsigned int uint16_t; //无符号16位数   typedef signed int int16_t; //有符号16位数   typedef unsigned long uint32_t; //无符号32位数   typedef signed long int32_t; //有符号32位数   很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时,就和使用unsigned char是一样的。如我们声明uint8_t var时

c语言中static关键字用法详解

拟墨画扇 提交于 2020-03-03 01:35:37
普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。 普通局部变量存储于进程栈空间,使用完毕会立即释放。 静态局部变量使用static修饰符定义 , 即使在声明时未赋初值,编译器也会把它初始化为0 。 且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变 。 static 关键字两种基本用法 static修饰局部变量,成为一个局部静态变量 static修饰局 部变量(静态局部变量)与普通局部变量相比: 静态局部变量作用域与连接属性与普通局部变量一样。 存储类: 静态局部变量分配在data/bss段 , 普通局部变量在栈上 。 生命周期: 因为存储类的不同,静态局部变量的生命周期得到延长了,直到程序结束,而普通的局部变量在函数体执行结束之后就直接回收销毁了,每次执行都会重新分配内存。 所以当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。 示例代码 #include <stdio.h> void test() { int num = 0; //普通局部变量 static int s_num = 0; //静态局部变量 s_num ++; num ++

C语言入门——DAY2(翁恺)

放肆的年华 提交于 2020-03-03 01:31:15
运算符的优先顺序 算术运算符最高(+ - * / %等) 关系运算符其次(如> ,<等) 赋值运算符最低 其中关系运算符中的==和!=在同类运算符中的优先级更低。 循环初始化小套路 做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为l 循环注意事项 if语句只要求 ( ) 里是零或非零,如果是零,对于if语句来说是条件不成立,就会跳过if语句。所以注意 ( ) 内“ = ”和“ == ”的使用。 for/while/do while/switch的特点 所有for语句都可以表示为while语句(反过来也是一样) while语句是先判断条件,再执行语句 do while语句是先执行再判断 决定switch语句执行情况的是判断条件和break; 补充知识 \ 是续行符,如果在 // 后面出现,那么下一行内容也会被注释掉 /**/在编译过程中会被编译器替换为空格从而达到忽略注释的目的 来源: CSDN 作者: Big_Truck_ 链接: https://blog.csdn.net/Big_Truck_/article/details/104581573

DS博客作业08--课程总结

三世轮回 提交于 2020-03-02 18:18:31
1、当初你是如何做出选择计算机专业的决定的? 当初选择计算机相关专业是因为有高中学长的推荐,说计算机专业的前景比较好,工资比较高,加上自己也有去了解一些,可能计算机专业的竞争比其他很多工科专业要小一些,感觉会比一些专业好,而且自己的成绩不是很高,就报了网络专业。 经过这一年的学习,我感觉计算机专业真的挺难的,跟自己开学前想的并不一样。如果再选一次,我可能不会选择这个专业。首先,再选择这个专业之前,我对计算机这个领域没有什么兴趣,也没有过什么了解,报这个专业也没有经过过多的考虑,所以在面对一大堆代码的时候很难提起兴趣。其次学好计算机专业需要大量的代码的积累,但是我的自制力不是很强,就导致每次想的和做的不一样,在这方面我感觉确实要加强。而且每天面对代码我感觉并不是一件很有趣的事情,有很多的代码感觉理论知识都是很容易理解的,但是一换成代码难度就增加了好多,要看好多遍才能理解。 计算机专业确实不是我擅长的专业,但是既然选择了这个专业,我会努力地去学习它。 2.对比开篇博客,哪些方面还存在哪些不足? 我记得开篇博客我好像构想了很多很华丽的目标,比如经常去图书馆什么的,但是现在看来,理想和现实的差别真的好大,上了大学好像就把这些目标都抛到脑后了,大学完全没有高中那种紧迫感,舒适的环境也导致我没有学习的紧迫感,往往只有快期末考试了才去补缺查漏。我觉得最大的不足是我没有学习的动力,每天都过得很安逸

关于学习C语言

白昼怎懂夜的黑 提交于 2020-03-02 18:16:14
c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了快到一个学期末了,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 我相信努力学习 还是能学懂的 来源: https://www.cnblogs.com/zl0228/p/6159948.html

C语言错误: HEAP CORRUPTION DETECTED

时光怂恿深爱的人放手 提交于 2020-03-02 08:14:00
程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //文本写文件 int writeWord(const char *path,const char *pword){ int ERRO_MSG = 0; if (path == NULL) { ERRO_MSG = 1; printf("path==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } if (pword == NULL) { ERRO_MSG = 2; printf("pword==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } //定义文件指针 FILE *fpw=NULL; //打开文件 fpw = fopen(path, "w");//w 打开只写文件,若文件存在,则文件长度清零,即文件内容会消失,若文件不存在则建立该文件 //判断文件是否打开成功 if (fpw==NULL) { ERRO_MSG = 1; printf("文件打开失败 fpw==NULL erro msg:%d\n", ERRO_MSG); return