文档库 最新最全的文档下载
当前位置:文档库 › C语言复习

C语言复习

C语言复习
C语言复习

1.C程序通常是用编辑器程序填入的。

2.预处理程序是在翻译阶段开始之前自动执行的。

3.两种最常用的预处理指令是把其他文件包含到要编译的文件中和用程序文本替换专门的符号。

4.为了生成可执行文件,连接程序把编译器的输出和各种库函数连接在一起。

5.C语言程序都是从Main函数开始执行。

6.函数体用左花括号({)开始,用右花括号(})结束。7.语句都用分号结束。

8.标准库函数Printf在屏幕上显示信息。

9.转义序列\n表示新行符,它把光标定位在屏幕下一行的开始位置。

10.标准库函数Scanf用来读取来自键盘的数据。

11. 在scanf函数的格式控制串中,转换说明符%d 表示要输入一个

整数。在printf函数的格式控制串中,它表示要输出一个整数。12. 不论何时把某个值放置到某个存储单元中,该值都会覆盖掉该存储单

元中原有的值。这种读入过程称为破坏性读入。

13. 从存储单元中读取值时,该存储单元中的值不变。读取过程称为非破坏

性读出。

14. if语句用来作出决策。

15. 根据要执行的动作以及这些动作应该执行的顺序求解问题的过程称算法

16. 指定语句在计算机程序中的执行顺序称为程序控制。

17. 所有的程序都可以用三种控制结构编写。这三种控制结构是顺序结构、选择结构,循环结构

18. if/else选择结构在条件为真时执行一个动作,在条件为假时执行另一个动作。

19. 用花括号组合在一起的多个语句称为复合语句。

20. while循环结构在条件为真时反复执行一条语句或一组语句。

21. 一组指令循环执行指定次数,这种循环称为计数器控制的循环。

22. 在事先不知道一组语句会反复执行多少次的情况下,可以用一个标记值终止循环。

1.编辑器2.预处理3.把其它文件包含到要编译的文件中、用程序文本替换专门的符号。4连接 5. Main 6. 左花括号({),右花括号(})。7. 分号8. Printf 9. 新行10. scanf11. % d 12. 破坏性13. 非破坏性14. If 15. 算法16. 程序控制17. 顺序结构、选择结构、循环结构18. if/ else19. 复合语句20. While

21.计数器控制的22. 标记

23. 在计数器控制的循环中,计数器用来计算一组指令应该被反复执行的次数

24. 执行循环结构中的continue 语句能够立即执行下一次循环。

25. 执行循环结构或switch结构中的break 语句能够立即退出该结构。

26._switch选择结构_用来测试某个特定的变量或表达式是否等于每一个假设的整常数值。

27. C语言的程序模块称为函数。

28. 函数是通过函数调用激活的。

29. 只能被定义它的函数部所识别的变量称为局部变量。

30. 被调用函数中的return 语句用来把表达式的值传回给调用函数。

31. 函数的头部用关键字void表示它没有返顺值或表示它不包含参数。

32. 标识符的作用域指可使用该标识符的程序区域。

33. 把控制权从被调用函数返回到调用函数的三种方法是执行return语句、执行return表达式和___遇到结束函数的左花括号

34. 编译器用函数原型检查传递给函数的参数个数、参数类型和参数顺序。

35. rand函数用来产生随机数。

36. Srand 函数用来给随机数程序设置随机数种子。

37. 存储类别说明符有auto、register、extern和static。

38. 在块或函数参数列表中声明的变量除非指定了存储类别,否则其存储

类别被假定为Auto 。

39. 存储类别说明符Register建议编译器把变量存储在计算机的某个寄存器中。

40. 在块或函数之外声明的变量是外部,全局变量。

41. 要想使函数中的局部变量在函数调用之间保持其值,该变量必须用存

储类别说明符Static说明。

42. 标识符的四种可能的作用域是函数作用域、文件作用域、和块作用域,函数原型作用域。

43. 直接或间接调用自身的函数称为递归函数。

44. 递归函数通常由两部分组成。一部分是通过测试基本实例确定是否终止递归,另一部分是通过递归调用把问题简化。

45. 数值列表和数值表储存在数组中。

46. 数组元素的相关性表现在它们具有相同的名字和类型。

47. 用来引用特定数组元素的数字称为下标。

48. 应该用符号常量声明数组的大小,因为这种能够更容易调整程序。

49. 把数组元素按顺序存放的过程称为数组排序。

24. continue25. Break 26. swithc选择结构27. 函数28. 函数调用29. 局部变量30. Return 31. Void 32. 作用域33. 执行return语句、执行return表达式、遇到结束函数的左花括号34. 函数原型35. rand36. Srand 37. auto、register、extern、static 38. Auto 39. Register 40. 外部、全局41. Static 42. 函数作用域、文件作用域、块作用域、函数原型作用域。43. 递归44. 基本45. 数组46. 名字、类型47. 下标48. 符号常量49. 排序23. 控制变量或计数器

