Linux C一站式学习习题答案
whorus1
让时间浪费的有意义
展开
-
Linux C一站式学习习题答案说明
本人为C初学者,使用的是Linux C一站式学习,打算把课后习题中自己写的代码都记下来,本打算在论坛里盖楼的,但是发现论坛太麻烦了,不能连续回复三次,看到max_min_ 同学的回复决定来博客记录吧,这里感谢下max_min_ 。原创 2014-01-27 15:20:03 · 788 阅读 · 0 评论 -
Linux C一站式学习习题答案11.5.2
2、在一组随机排列的数中找出第二小的,这个问题比上一个稍复杂,你能不能想出Θ(n)的算法?#include#define LEN 7int a[LEN] = {4, 2, 3, 7, 9, 1, 5};int min = 100;int i, p;int min_(){ for (i = 0; i < LEN; i++) { if (a[i] < min)原创 2014-03-10 18:21:15 · 677 阅读 · 1 评论 -
Linux C一站式学习习题答案11.6.2求平方根
2、编写一个函数double mysqrt(double y);求y的正平方根,参数y是正实数。我们用折半查找来找这个平方根,在从0到y之间必定有一个取值是y的平方根,如果我们查找的数x比y的平方根小,则x2x比y的平方根大,则x2>y,我们可以据此缩小查找范围,当我们查找的数足够准确时(比如满足|x2-y|y的平方根。思考一下这个算法需要迭代多少次?迭代次数的多少由什么因素决定?#inclu原创 2014-03-13 16:57:30 · 814 阅读 · 0 评论 -
Linux C一站式学习习题答案5.1.1
#include /*enter a year,then judge it's leap year or not2014-01-16 hourui*/int is_leap_year(int year){if (year%4 == 0) { if (year%100==0) { if (year%400==0) printf("%d is leap year\原创 2014-01-27 15:38:02 · 821 阅读 · 0 评论 -
Linux C一站式学习习题答案6.1.2统计个数
2、编写程序数一下1到100的所有整数中出现多少次数字9。在写程序之前先把这些问题考虑清楚:这个问题中的循环变量是什么?这个问题中的累加器是什么?用加法还是用乘法累积?在第 2 节 “if/else语句”的习题1写过取一个整数的个位和十位的表达式,这两个表达式怎样用到程序中?#include/*统计一串数字中间(从min到max)一个数值(n,n为个位数)出现的原创 2014-01-27 15:56:19 · 588 阅读 · 0 评论 -
Linux C一站式学习习题答案4.1
includevoid main(void){int i=-1;if (i > 0) { printf("i is positive.\n"); }printf("i is not positive.\n");}原创 2014-01-27 15:32:13 · 617 阅读 · 0 评论 -
Linux C一站式学习习题答案4.2.2
*说明4.2.2表示第四章第2节第2题2、写一个函数,参数是整型变量x,功能是打印x的个位和十位。#include void main (){int x,y;int i = 125;x = i%10;y = i/10%10;printf("%d,%d\n",x,y);}原创 2014-01-27 15:34:49 · 516 阅读 · 0 评论 -
Linux C一站式学习习题答案6.1.1.2
用循环解决2、编写递归函数求Fibonacci数列的第n项,这个数列是这样定义的:fib(0)=1fib(1)=1fib(n)=fib(n-1)+fib(n-2)/*使用循环求fibonacci数列*/#includeint main(){ int a=1; int b=1; int c,n; printf ( "please enter N:" )原创 2014-01-27 15:51:34 · 634 阅读 · 0 评论 -
Linux C一站式学习习题答案8.3.1直方图
1、补完本节直方图程序的main函数,以可视化的形式打印直方图。例如上一节统计20个随机数的结果是:0 1 2 3 4 5 6 7 8 9* * * * * * * ** * * * * * * * * * * *原创 2014-03-05 21:22:30 · 1199 阅读 · 0 评论 -
Linux C一站式学习习题答案16.1.3位运算 掩码
1、统计一个无符号整数的二进制表示中1的个数,函数原型是int countbit(unsigned int x);#includeint countbit(unsigned int x){ int i = 0; int count = 0; int mask = 0x00000001; for (i = 0; i < 32; i++) { if ( 1 == (x >> i原创 2014-03-18 16:49:06 · 752 阅读 · 0 评论 -
Linux C一站式学习习题答案5.1.2 四舍五入
编写一个函数double myround(double x),输入一个小数,将它四舍五入。例如myround(-3.51)的值是-4.0,myround(4.49)的值是4.0。可以调用math.h中的库函数ceil和floor实现这个函数。#include#include/*四舍五入*/int main(){double a;printf("please enter a numb原创 2014-01-27 15:45:35 · 1164 阅读 · 0 评论 -
Linux C一站式学习习题答案11.5.1
1、实现一个算法,在一组随机排列的数中找出最小的一个。你能想到的最直观的算法一定是Θ(n)的,想想有没有比Θ(n)更快的算法? 1 #include 2 #define LEN 7 3 4 int a[LEN] = {4, 2, 3, 7, 9, 1, 5}; 5 6 int main() 7 { 8 int min = a[0];原创 2014-03-10 18:18:47 · 591 阅读 · 0 评论 -
Linux C一站式学习习题答案19.4
1、编写一个程序,测试运行它的平台是大端还是小端字节序。#include union test_type { int i; char a[4];};int main(void){ union test_type test = {0x44332211}; printf("hex dump of u: %x %x %x %x\n", test.a[0], t原创 2014-03-25 16:45:56 · 597 阅读 · 0 评论 -
Linux C一站式学习习题答案 剪刀石头布
#include #include #include char arr[3][10] = { "scissor", "stone", "cloth"};int man, comp, result;int man_w = 0;int com_w = 0;int get_man(){ printf("Please chose your gesture: 0-scissor,1-s原创 2014-03-10 15:13:28 · 1481 阅读 · 0 评论 -
Linux C一站式学习习题答案6.1.1.1
用循环解决1、编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:如果a除以b能整除,则最大公约数是b。否则,最大公约数等于b和a%b的最大公约数。Euclid算法是很容易证明的,请读者自己证明一下为什么这么算就能算出最大公约数。最后,修改你的程序使之适用于所有整数,而不仅仅是正整数原创 2014-01-27 15:50:22 · 614 阅读 · 0 评论 -
Linux C一站式学习习题答案12.3.3迷宫问题深度优先
现在我们用堆栈解决一个有意思的问题,定义一个二维数组:int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。3、上一节原创 2014-03-17 16:07:07 · 891 阅读 · 0 评论 -
Linux C一站式学习习题答案2.5
*说明2.5表示第二章第5节。1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。#includeint main(){ int a,b,floor,ceiling; printf ("please ente原创 2014-01-27 15:27:42 · 726 阅读 · 0 评论 -
Linux C一站式学习习题答案6.5.2打印菱形
编写函数diamond打印一个菱形。如果调用diamond(3, '*')则打印: ** * * *如果调用diamond(5, '+')则打印: + + + ++ + + + + + + + +如果用偶数做参数则打印错误提示。 1 #include 2 /*打印菱形*/ 3 4 5 /*根据输入的参数打印相应的菱形*/ 6 v原创 2014-02-19 16:57:09 · 860 阅读 · 0 评论 -
Linux C一站式学习习题答案7.2.2分数加减乘除
2、实现一个用分子分母的格式来表示有理数的结构体rational以及相关的函数,rational结构体之间可以做加减乘除运算,运算的结果仍然是rational。测试代码如下:int main(void){ struct rational a = make_rational(1, 8); /* a=1/8 */ struct rational b = make_rational(-1, 8原创 2014-02-25 21:13:26 · 766 阅读 · 0 评论 -
Linux C一站式学习习题答案6.4求素数
求素数这个程序只是为了说明break和continue的用法才这么写的,其实完全可以不用break和continue,请读者修改一下控制流程,去掉break和continue而保持功能不变。分别使用while和for写了两种,代码如下:while: #include 2 /*求0到100内的素数*/ 3 4 /*判断一个数是不是素数*/ 5 int is_prim原创 2014-02-19 14:15:39 · 1044 阅读 · 0 评论 -
Linux C一站式学习习题答案6.5.1小九九乘法表
1、上面打印的小九九有一半数据是重复的,因为8*9和9*8的结果一样。请修改程序打印这样的小九九:1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81原创 2014-02-19 16:36:04 · 701 阅读 · 0 评论 -
Linux C一站式学习习题答案8.2随机数
1、用rand函数生成[10, 20]之间的随机整数,表达式应该怎么写?/* 生成【min,max】之间num个随机数; bound=max-min+1为取值范围;*/#include #include #define N 20#define min 10#define max 20int a[N];int i;int gen_random(原创 2014-03-05 13:39:47 · 694 阅读 · 0 评论 -
Linux C一站式学习习题答案11.6.3 求n次方
3、编写一个函数double mypow(double x, int n);求x的n次方,参数n是正整数。最简单的算法是:double product = 1;for (i = 0; i < n; i++) product *= x;这个算法的时间复杂度是Θ(n)。其实有更好的办法,比如mypow(x, 8),第一次循环算出x·x=x2,第二次循环算出x2·x2=x4,第三次循环算出4原创 2014-03-14 10:52:45 · 1200 阅读 · 2 评论 -
Linux C一站式学习习题答案5.3.1最大公约数
1、编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:如果a除以b能整除,则最大公约数是b。否则,最大公约数等于b和a%b的最大公约数。Euclid算法是很容易证明的,请读者自己证明一下为什么这么算就能算出最大公约数。最后,修改你的程序使之适用于所有整数,而不仅仅是正整数。#include原创 2014-01-27 15:47:19 · 700 阅读 · 0 评论 -
Linux C一站式学习习题答案5.3.2Fibonacci数列
2、编写递归函数求Fibonacci数列的第n项,这个数列是这样定义的:fib(0)=1fib(1)=1fib(n)/*****************************************FUN:f(n)=f(n-1)+f(n-2)author:houruidata:2014.01.20**************************************原创 2014-01-27 15:48:23 · 645 阅读 · 0 评论 -
Linux C一站式学习习题答案7.2.1复数
1、在本节的基础上实现一个打印复数的函数,打印的格式是x+yi,如果实部或虚部为0则省略,例如:1.0、-2.0i、-1.0+2.0i、1.0-2.0i。最后编写一个main函数测试本节的所有代码。想一想这个打印函数应该属于上图中的哪一层?a.打印函数#includeint structa ( double x,double y ){ if ( y==0 ) print原创 2014-02-25 21:12:03 · 1390 阅读 · 0 评论 -
Linux C一站式学习习题答案8.1.1
1、编写一个程序,定义两个类型和长度都相同的数组,将其中一个数组的所有元素拷贝给另一个。既然数组不能直接赋值,想想应该怎么实现#include int main (){ int count1[4] = { 1, 2, 3, },count2[4], i; for ( i=0; i<4 ;i++ ) { count2[ i ] = count1 [ i ]; printf("c原创 2014-02-27 00:03:51 · 788 阅读 · 0 评论 -
Linux C一站式学习习题答案11.6.1binarysearch
1、本节的折半查找算法有一个特点:如果待查找的元素在数组中有多个则返回其中任意一个,以本节定义的数组int a[8] = { 1, 2, 2, 2, 5, 6, 8, 9 };为例,如果调用binarysearch(2)则返回3,即a[3],而有些场合下要求这样的查找返回a[1],也就是说,如果待查找的元素在数组中有多个则返回第一个。请修改折半查找算法实现这一特性。#include#defi原创 2014-03-13 14:31:50 · 521 阅读 · 0 评论 -
Linux C一站式学习习题答案11.5.3 k-th Order Statistic
3、进一步泛化,在一组随机排列的数中找出第k小的,这个元素称为k-th Order Statistic。能想到的最直观的算法肯定是先把这些数排序然后取第k个,时间复杂度和排序算法相同,可以是Θ(nlgn)。这个问题虽然比前两个问题复杂,但它也有平均情况下时间复杂度是Θ(n)的算法,将上一节习题1的快速排序算法稍加修改就可以解决这个问题:/* 第k小的元素在start和end之间,找出并返回该元原创 2014-03-12 10:00:56 · 915 阅读 · 0 评论