文档视界 最新最全的文档下载
当前位置:文档视界 › 一周学会_C#

一周学会_C#

一周学会_C#
一周学会_C#

计算机C语言趣味的程序设计——题目百例

Contest - 2011级C语言课程大作业 Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00 Current Time: 2012-2-23 15:51:18 Status:Running Public

写在最前: 本文档中的题目;在不不同的编译器中可能会有提示错误,呵呵,小小的动动手改下变量的定义就可以运行了……………….. 由于能力不足..有题目未解决的…或者有错误的我会…认真听取大家的..意见的…. 呵呵……..有一两个….偷了下懒哦……… 提供原题目还有本人自己的解答的源代码。感谢大家的。。。。建议……………. 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。

样例输入 10 8 15 样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++;

c语言趣味编程实例

1、编程序求5X+2Y+Z=50 的所有非负整数解。 #include int main() { int x, y, z; int count = 0; for (x = 0; 5 * x <= 50;x++) for (y = 0; 2 * y <= 50; y++) for (z = 0; z <= 50; z++) { if (5 * x + 2 * y + z == 50) { count++; printf("%d :", count); printf("x=%d,y=%d,z=%d", x, y, z); printf("\n"); } } return 0; } 2、把25个字母A、B、C、···、X、Y按如下要求打印出来:从最中间的字母M 开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。 要求:初始化时按字母表顺序赋值。 #include int main() { char x[] = "ABCDEFGHIJKLMNPQRST"; int k; int n = 0; while (x[n]) { n++; if (x[n] == 'M') { k = n;break; } } printf("%c,",x[k]); for (int i = 1; i <= 12; i++) if (i <= 11) printf("%c,%c,", (x[k] - i), (x[k] + i)); else printf("%c,%c。", (x[k] - i), (x[k] + i)); printf("\n");

C语言经典编程

猴子吃桃 1、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day--; } printf("the total is %d\n",x1); } 回文数问题 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法) 2.程序源代码: main( ) { long a,b,c,d,e,x; scanf("%ld",&x); a=x/10000;/*分解出万位*/ b=x%10000/1000;/*分解出千位*/ c=x%1000/100;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a); else if (b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b); else if (c!=0) printf(" there are 3,%ld %ld %ld\n",e,d,c); else if (d!=0) printf("there are 2, %ld %ld\n",e,d); else if (e!=0) printf(" there are 1,%ld\n",e); } 杨辉三角 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1

CC语言趣味程序设计编程百例精解

C-C++语言趣味程序设计编程百例精解() ?81.角谷猜想 日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。 *问题分析与算法设计 本题是一个沿未获得一般证明的猜想,但屡试不爽,可以用程序验证。题目中给出的处理过程很清楚,算法不需特殊设计,可按照题目的叙述直接进行证。 *程序说明与注释 #include<stdio.h> int main() { int n,count=0; printf("Please enter number:"); scanf("%d",&n); /*输入任一整数*/ do{ if(n%2)

n=n*3+1; /*若为奇数,n乘3加1*/ printf("[%d]:%d*3+1=%d\n",++count,(n-1)/3,n); } else { n/=2; /*若为偶数n除以2*/ printf("[%d]: %d/2=%d\n",++count,2*n,n); } }while(n!=1); /*n不等于1则继续以上过程*/ } 82.四方定理 数论中著名的“四方定理”讲的是:所有自然数至多只要用四个数的平方和就可以表示。 请编程证此定理。 *问题分析与算法设计 本题是一个定理,我们不去证明它而是编程序验证。 对四个变量采用试探的方法进行计算,满足要求时输出计算结果。 *程序说明与注释 #include<stdio.h> #include<stdlib.h> int main()

趣味c语言编程100例

趣味 c 语言编程100 例 【程序 1】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、 2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) / *以下为三重循环 */ for( j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /* 确保 i 、 j、 k 三位互不相同 */ printf("%d,%d,%d\n",i,j,k); } } 程序 2】 题目:企业发放的奖金根据利润提成。利润 (I) 低于或等于 10 万元时,奖金可提 10% ;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可可提成 7.5% ; 20 万到 40 万之间时,高于 20 万元的部分,可提成 5% ; 40 万到 60 万之间时高于

40 万元的部分,可提成 3% ;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5% ,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总 数? 1. 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2. 程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03;

复试C语言常考趣味程序设计