50.确定某个数组中是否包含某个关键值的过程称为数组数查找。

51. 使用两个下标的数组称为二维数组。

52. 指针是把另一个变量的地址作为其值的变量。

53. 有三种值可以来初始化指针,它们是0、NULL和地址。

54. 能够赋给指针的唯一的整数是0。

50. 查找51. 二维52. 地址53. 0、NULL、地址。54. 0

二.判断下述说法是否正断。如不正确,说明理由。

1. printf函数总是从新行的起始位置开始打印。( )

2. 计算机会把/*和*/之间的注释文本打印到屏幕上。( )

3. 在printf函数的格式控制串中使用转义序列\n会把光标定位到屏幕上下一行开始位置

4. 所有的变量在使用前都必须予以声明。( )

5. 在声明变量时必须给出变量的类型。( )

6. C语言认为变量number和NuMbEr是相同的。( )

7. 声明语句可放在函数体中的任何位置。( )

8. printf函数的格式控制串之后的所有参数的前面都必须有&。( )

9. 求余运算符%只能用于两个整数操作数。( )

10. 算述运算*、/、+和一具有相同的优先级。( )

11. 打印三行输出的C语言程序必须用三条printf语句。( )

12. 一个数组能够存放许多不同类型的值。( )

13. 数组的下标可以float数据类型。( )

14. 如果初始化值列表中的初始化值的个数少于数组的元素个数,C编译器会自动把剩余的元素初始化为初始化值列表中的最后一个值。(

15. 初始化值列表中的初始化值个数多于数组元素的个数是错误的。(

16. 把单个数组元素传递给修改该元素值的函数会使调用函数包含修改后的值。( )

1. 不正确。printf函数总是从光标所在位置开始打印,光标位置可在屏幕上某行的任何位置。

2. 不正确。在执行程序时,注释不会使计算机产生任何动作。注释只是用来提高程序的可读性。6. 不正确。C语言是对大小写敏感的,所以这两个变量是不相等的。7. 不正确。声明必须放置在函数体左括号之后和任何可执行语句之前。8. 不正确。printf函数的参数之间通常不使用&,scanf函数的格式控制串之后的参数通常要在前面加上&。例外情形在第6章和第7章中讨论。10. 不正确。运算符*、/和%具有相同的优先级,而运算符+和-的优先级较低。11. 不正确。在printf 语句中用多个\n转义序列可进行多行打印。12. 不正确。数组只能存储具有相同类型的值13不正确。数组下标必须是整数或整数表达式14不正确。C编译器自动把余下的元素初始化为0. 16不正确。数组的单个元素是传值调用。如果把整个数组传递给函数,被调用函数对数组元素值的修改就会影响到原始数组。

三.判断下列各叙述的正确性,若正确在( )标记√,若错误1. ( ) 全局变量与函数体定义的局部变量重名时,局部变量不起作用。2. ( ) C 程序中,有调用关系的所有函数必须放在同一个源程序文件中。3. ( ) 函数定义时,可以不指定形参的类型,函数调用时由实参的类型决定形参的类型。4. ( )C程序文件中每个函数都将被本文件调用。

5.()函数可以嵌套定义,即在一个函数的部可以定义另一个函数,

6.()当函数定义放在main()函数前面的时候,可以缺省函数声明。

7.()在C语言中允许函数之间的嵌套调用。

8.()局部静态变量是在编译时赋初值的,即只赋初值一次。

9.()外部变量必须定义在文件的开头部分。

10.()函数的形参在退出该函数后是不可见的。

11.()字符“\0”是字符串的结束标记,其ASCII代码为0。

12.(若有说明:int a[3][4]={0};,则数组a中每个元素的初值都为0。

13.(若有说明:int a[ ][4]={0,0};,则二维数组a的第一维大小为0。

14.()若有说明:int a[2][4]={0,0};,则只有a[0][0]和a[0][1]的

初值为0,其余元素的初值均不为0。15.()若有说明:static int a[3][4];,则数组a中各元素可在程序的编译阶段得到初值0。

16.()若用数组名作为函数调用时的实参,则实际上传递给形参

的是数组的第一个元素值。

17.()调用strlen(“abc\0ef\0g”)的返回值为8。

18.()在两个字符串的比较中,字符个数多的字符串比字符少的字符串大。19.()当需要接受用户从键盘输入的含有空格的字符串时,应使用gets()函数。20.()在C语言中,二维数组元素在存中的存放顺序可以随意调整变化。

21.()&b指的是变量b的地址处所存放的值。

22.()指针变量可用于保存同类型变量的地址值。

23.()存放地址的变量同其它变量一样,可以存放任何类型的数据。

24.()指向同一数组的两指针p1、p2相减的结果与所指元素的下标相减的结果是相同的。

25.()如果定义函数时的参数是指针变量,那么,调用函数时的参数就可以是同类型的指针变量、数组名或简单变量的地址。

26.()char *name[5]定义了一个一维指针数组,它有5个元素,每个元素都是指向字符数据的指针型数据。

27.()语句y=*p++; 和y=(*p)++; 是等价的。

28.()函数指针所指向的是函数的入口地址。

29.()int *p;定义了一个指针变量p,其值是整型的。

30.()用指针作为函数参数时,采用的是“地址传送”方式。

31.()结构体的成员可以作为变量使用。

32.()在一个函数中,允许定义与结构体类型的成员相同名的变量,

计算机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语言编程练习题绝对经典!

马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人 解方程组 编写程序,采用穷举法求出结果。 编写程序,根据以下公式求e 的值。要求用两种方法计算: 1) for 循环,计算前50项 2)while 循环,直至最后一项的值小于10-4 从键盘中输入一个数字(不限位数),用循环语句编程判断并输出这个数字的位数。 猴子吃桃子问题。猴子第一天摘下若干个桃,当即只一半,又多吃一个。第二天早上又将剩下的一半吃掉一半,双多吃一个。以后每天早上都吃了前天剩下的一半零一个,到第10天早上 只剩下最后一个桃。问第一天摘了几个桃。 编程打印九九乘法表 青年歌手参加歌曲大奖赛,有10个评委打分,试编程求选手的平均得分(去掉一个最高分和一个最低分)。 从键盘中输入一个数字(可以包含小数点,其位数在60位以下,求其整数的有效位数,如输入,返回值为整数有效位数为3) 1) 输入数据为浮点型,不用数组,不用字符串,只有变量的算术运算实现此功能。 2) 使用数组来进行编程。 使用数组,编写一个十进制正整数转换为任意进制数的转换工具。 (大进制向小进制的转换。(方法是相除去余) 10进制327转八进制: 327/8 = 40 余数为7 40/8 = 5 余数为0 于是八进制数为507(第一位5是最后的商)) 使用数组,编写一个任意进制正整数转换为十进制的转换工具。(以2,10进制互转为例,其他请举一反三: 二进制数1101转十进制: 1×2的三次幂+1×2的二次幂+0×2的一次幂+1×2的零次幂=8+4+0+1=13) 10个小孩围成一圈分糖果,老师顺次分给每个人的糖块数为12,2,8,22,16,4,10,6,14,20。然后按下列规则调整,所有小孩同时把自己的糖果分一半给右边的小孩,糖块数变为 奇数的人,再向老师补要一块,问经过多少次调整后,大家的糖块一样多,且每人多少块。 11111111!2!3!4!5!!e n ≈++++++??????+

