首页
社区
课程
招聘
[分享]C语言学习《The C Programming Language》第二、三章习题同步
发表于: 2014-5-13 15:11 3237

[分享]C语言学习《The C Programming Language》第二、三章习题同步

2014-5-13 15:11
3237
C语言学习《The C Programming Language》这里的习题答案跟原答案基本上完全不一样,可以做参考 不对的地方,烦请指正

练习2-1
打印 有符号 无符号范围
/*
C语言学习 变量
2014年5月13日14时46分50秒
初识limits.h
打开limits.h 找到对应的类型的宏定义 并打印出来
*/
#include <stdio.h>
#include <limits.h>
#include <Windows.h>

int main(void)
{
	printf("signed char  min = %d\t\t signed char   max = %d\n", SCHAR_MIN, SCHAR_MAX);
	printf("signed short min = %d\t signed short  max = %d\n", SHRT_MIN, SHRT_MAX);
	printf("signed int   min = %d\t signed int    max = %d\n", INT_MIN, INT_MAX);
	printf("signed long  min = %ld\t signed long   max = %ld\n\n", LONG_MIN, LONG_MAX);
	printf("unsigned char  max = %u\n", UCHAR_MAX);
	printf("unsigned short max = %u\n", USHRT_MAX);
	printf("unsigned int   max = %u\n", UINT_MAX);
	printf("unsigned long  max = %lu\n", ULONG_MAX);

	system("pause");
	return 0;
}


习题2-2
不用&& || 更改for语句
/*
C语言学习 运算符
2014年5月13日15时36分57秒
for(i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
	s[i] = c;
*/
#include <stdio.h>
#include <Windows.h>

#define MAXLINE 8
enum loop {YES, NO};

enum loop okloop = YES;

int getline(char s[], int lim);

int main(void)
{
	int c;
	char s[MAXLINE];

	if((c =	getline(s, MAXLINE)) >0)
	{
		printf("%s\n", s);
	}

	system("pause");
	return 0;
}

int getline(char s[], int lim)
{
	int c, i = 0;

	while(okloop == YES)
	{
		if(i >= lim-2)
		{
			okloop = NO;
			s[i] = '\0';
		}
		else if((c = getchar()) == '\n')
		{
			okloop = NO;
			s[i] = '\0';
		}
		else if(c == EOF)
		{
			okloop = NO;
			s[i] = '\0';
		}
		else
		{
			s[i] = c;
			++i;
		}
	}
	return i-1;
}


习题2-3
十六进制转十进制
/*
C语言学习 运算符
2014年5月13日16时47分21秒
*/
#include <stdio.h>
#include <Windows.h>

enum BOOL {NO, YES};

enum BOOL ifbool = YES;

int htoi(char s[]);

int main(void)
{
	char s[100];
	int n;

	printf("请输入一个十六进制数以0x或者0X开头: ");
	scanf("%s", &s);

	n = htoi(s);
	printf("%d\n", n);

	system("pause");
	return 0;
}

int htoi(char s[])
{
	int i, c, n;
	i = c = n = 0;
	
	for(i = 2; ifbool == YES; ++i)
	{
		if(s[i] >= '0' && s[i] <= '9')
		{
			c = s[i] - '0';
		}
		else if(s[i] >= 'a' && s[i] <= 'f')
		{
			c = s[i] - 'a' + 10;
		}
		else if(s[i] >= 'A' && s[i] <= 'F')
		{
			c = s[i] - 'A' + 10;
		}
		else
		{
			ifbool = NO;
		}

		if(ifbool == YES)
		{
			n = n * 16 + c;
		}
	}
	return n;
}


习题2-4
将第一个字符串中与第二个字符串任意匹配的字符删除
/*
C语言学习 字符串
2014年5月13日21时44分46秒

输出结果为:s1 = He,
*/
#include <stdio.h>
#include <Windows.h>

void squeeze(char s1[], char s2[]);