狼追兔子 1 巧夺偶数 2 五猴分桃 3 高次方数 4 借书方案 5 过桥问题 6 数制转换7 打渔晒网8 喝酒问题9 哥德巴赫猜想10 打印日历11 抓交通肇事逃逸犯12 反序数13 新郎新娘14 称重砝码15 求车速16 谁是窃贼17 出售金鱼18 百钱百鸡19 谜语博士20 猜牌术(-)21 舍罕王的失算22 怎样存钱利最大23 猜牌术(二)24 爱因斯坦的数学题25 取火柴游戏26 平分鱼和筐27 可逆素数28 三色球问题29 抢n游戏30 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。 样例输入 10 8 15

样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++; } else printf("%d",i); } printf("\n"); } return 0; } 问题B: 趣味程序设计_巧夺偶数 时间限制: 1 Sec 内存限制: 128 MB

C语言趣味程序设计编程100例精解

C/C++语言经典、实用、趣味程序设计编程百例精解(1) 1.绘制余弦曲线 在屏幕上用―*‖显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个―*‖。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y) 的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释 #include #include int m ain() { double y; int x,m; for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/ { m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for(x=1;x

有趣的C语言笔试题

有趣的C语言笔试题 1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf(" The buffer entered is[%s] ",buff); return 0; } 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 2.strcpy()函数 问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗? #include int main(int argc,char*argv[]) { int flag=0; char passwd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd,argv[1]); if(0==strcmp("LinuxGeek",passwd)) { flag=1; }

if(flag) { printf(" Password cracked "); } else { printf(" Incorrect passwd "); } return 0; } 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如: $./psswd aaaaaaaaaaaaa Password cracked 虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。 要避免这样的问题,建议使用strncpy()函数。 作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。 3.main()的返回类型 问:下面的代码能编译通过吗?如果能,它有什么潜在的问题吗? #include void main(void) { char*ptr=(char*)malloc(10); if(NULL==ptr) {

趣味C语言题

韩信点兵 在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数: 按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 你知道韩信至少有多少兵?()z谁结婚呢? 魔术师的秘密 在一次晚会上,一位魔术师掏出一叠扑克牌,取出其中13张黑桃,预先洗好后,把牌面 朝下,对观众说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一, 将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数 1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌 子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3, 这样依次将13张牌翻出,准确无误。现在的问题是,魔术师手中牌的原始顺序是怎样的? 约瑟夫问题 这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸 免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大海的都是非教徒.

求车速 一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859.两小时后里程 表上出现了第二个新的对称数.问该车的速度是多少新的对称数是多少? 常胜将军 现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输.请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为"常胜将军". 十进制转换成N进制(N=2 8 16 ) 定义一个方法Trans(int num, int regx) 实现将一个输入十进制数num转换成regx 进制 Eg: Trans(100, 16) 表示将 100 转成 16进制数输出 求100到1000之间有多少个其数字之和为5的整数. (答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500) 打鱼还是晒网scanf(“%d%d%d”,&year ,&month,&day); 中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是"晒网". *思考题:请打印出任意年份的日历 *运行结果 Enter year/month/day:1991 10 25

c语言趣味程序

c语言趣味程序 导读:就爱阅读网友为您分享以下“c语言趣味程序”的资讯,希望对您有所帮助,感谢您对https://www.docsj.com/doc/0614943149.html,的支持! 每个数都是质数。完全可以采用穷举的方法对乘数和被乘数进行穷举,经过判断后找出答案。但是这种方法给人的感觉是“太笨了”,因为组成的数字只是质数(4个),完全没有必要在那么大的范围内进行穷举,只需要试探每一位数字为质数时的情况即可。采用五重循环的方法实现对于5个数字的穷举,前面的许多例题中都已见过。循环实现简单易行,但嵌套的层次太多,需要穷举的变量的数量直接影响到循环嵌套的层数,这种简单的实现方法缺少技巧性。本例的程序中给出了另外一种同样功能的算法,该算法的实现思想请阅读程序。程序中并没有直接对质数进行穷举,而是将每个质数与1到4顺序一一对应,在穷举时为处理简单仅对1到4进行穷举处理,待要判断产生的乘积是否满足条件时再利用一个数组完成向对应质数的转换。请体会程序中的处理方法。程序中使用的算法实际上是回朔法。*程序说明与注释#include<stdio.h>#define NUM 5 /*需要穷举的变量数