趣味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语言编写简单小游戏

纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on line》.它是e 时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式 .作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1,总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序: #incolude /*把输入输出函数的头文件包含进来*/ int main() { printf("Hello, world!");/*在屏幕上输出字符串"Hello,world!"*/ return 0;/*退出main函数,并返回0*/ } 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧! 1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c", 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2,心动的开始,一个运动中的笑脸大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构: struct move_point { int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/ }; 运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码: gotoxy(man.x, man.y);/*把光标移到指定的坐标*/ printf(" ");/*输出一个空格,把先前的字符擦去*/ 然后我们让物体按其速度运动: man.x += man.xv;/*水平方向按x轴的速度运动*/ man.y += man.yv;/*垂直方向按y轴的速度运动*/ 运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸: gotoxy(man.x, man.y); printf("%c\b", 2); /*输出ASCII码值为2的"笑脸"字符*/ 怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! 3,交互的实现——让我们来控制笑脸运动 这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句: while (bioskey(1) == 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ 然后用switch语句来判断按键以及执行相关操作,如下: switch (key) /*对变量key的值进行判断*/ { case UP: /*如果按的是向上键*/ … break; /*让物体向上运动,并退出switch*/

c语言趣味程序

c语言趣味程序 导读:就爱阅读网友为您分享以下“c语言趣味程序”的资讯,希望对您有所帮助,感谢您对https://www.wendangku.net/doc/6a18347260.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语言程序题

1.素数 [100,999]范围内同时满足以下两个条件的十进制数.⑴其个位数字与十位数字之和除以10所得的余数是百位数字;⑵该数是素数;求有多少个这样的数? [300,800]范围内同时满足以下两个条件的十进制数.⑴其个位数字与十位数字之和除以10所得的余数是百位数字;⑵该数是素数;求满足上述条件的最大的三位十进制数。