int main(void)
{
	char s1[] = "Hello,";
	char s2[] = "World!";

	squeeze(s1, s2);
	printf("s1 = %s\n", s1);

	system("pause");
	return 0;
}

void squeeze(char s1[], char s2[])
{
	int i, j, k;

	i = j = k = 0;
	for(i = 0; s1[i] != '\0'; i++)
	{
		for(j = 0; s2[j] != '\0' && s2[j] != s1[i]; j++)
		{
			;
		}

		if(s2[j] == '\0')
		{
			s1[k] = s1[i];
			k++;				//s1[k++] = s1[i];
		}
	}
	s1[k] = '\0';
}


习题2-5
返回第二个字符串中的任一字符在第一个字符串中第一次出现的位置
/*
C语言学习 字符串
2014年5月13日22时17分09秒
W = -1
o = 4
r = -1
l = 2
d = -1
! = -1
请按任意键继续. . .
*/

#include <stdio.h>
#include <Windows.h>

int any(char s[], char c);

int main(void)
{
	char s1[] = "Hello,";
	char s2[] = "World!";
	int i, n;

	for(i = 0; s2[i] != '\0'; i++)
	{
		n = any(s1, s2[i]);
		printf("%c = %d\n", s2[i], n);
	}

	system("pause");
	return 0;
}

int any(char s[], char c)
{
	int i;

	for(i = 0; s[i] != '\0' && s[i] != c; i++)
		;
	
	if(s[i] == '\0')
		return -1;
	else
		return i;
}


习题2-6
编写setbits函数
/*
C语言学习 位运算符
2014年5月15日12时33分45秒
将x的p位开始的n位清0	~(~(~0(所有位为1)<< n(前边全是1后边n个0))(前边全是0后边n个1)<<(p+1-n)(前边是0在p位开始n个1后边p+1-n个0))(再次取反后p位开始n个0其它全为1了)
x对这个数取与就达到效果了x & 上边得出来的数
将y的最后n位移动p+1-n处	~(~0<<n)(后n位为1)y & 前数 (y的n位之前全为0) << (p+1-n)(将y后8位左移到p处)

两个新数取或(x & ~(~(~0 << n) << (p+1-n))) | ((y & ~(~0 << n)) << (p+1-n))
*/
#include <stdio.h>
#include <Windows.h>

int setbits(int x, int p, int n, int y);

int main(void)
{
	int x, y, p, n, newx;
	x = 255;
	y = 30;
	p = 7;
	n= 3;

	newx = setbits(x, p, n, y);
	printf("%d\n", newx);

	system("pause");
	return 0;
}

int setbits(int x, int p, int n, int y)
{
	return (x & ~(~(~0 << n) << (p+1-n))) | ((y & ~(~0 << n)) << (p+1-n));
}


习题2-7
编写invort()函数
/*
C语言学习 位运算符
2014年5月15日14时18分37秒

将x取反
将~x的p位开始的n个位取出来:
	~(~0 << n) << (p+1-n)	得到p位开始n个1其它全是0 ~x & 前数 
将x的p位开始的n个位清零:
	~(~(~0 << n) << (p+1-n))得到p位开始n个0其它全是1 x & 前数
最后两个数相或
*/
#include <stdio.h>
#include <Windows.h>

int invert(int x, int p, int n);

int main(void)
{
	int x, p, n, newx;

	x = 255;
	p = 7;
	n = 3;
	newx = invert(x,p,n);
	printf("%d\n", newx);

	system("pause");
	return 0;
}

int invert(int x, int p, int n)
{
	return ((~x) & (~(~0 << n) << (p+1-n))) | (x & ~(~(~0 << n) << (p+1-n)));
}


习题2-8
编写rightrot()函数
/*
C语言学习 位运算符
2014年5月15日15时55分18秒

getwordlength() 获取字长:
	~0将所有位取反一定是负数 一直左移 移完字长 就是0 通过判断小于0 获取字长;
*/
#include <stdio.h>
#include <Windows.h>

