C语言程序设计
宣宣啊
毕业于家里蹲大学,爱好写字,旅行。
展开
-
C语言思维导图
为了复习C语言,因此按照自己的复习重点来画了一个思维导图,希望能给各位同行带来参考。如有错误请指正。原创 2020-05-04 17:46:47 · 743 阅读 · 1 评论 -
稀疏矩阵压缩存储(C语言实现)
背景需求在一个矩阵中,如果非0元素远远少于0元素,那么这个矩阵就是稀疏矩阵,在实际应用中,计算机会耗费大量的空间存储这些无意义的0元素,如果能够压缩一下,将会减少计算机的开销。本篇文章以五子棋的棋局保存为背景,用c语言实现原始稀疏矩阵转换为压缩矩阵并且存储为文件,棋局复盘则读取文件将压缩矩阵转换为原始稀疏矩阵。图解假如有如下棋局,如果要保存,可以用1来表示红棋子,2来表示黑棋子,0表示...原创 2020-04-17 13:22:24 · 5202 阅读 · 0 评论 -
时间复杂度怎么算
一、什么是时间复杂度?一个语句的频度是指该语句在算法中重复执行的次数,算法中所有语句的频度之和是关于问题规模n的函数T(n),时间复杂度就是分析T(n)的数量级来得到的。算法的执行时间与T(n)的数量级成正比,而并不是相等。T(n)的数量级也记为O。二、常见的时间复杂度排序O(1) < O()<O(n)<O(n)<O()<O()<O()<O(n...原创 2019-11-28 00:05:29 · 3032 阅读 · 0 评论 -
单链表的倒置(c语言实现)
分析:如下图所示代码如下:void invert(struct Node *head){ struct Node *p0,*p1,*temp,*p2; p0 = head->next; p1 = p0->next; temp = p0; while(p1!=NULL){ p2 = p1->next; //必须放在前面,否则死循环 p1->ne...原创 2019-11-26 17:23:34 · 2988 阅读 · 0 评论 -
单链表删除节点(通过给定值删除)
分析:如下图所示代码如下:struct Node * Del(struct Node *head,int nodeData){ struct Node *p1,*p2; //p1指向待删除的节点,p2指向p1前面的节点 int flag = 0; //定义一个标志,如果是1 则已经找到要删除的节点 如果是0 则没找到 p1 = head; //p1先指向头结点,从头开始找 w...原创 2019-11-26 16:40:27 · 1361 阅读 · 0 评论 -
单链表的创建(c语言实现)
一:动态内存分配创建链表(链表的元素顺序向后添加)分析:顺序向后添加的原理如下图所示,主要定义p、q两个指针代码如下:struct Node *CList(){ //创建链表,新节点总顺序向后 struct Node *head,*p,*q; int ch; head = (struct Node *) malloc(sizeof(struct Node)); he...原创 2019-11-26 14:09:57 · 14531 阅读 · 3 评论 -
用递归的方法计算1+2+3+...+n
分析:这个同阶乘的道理一样,递归实现很简单代码如下:#include <stdio.h>int sum( int n){ if(n<=0) printf("data error"); else if(n ==1) return 1; else return n+sum(n-1);}int main(){ int n; scanf("%d",&...原创 2019-11-25 18:54:25 · 27754 阅读 · 1 评论 -
从键盘上输入任意字符,输出该字符的ascii码值
分析:c语言中字符其实本质和整型一样,输出格式改为%d。代码如下:#include <stdio.h>int main(){ char c; scanf("%c",&c); printf("%d",c);}运行结果:...原创 2019-11-23 18:55:00 · 28359 阅读 · 0 评论 -
选手比赛成绩排名
分析:同学生成绩的道理一样,就是一个冒泡排序,这次是从小到大代码如下:#include <stdio.h>#define N 5struct Comp{ char name[50]; double score;};void DDubbleSort(struct Comp comp[]){ for(int i = 0; i < N-1 ; i++){ f...原创 2019-11-23 18:48:09 · 614 阅读 · 0 评论 -
去掉一个最高分,去掉一个最低分,剩下的平均值作为最终成绩。(c语言实现)
分析:这个也比较简单,用一个数组接收评委的分数,然后累加。最后找到最高分和最低分减去平均一下就可以。代码如下:#include <stdio.h>#define N 5int main(){ double score[N],sum=0.0,avg=0.0; for(int i = 0 ; i<N ;i++){ printf("第%d位评委的分数:\n",i+...原创 2019-11-23 17:57:55 · 25468 阅读 · 9 评论 -
编程求1*2+3*4+..+99*100
分析:本题很简单,只要定义一个循环累加即可。#include <stdio.h>int main(){ int i,sum = 0; for(i = 1;i<=99;i+=2){ printf("%d*%d\n",i,i+1); sum+=i*(i+1); } printf("%d\n",sum);}运行结果:...原创 2019-11-23 17:34:10 · 7036 阅读 · 1 评论 -
结构体数组的排序(学生成绩问题)
需求:有一个学生结构体变量,有姓名,学号,成绩。让用户输出N个学成的信息,用冒泡法对这n个学生的成绩排序后输出。分析:本题的突破点在冒泡法对结构体数组排序,其实同整型数组排序一样。首先看普通的冒泡 排序:代码如下:#include <stdio.h>#define N 5struct Student{ char name[10]; long stuNo; ...原创 2019-11-23 12:40:05 · 14329 阅读 · 3 评论 -
字符串的逆序存放(c语言)
分析:字符串逆序存放也就是字符数组的倒置,只要循环交换数组的开头和结尾即可。代码如下:#include <stdio.h>#include <string.h>int main(){ char str[50]; scanf("%s",str); int len = strlen(str); int top=0,end = len-1; //定义两个...原创 2019-11-23 10:57:11 · 21976 阅读 · 3 评论 -
泰勒公式求sinx的近似值
分析:泰勒公式的规律也比较明显,思路比较简单,有三个突破点:1. x的几次方?这个通过观察从1开始每次加2就行2. 分母是几的阶乘?很明显和x的次方数一样3. 是正还是负? 即是-1的 i 次方代码如下:#include <stdio.h>#include <math.h>int main(){ int i=0,j=1; d...原创 2019-11-22 23:03:06 · 8257 阅读 · 0 评论 -
对一个double类型的小数,保留两位,并且第三位四舍五入
分析:如果只是输出,则可以直接控制输出语句来实现。如果要得到最后四舍五入后的数据,可以通过简单的加减乘除来实现。代码如下:#include <stdio.h>int main(){ double n; scanf("%lf",&n); n = ((int) (n*100+0.5))/100.0; printf("%.2lf\n",n); printf("...原创 2019-11-22 19:25:41 · 2248 阅读 · 1 评论 -
用递归的方法求5的阶乘
代码如下:#include <stdio.h>int fact(int n){ if(n==0) return 1; return n*fact(n-1);}int main(){ int rs = fact(5); printf("%d\n",rs);}运行结果:原创 2019-11-22 19:00:54 · 3424 阅读 · 0 评论 -
求100以内的素数
代码如下:#include <stdio.h>#include <math.h>int main(){ int i,j; for(i = 2;i<=100;i++){ //1不是素数 int flag = 0; for(j=2;j<=sqrt(i);j++){ if(i%j==0){ flag=1;break;} }...原创 2019-11-22 17:57:43 · 141 阅读 · 0 评论 -
判断101-200之间有多少个素数,并输出所有的素数
分析:首先素数是只能被1和其本身整除的数。代码如下:#include <stdio.h>#include <math.h>int main(){ int i; for(i=101;i<=200;i++){ int flag = 0; //定义一个标志 for(int j=2;j<=sqrt(i);j++){ //这里注意,只...原创 2019-11-22 17:46:31 · 370 阅读 · 0 评论 -
斐波那切数列
分析:兔子数列,规律就是当n=1或者n=2时,兔子有1只,n>=3时兔子是前两个月的和。代码如下:#include <stdio.h>int fb(int n){ if(n==1||n==2) return 1; else return (fb(n-1)+fb(n-2));}int main(){ int n; scanf("%d",&n)...原创 2019-11-22 17:15:47 · 376 阅读 · 0 评论 -
输出99乘法表
题目:输出99乘法表分析:这个比较简单,直接用二重循环就可以实现代码如下:#include <stdio.h>int main(){ int i,j; for(i = 1; i<=9;i++){ for(int j = 1;j<=i;j++){ printf("%d*%d=%d\t",j,i,i*j); } putchar('\n');...原创 2019-11-22 16:17:49 · 1395 阅读 · 0 评论 -
把三个整数从小到大输出
题目:输入三个整数x,y,z。把这三个数从小到大输出。分析:这就是一个排序问题,因为只有三个数,所以只需要两两比较,从小到大排列好。代码如下:#include <stdio.h>int main(){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(x>y){ int tem = x; x = ...原创 2019-11-22 16:09:05 · 4045 阅读 · 0 评论 -
完全平方数问题(C语言)
题目:一个整数,他加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数是多少?分析:完全平方数,就是可以开方得到整数的数。代码如下:#include <stdio.h>#include <math.h>int main(){ int i=1,x,y; while(1){ x = sqrt(i+100); //加100后开方,...原创 2019-11-22 15:52:37 · 2594 阅读 · 1 评论 -
有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数
题目:有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?分析:个位十位百位,分别从1到4的数字中选择,可以用三重循环来实现。最后判断三个数字是否有两个相等来控制输出代码如下:#include <stdio.h>int main(){ int i,j,k; for(i=1;i<=5;i++){ for(j=1;j<=5;j...原创 2019-11-22 15:28:59 · 2057 阅读 · 1 评论 -
从键盘输入一个字符串 a,并在串中的最大元素后边插入另 外输入的字符串 b。
题目:从键盘输入一个字符串 a,并在串中的最大元素后边插入另 外输入的字符串 b。分析:第一步要做的是找到最大的元素所在的下标,第二步就是将b字符串插入最大的元素后面。代码如下:#include <stdio.h>#include <string.h>int main(){ char a[50],b[]="abc"; scanf("%s",a); i...原创 2019-11-21 18:28:54 · 8010 阅读 · 0 评论 -
从键盘输入两个字符串 a 和 b,要求不用库函数 strcat 把串 b 的前五个字符连接到串 a 中
题目:从键盘输入两个字符串 a 和 b,要求不用库函数 strcat 把串 b 的前五个字符连接到串 a 中;如果 b 的长度小于 5,则把 b 的所 有元素都连接到 a 中。分析:首先将字符串a指向最后一个位置,循环b数组给a赋值。代码如下:int main(){ char a[50],b[50]; int i=0; gets(a);gets(b); while(a[i])...原创 2019-11-21 17:19:38 · 11672 阅读 · 10 评论 -
二分查找(c语言实现)
题目:从键盘输入一个整数,,用折半查找法找出该数在 10 个有 序整型数组 a 中的位置。若该数不在 a 中,则打印出相应信息。 试编程。分析:问题的突破点在于循环在什么时候终止,带入几个特定的值可以发现,要不找到这个值循环终止,要不全部找完了还没找到就终止。代码如下:#include <stdio.h>int halfSearch(int a[],int targ...原创 2019-11-21 16:32:51 · 1392 阅读 · 0 评论 -
程打印用户指定的 n 阶顺时针螺旋方阵
题目:试编程打印用户指定的 n 阶顺时针螺旋方阵(n<10)。分析:显而易见,本题目是要用二维数组来实现。赋值有四个方向:右、下、左、上依次来赋值。本题的代码是转载其他的文章,原作者的代码写的非常清楚,再次附上原文链接:https://blog.csdn.net/Pussy_Foot/article/details/90131936。我贴出的代码是经过我的修改而成的,是为了以后我复习...转载 2019-11-20 23:04:45 · 1392 阅读 · 3 评论 -
打印杨辉三角
题目:打印杨辉三角(输出10列)。分析:杨辉三角有上图所示的性质,第一列全为1,而且上一行的两列相加等于下一行的一列。显而易见,用二维数组实现再合适不过,首先将第一列全部设置为1,剩下的全部为0。再通过相加给剩余元素赋值。最后只显示左下半三角即可。代码如下:#include <stdio.h>int main(){ int a[10][10] = {0},i,j; ...原创 2019-11-20 21:24:04 · 6593 阅读 · 0 评论 -
通过循环按行顺序为一个 5×5 的二维数组 a 赋 1 到 25 的自 然数,然后输出该数组的左下半三角
题目:通过循环按行顺序为一个 5×5 的二维数组 a 赋 1 到 25 的自 然数,然后输出该数组的左下半三角分析:显而易见,数组赋值是比较简单的事情,突破点在于只输出数组的左下半角,左下半角的特点是行标不大于列标,相当于i<=j。代码如下:#include <stdio.h>int main(){ int a[5][5],i,j,k=0; for(i=0;i...原创 2019-11-20 19:28:06 · 12122 阅读 · 2 评论 -
定义一个含有 30 个整型元素的数组,按顺序分别赋予从 2 开始的偶数
题目:定义一个含有 30 个整型元素的数组,按顺序分别赋予从 2 开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个 数组中并输出。分析:第一个问题是将长度为30的a数组赋值,直接a[i] = 2+k;k+=2;第二个问题累加五个赋值一次即可实现。代码如下:#include <stdio.h>int main(){ int a[30],b[6],i,j=0,k...原创 2019-11-20 19:13:02 · 15396 阅读 · 6 评论 -
将 a 的行和列的 元素互换后存到另一个二维数组 b 中
题目:若有说明:int a[2][3]={{1,2,3},{4,5,6}};现要将 a 的行和列的 元素互换后存到另一个二维数组 b 中。请编写程序并输出 a 和 b 数组中的元素。分析:换句话说,本题是在求矩阵的转置,只要将行变成列,列变成行就可以。代码如下:#include <stdio.h>int main(){ int a[][3] = {{1,2,3},{4...原创 2019-11-20 18:54:15 · 4969 阅读 · 0 评论 -
从键盘输入若干个整数,其值在 0 至 4 范围内,用-1 作为 输入结束的标志。统计每个整数的个数
题目:从键盘输入若干个整数,其值在 0 至 4 范围内,用-1 作为 输入结束的标志。统计每个整数的个数分析:一般统计个数,通常是用key-value的思想来实现,如果是用Java的话直接用map集合就搞定了。但是c语言可以用数组来等价实现这个功能,所有的整数都在0到4内。所以可以定义一个长度为5的数组,数组的下标代表整数,所对应的值作为整数的个数。代码如下:#include <...原创 2019-11-19 20:18:39 · 17863 阅读 · 5 评论 -
是将字符串 s 中所有的字符'c'删除
题目:输入一个字符串,编写程序将字符串的所有'c'删除。解这个题目必须要用到双下标,非常的巧妙。这种思想类似于游戏逢七必过,遇到字符c就过。双下标i和j,只有i的位置不是字符c的时候j才自增。否则不处理。代码如下:#include <stdio.h>main() {char s[80]; int i,j; gets(s); for (i=j=0;s...原创 2019-11-18 13:04:17 · 8649 阅读 · 3 评论 -
将已按升序排好序的两个字符串 a 和 b 中的字符,按升序归并到字符串 c 中
题目:将已按升序排好序的两个字符串 a 和 b 中的字符,按升序归并到字符串 c 中这个问题的已知条件是字符串a和b都是已经排好序的,要解决升序合并到c中,只需要循环比较两个字符数组,并且在循环中将值赋给字符串c。循环的条件:两个字符串都没有到末尾,也就是不等于'\0'代码如下:#include <stdio.h>#include <string.h>...原创 2019-11-18 12:37:41 · 8624 阅读 · 0 评论 -
将字符串 s 中的每 个字符按升序的规律插入到 a 中
题目:有已排好序的字符串 a,下面的程序是将字符串 s 中的每个字符按升序的规律插入到 a 中。例如:a="cehiknqtw" s="fbla"这个题目大体上可以分为两步:1.找到插入的位置,也就是将字符串s的每个字符都和a的字符相比,知道a中的字符大于s中的字符。2.将s中的字符插入 代码如下:#include <stdio.h>#inc...原创 2019-11-18 11:55:08 · 5239 阅读 · 0 评论 -
打印所有的水仙花数和玫瑰花数
水仙花数是指一个三位数,其各位数字的和等于该数本身。例如:153是一个“水仙花数”,因为1的三次方+5的三次方+3的三次方=153。本题的实现逻辑比较简单,问题的突破点在于得到三位数中的个位十位百位数。个位数 = 三位数%10十位数 = 三位数/10%10百位数 =三位数/100%10最后判断三个数的立方和是否等于这个三位数即可。代码如下:void water(){...原创 2019-11-17 23:00:37 · 992 阅读 · 0 评论