除1和它本身外,不能被其它整数整除的正整数称为素数(注:1不是素数,2是素数)。若两素数之差为2,则称两素数为双胞胎数,问[31,601]之间有多少对双胞胎数。 国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如:10=3+7,10=5+5,即10可以分解成两种不同的素数对。试求6744可以分解成多少种不同的素数对(注:A+B与B+A认为是相同素数对) 两个素数之差为2,则称这两个素数为双胞胎数。求出[200,1000]之间的最大一对双胞胎数的和。

一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。 德国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如:10=3+7,10=5+5,即10可以分解成两种不同的素数对。试求1234可以分解成多少种不同的素数对(注:A+B与B+A认为是相同素数对)

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语言课程设计

C语言程序设计

目录 1设计内容与设计要求 (1) 1.1系统的基本功能 (1) 1.2系统的设计要求 (1) 1.3系统维护 (1) 2 系统需求分析 (1) 2.1系统设计目标 (1) 2.2系统设计分析 (2) 3系统的实现 (2) 4 程序调试 (5) 5 总结 (6) 附件:源程序清单 (7)

1系统的功能框架设计 1.1系统的基本功能 首先让我介绍一下矩阵。在数学上,矩阵是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。进行C语言编程中,通过简单的程序设计便可实现矩阵的一系列操作,如矩阵的转置,矩阵对角线上的求和,矩阵左下角、右下角、左上角、右上角的输出,还有回旋矩阵的应用等等,具有很强的观赏性与可观性,并且对于初学者来说,是不可不注重的一种练习方式,而且还有一定的娱乐性。 1.2系统的设计要求 系统通过C语言课程编写须实现以下几个要求: (1)通过Visual C++软件实现对矩阵的一系列操作,如矩阵左下角、右下角、左上角、右上角的数据输出,输出9×9乘法口诀,显示出的矩阵形 式。 (2)实现回旋矩阵的显示形式。 (3)实现对称矩阵数组的显示形式。 1.3系统维护 该功能模块为用户提供维护、设置功能。在相应的设置模块中用户可以自行设置系统的数据,设置完成以后该设置立刻会在系统中生效,并在下一次的使用中反映出来。在这里,数据维护非常重要的,它的作用是将系统中用户选择的数据进行初始化,一旦操作完成,系统中原有的数据将会被全部删除,所以需慎重使用。 2 系统需求分析 2.1系统设计目标 (1)该系统设计主要针对于矩阵的定义、形式,应用C语言编程进行编辑,编译,链接,运行等步骤,实现矩阵各种形式的展现,达到趣味性和娱 乐性的目标。 (2)在应用简单的程序设计,既通过简单的程序运用得到所学知识的简单

C语言程序百例精解

C++语言程序百例精解 C/C++语言经典、实用、趣味程序设计编程百例精解(4) 31.歌德巴赫猜想 验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立)。 *问题分析与算法设计 为了验证歌德巴赫猜想对2000以内的正偶数都是成立的,要将整数分解为两部分,然后判断出分解出的两个整数是否均为素数。若是,则满足题意;否则重新进行分解和判断。 程序中对判断是否为素数的算法进行了改进,对整数判断“用从2开始到该整数的一半”改为“2开始到该整数的平方根”。原因何在请自行分析。 *程序说明与注释 #include<stdio.h> #include<math.h> int fflag(int n); int main() { int i,n; for(i=4;i<=2000;i+=2) { for(n=2;n<i;n++) /*将偶数i分解为两个整数*/ if(fflag(n)) /*分别判断两个整数是否均为素数*/ if(fflag(i-n)) { printf("%14d=%d+%d\n",i,n,i-n); /*若均是素数则输出*/ break; } if(n==i) printf("error %d\n",i); } } int fflag(int i) /*判断是否为素数*/

{ int j; if(i<=1)return 0; if(i==2)return 1; if(!(i%2))return 0; /*if no,return 0*/ for(j=3;j<=(int)(sqrt((double)i)+1);j+=2) if(!(i%j))return 0; return 1; /*if yes,return 1*/ } 32.可逆素数 求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。 *问题分析与算法设计 本题的重点不是判断素数的方法,而是求一个整数的反序数。求反序数的方法是从整数的末尾依次截取最后一位数字,每截取一次后整数缩小10倍,将截取的数字作为新的整数的最后一位(新的整数扩大10倍后加上被截取的数字)。这样原来的整数的数字从低到高被不断地截取,依次作为新的整数从高到低的各位数字。 *程序说明与注释 #include<stdio.h> #include<math.h> int num(int number); int ok(int number); int main() { int i,count; printf("There are invertable primes with 4 digits: \n"); for(count=0,i=1001;i<9999;i+=2) //穷举全部的奇数 { if(num(i)) //若是可逆素数,则输出 printf(count%9 ? "%3d:%d" : "%3d:%d\n",++count,i); } return 0; } int num(int number) { int i,j; if(!ok(number))return 0; //判断是否为素数

c语言趣味编程

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

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

相关文档