目*/#define C_NUM 4 /*每个变量的值的变化范围*/int a[NUM+1]; /*为需要穷举的变量开辟的数组*//*a[1]:被乘数的百位,a[2]:十位,aa[3]:个位a[4]:被乘数的十位a[5]:个位*/int b[]={0,2,3,5,7}; /*存放质数数字的数组,不使用第0号元素*/int f(long sum);int main(){int i,not_finish=1;i=2; /*i:将要进行处理的元素的指针下标。设置初始值*/a[1]=1; /*为第1号元素设置初始值*/while(not_finish) /*not_finish:程序运行没结束标记*/{while(not_finish&&i<=NUM)/*处理包括第i 个元素在内的后续元素,找出当前条件下的一种各个变量的一种可能的取值方法*/if(a>=C_NUM) /*当要处理的元素取超过规定的C_NUM时*/if(i==1&&a[1]==C_NUM)not_finish=0; /*若1号元素已经到C_NUM,则处理全部结束*/else a[i–]=0; /*将要处理的元素置0,下标-1(回退一个元素)*/else a[i++]++; /*当前元素值加1后下标指针加1*/if(not_finish){long int sum1,sum2,sum3,sum4; /*定义临时变量*/sum1=b[a[1>*100+b[a[2>*10+b[a[3>; /*计算被乘数*//*利用数组的下标与质数的对应关系完成序号1到4向质数的转换*/sum2=sum1*b[a[5>; /*计算乘数个位与被乘数的部分积*/sum3=sum1*b[a[4>; /*计算乘数十位与被乘数的部分积

c语言趣味题

C/C++语言经典、实用、趣味程序设计编程百例精解 1.绘制余弦曲线 在屏幕上用―*‖显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个―*‖。 为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。程序中利用反余弦函数acos计算坐标(x,y) 的对应关系。 使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释 #include #include int m ain() { double y; int x,m; for(y=1;y>=-1;y-=0.1) /*y为列方向,值从1到-1,步长为0.1*/ { m=acos(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/ for(x=1;x

c语言趣味编程

VC++上机实验说明 C程序设计同其他程序设计一样,使实践性很强的课程。除了要听好课,多看课外书外,还需大量的上机实践才能更好地理解和掌握所学到的内容。一般来说,上机和讲课时间之比应不少于1:1。但由于目前各校安排的教学时数限制,课内时间将更多的精力用于讲课上,课内安排的上机时间相对较少,学生不要因此对上机的重要性有所误解。学生应在课外再花一定的时间进行C语言的上机实践,这样才能学好该门课。 上机实验的目的有以下几个方面: ⑴验证所编写的程序的正确性。 ⑵进一步理解教材和课堂授课中介绍的内容 ⑶熟练地掌握C程序开发环境的使用,为今后开发大型软件打好基础。 ⑷学习和掌握一般程序的调试和测试方法。 上机前应充分做好以下准备工作: ⑴复习和掌握与本次实验有关的教学内容。 ⑵根据本次实验的内容,在纸上编写好准备上机调试的程序,并初步检查无误。 ⑶准备好对程序进行测试的数据。 ⑷对每种测试数据,给出预期的程序运行结果。 ⑸预习实验步骤,对实验步骤中提出的一些问题进行思考。 上机实验后,应及时写出实验报告,实验报告应包括以下内容: ⑴实验目的和内容。 ⑵程序说明,包括程序结构、各模块的算法(N-S图表示)。 ⑶打印出的调试正确的源程序。 ⑷打印出的程序运行记录(包括对不同测试数据的运行结果)。 ⑸针对实验步骤中提出的问题,写出解决办法及对运行结果的分析。

怎样学习C语言 很多同学对学习C语言感到很难,尤其是在各高校将C语言放在大学第一学年教学时经常会考试不及格。究竟怎样才能学好C语言?这里将我对C语言的理解给大家介绍一下, 计算机语言挺枯燥的,如何提起兴趣? 首先要明确学习的目标,没有明确的学习目标就没有学习动力。给自己定一个目标,比如这次一定通过课程考试,或者这个月学习完做个东西出来等等。其次,确定了目标之后,要认真去做,多上机操作实践,遇到不懂的要多跟教师和其他同学交流,千万不能放弃。当自己编的一段小程序运行通过,或攻下一道难题,自己就会获得一种成就感,可能还会很兴奋,也就渐渐有了兴趣。最后,要把所学的知识运用到实际问题当中,这样既可以巩固所学的知识,不至于完学了就忘,还可以根据实际需要拓展知识面。这样良性循环,兴趣也会越来越浓。 学习计算机语言最好的方法是什么?答曰:读程序。 没错,读程序是学习C语言入门最快,也是最好的方法。不要总是抱着书本逐行啃,而是学习它们的例程。学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,仔细研读程序,直到每一行都理解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止。这一过程,就和我们学习任何其他语言比如英语和汉语一样。我们大家都有体会,我们学习一门语言,都是从最基本的语法开始,然后学习一些字和词,再来学习一些词组或句子,然后再用词组和句子组成一段话,表达一个简单的意思,最后才是写一篇文章或者是一本书,表达更复杂的思想。我们知道,在我们完成这一过程时,并不是像说得这么简单。在我们能写出一篇好的文章或者一本好书之前,我们可能需要阅读大量的其他人写的好文章或好书,有时我们还要把它们背下来;同样的,在我们写出一个好的程序或者软件前,我们也需要阅读大量的样本例程或者软件的源代码,甚至要背一些好的程序代码。 写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。? 那么怎样才算精通程序设计呢?怎样才能精通程序设计呢?举个例子:你面前有10个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这10个人问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。