int getwordlength(void);
int rightrot(int x, int n);

int main(void)
{
	int x, n;

	x = 0XFF;
	n = 50;
	printf("%#X\n",  rightrot(x, n));

	system("pause");
	return 0;
}

int rightrot(int x, int n)
{
	int i = getwordlength();

	if(n % i == 0)
		return x;
	else
	{
		return x << (i - (n % i)) | (x >> n);
	}
}

int getwordlength(void)
{
	int i, w;

	w = ~0;
	i = 0;
	while(w < 0)
	{
		i++;
		w <<= 1;
	}
	return i;
}


习题2-9
翻译出来的东西 连题也看不懂 还得找原版的 查字典自己想
/*
C语言学习 赋值运算符
2014年5月15日16时55分16秒
*/
#include <stdio.h>
#include <Windows.h>

int bitcount(unsigned x);

int main(void)
{
	int x;
	x = 100;

	printf("%d\n", bitcount(x));

	system("pause");
	return 0;
}

int bitcount(unsigned x)
{
	int i;

	for(i = 0; x != 0; x &= (x -1))
		i++;
	return i;
}


习题2-10
大写字母转小写
/*
C语言学习 条件表达式
2014年5月15日21时57分35秒
*/
#include <stdio.h>
#include <Windows.h>
int main(void)
{
	char c;

	c = getchar();
	printf("%c\t%c\n", c, c >='A' && c <= 'Z'? c+32: c);

	system("pause");
	return 0;
}


习题3-1
折半查找
/*
C语言学习 控制流
2014年5月15日22时26分18秒
*/
#include <stdio.h>
#include <Windows.h>

int binsearch(char x, char s[], int n);

int main(void)
{
	char x;
	char v[] = {'a', 'b', 'c', 'd', 'e', 'f'};
	int n = sizeof(v);
	x = 'i';
	printf("%d\n", binsearch(x, v, n));


	system("pause");
	return 0;
}

int binsearch(char x, char s[], int n)
{
	int low, high, mid;

	low = 0;
	high = n-1;
	mid = (low + high) / 2;
	while(low <= high && s[mid] != x)
	{
		if(x < s[mid])
			high = mid -1;
		else
			low = mid +1;
		mid = (low + high) / 2;
	}
	if(x == s[mid])
		return mid;
	else
		return -1;
}


习题3-2
将字符串中的制表符换行符换成\t\n输出
/*
C语言学习 switch语句
2014年5月16日15时27分24秒
*/
#include <stdio.h>
#include <Windows.h>

#define STRLENGTH 100
void escape(char s[], char t[]);
void oppcape(char s[], char t[]);

int main(void)
{	
	char s[STRLENGTH] = "wo  meng	heng\nhao";
	char  p[STRLENGTH], newp[STRLENGTH]; 
	escape(s, p);
	printf("%s\t%s\n", s, p);
	oppcape(p, newp);
	printf("%s\n", newp);

	system("pause");
	return 0;
}

void escape(char s[], char t[])
{
	int i, j;

	j = 0;
	for(i = 0; s[i] != '\0'; i++)
	{
		switch(s[i])
		{
		case '\t':
			t[j++] = '\\';
			t[j++] = 't';
			break;
		case '\n':
			t[j++] = '\\';
			t[j++] = 'n';
			break;
		default:
			t[j++] = s[i];
			break;
		}		
	}
	t[j] = '\0';
}

void oppcape(char s[], char t[])
{
	int i, j;
	
	for(i = j = 0; s[i] != '\0'; i++)
	{
		switch(s[i])
		{
		case 'n':
			if(s[i-1] == '\\')
				t[j-1] = '\n';
			else
				t[j++] = s[i];
			break;
		case 't':
			if(s[i-1] == '\\')
				t[j-1] = '\t';
			else
				t[j++] = s[i];
			break;
		default:
			t[j++] = s[i];
			break;
		}
		t[j] = '\0';
	}
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//