C语言趣味题

1.gets()函数问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; } 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 2.strcpy()函数 问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗? 1#include 2int main(int argc, char *argv[]) 3{ 4int flag = 0; 5char passwd[10]; 6memset(passwd,0,sizeof(passwd)); 7strcpy(passwd, argv[1]); 8if(0 == strcmp("LinuxGeek", passwd)) { 9flag = 1; 10} 11if(flag) { 12printf("\n Password cracked \n"); 13} else { 14printf("\n Incorrect passwd \n"); 15} 16return 0; 17} 18

答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如: 19$ ./psswd aaaaaaaaaaaaa 20 21Password cracked 虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。 要避免这样的问题,建议使用strncpy()函数。 作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令…-fno-stack-protector?来实现上述方案。 3.main()的返回类型 问:下面的代码能编译通过吗?如果能,它有什么潜在的问题吗? 22#include 23 24void main(void) 25{ 26char *ptr = (char*)malloc(10); 27 28if(NULL == ptr) 29{ 30printf("\n Malloc failed \n"); 31return; 32} 33else { 34// Do some processing 35free(ptr); 36} 37

c语言趣味题

一、九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 分析: ①这需要编写一个循环结构的程序。 ②需要循环嵌套。外循环控制打印第几行,内循环控制打印某一行的若干个等式。 程序如下: main( ) { int m,n; for(m=1;m<=9;m++) { for (n=1;n<=m;n++) printf("%1d*%1d=%-4d",m,n,m*n); printf("\n");

} } 请思考:请你用别的编程方法再解此题。 二、说谎 有甲、乙、丙三人,每人或者说真话,或者说假话。 甲说:“乙说假话。” 乙说:“甲和丙是同一种人。” 问甲、乙、丙三人谁说真话,谁说假话? 分析: ①本题看似漫无边际,无法入手,不知道怎么与C语言程序设计挂钩。但只要和“真”、“假”、逻辑表达式联系起来,脉络就清晰起来。 ②这里用整型变量a、b、c表示甲、乙、丙三人说话的真假,当变量值为1时表示此人说真话,变量值为0时表示此人说假话。 甲说:“乙说假话。”这有两种可能:甲说的是真话,而乙确实说假话,即: a==1&&b==0 等价于a&&!b 或者甲说的是假话,而乙说真话,即: a==0&&b==1 等价于!a&&b 由此可得逻辑表达式: a&&!b||!a&&b

12个有趣的C语言面试题及答案

12个有趣的C语言面试题及答案 2016-05-09 12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include int main(void) { char buff[10]; memset(buff,0,sizeof(buff));

gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; } 答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 2.strcpy()函数 问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗? #include int main(int argc, char *argv[]) { int flag = 0; char passwd[10]; memset(passwd,0,sizeof(passwd)); strcpy(passwd, argv[1]); if(0 == strcmp("LinuxGeek", passwd))

{ flag = 1; } if(flag) { printf("\n Password cracked \n"); } else { printf("\n Incorrect passwd \n"); } return 0; } 答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:$ ./psswd aaaaaaaaaaaaa Password cracked

一个有趣的C语言题目,感兴趣就做一下

题目如下: unsigned char const Tab[]={ 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31, 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32, 33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63, 34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64, }; 用最简单的方法将Tab里的数字打印出来,要求依次打印出如下格式: The 1 print: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, The 2 pinnt: 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34, The 3 pinnt: 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36 依次类推,直到最后一次打印为: The ? pinnt: 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 至此,程序运行结束,或者又循环到第1次打印的结果. 请用最简单的C语句实现此算法.

相关文档