明解C语言(基础篇)—第七章

练习7-1

#include <stdio.h>

int main(void)
{
	int n;

	printf("sizeof 1             =%u\n", sizeof 1);					//1是int型,该类型的长度是4
	printf("sizeof +1            =%u\n", sizeof + 1);				//+1是int型,该类型的长度是4
	printf("sizeof -1            =%u\n", sizeof - 1);				//-1是int型,该类型的长度是4

	printf("sizeof(unsigned)-1   =%u\n", sizeof(unsigned) - 1);		//ubsigned型的长度是4,减去1变成3
	printf("sizeof(double)-1     =%u\n", sizeof(double) - 1);		//double类型的长度是8,减去1变成7
	printf("sizeof((double)-1)   =%u\n", sizeof((double)-1));		//((double)-1)仍然是double类型,长度为8

	printf("sizeof n+2           =%u\n", sizeof n + 2);				//n为整型,长度为4,加2变成6
	printf("sizeof (n+2)         =%u\n", sizeof(n + 2));			//(n+2)仍为int型,长度为4
	printf("sizeof (n+2.0        =%u\n", sizeof(n + 2.0));			//(n+2.0)为double型,长度为8

	return 0;
}

 

练习7-2

#include <stdio.h>
#include <math.h>


int main(void)
{
	unsigned x;
	int n;

	printf("请输入无符号整数:");		scanf_s("%u", &x);
	printf("请输入位移的位数:");		scanf_s("%d", &n);

	printf("向左位移后是否溢出?\n");
	((x << n) == (x * pow(2, n))) ? printf("相等") : printf("不等");

	putchar('\n');

	printf("向右位移后是否溢出?\n");
	((x >> n) == (x / pow(2, n))) ? printf("相等") : printf("不等");

	return 0;
}

 

练习7-3

#include <stdio.h>

unsigned rrotate(unsigned x, int n)
{
	return x >> n;

}

unsigned lrotate(unsigned x, int  n)
{
	return x << n;
}

int main(void)
{
	unsigned x;
	int n;

	printf("请输入无符号整数:");			scanf_s("%u", &x);
	printf("请输入移动位数:");				scanf_s("%d", &n);

	printf("无符号数%u左移%d位变成%u\n", x, n, lrotate(x, n));
	printf("无符号数%u右移%d位变成%u\n", x, n, rrotate(x, n));

	return 0;
}

 

练习7-4

#include <stdio.h>


//二进制最低位为0位,最高位为(2^n-1)位


/*---将无符号型整数x的第pos位设置为1---*/
unsigned set(unsigned x, int pos)
{
	int i=1;
	return x | (i << pos);
}


/*---将无符号型整数x的第n位设置为0---*/
unsigned reset(unsigned x, int pos)
{
	int i = 1;
	return x & ~(i << pos);
}


/*---将无符号型整数x第pos位取反---*/
unsigned inverse(unsigned x, int pos)
{
	int i = 1;
	return x ^ (i << pos);
}


int main(void)
{
	unsigned x;
	int n;

	printf("请输入无符号整数x:");			scanf_s("%u", &x);
	printf("请输入操作位数:");				scanf_s("%d", &n);

	printf("无符号整数%u第%d位设为1,变成%u\n", x, n, set(x, n));
	printf("无符号整数%u第%d位设为0,变成%u\n", x, n, reset(x, n));
	printf("无符号整数%u第%d位设为取反,变成%u\n", x, n, inverse(x, n));

	return 0;

}

 

练习7-5

#include <stdio.h>

//二进制低位为第0位,高位为第(2^n-1)位


/*---将无符号型整数第pos位到第(pos+n-1)位的n位设为1---*/
unsigned set_n(unsigned x, int pos,int n)
{
	int i;
    int j=0;
	for (i = 0; i < n; i++) {   //从第0位到第(n-1)位均为1
		j <<= 1;
		j | 1;
	}
	j <<= pos;					//将j左移pos位,此时第pos位到第(pos+n-1)位均为1
	return j | x;				//采用逻辑或,将无符号型整数第pos位到第(pos+n-1)位的n位设为1
}


/*---将无符号型整数第pos位到第(pos+n-1)位的n位设为0---*/
unsigned reset_n(unsigned x, int pos, int n)
{
	int i;
    int j=0;
	for (i = 0; i < n; i++) {	//从第0位到第(n-1)位均为1
		j <<= 1;
		j | 1;
	}
	j << pos;					//将j左移pos位,此时第pos位和第(pos+n-1)位均为1
	return x & (~j);			//先将j按位取反,再与x按位采用逻辑与,将无符号型整数第pos位到第(pos+n-1)位的n位设为0
}


/*---将无符号型整数第pos位到第(pos+n-1)位的n位按位取反---*/
unsigned inverse_n(unsigned x, int pos, int n)
{
	int i;
    int j=0;
	for (i = 0; i < n; i++) {
		j <<= 1;
		j | 1;
	}
	j << pos;
	return x ^ j;				//按位异或,无符号型整数x第pos位和第(pos+n-1)位取反
}


 

练习7-6

#include <stdio.h>
#include <limits.h>

int main(void)
{
	unsigned x, y;
	x = UINT_MAX;
	y = 0;

	printf("x=%u\n", x);
	printf("x+1=%u\n", x + 1);

	printf("y=%u\n", y);
	printf("y-1=%u\n", y - 1);

	return 0;
}

 

练习7-7

#include <stdio.h>

int main(void)
{
	float a;
	double b;
	long double c;

	printf("a=");			scanf_s("%f", &a);
	printf("b=");			scanf_s("%lf", &b);
	printf("c=");			scanf_s("%lf", &c);

	printf("a=%f\n", a);
	printf("b=%f\n", b);
	printf("c=%lf\n", c);

	return 0;
}

 

练习7-8

#include <stdio.h>

int main(void)
{
	printf("sizeof(float)      =%u\n", (unsigned)sizeof(float));
	printf("sizeof(double)     =%u\n", (unsigned)sizeof(double));
	printf("sizeof(long double)=%u\n", (unsigned)sizeof(long double));

	return 0;
}

 

练习7-9

#include <stdio.h>
#include <math.h>

int main(void)
{
	double x;

	printf("请输入正方形面积x=");			scanf_s("%lf", &x);

	printf("正方形的面积为%f\n", sqrt(x));
	return 0;
}

 

练习7-10:本体借鉴—野猪力量的答案,链接如下:https://blog.csdn.net/wofreeo/article/details/80667265?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162156775216780255288364%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162156775216780255288364&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-80667265.pc_search_result_no_baidu_js&utm_term=%E6%98%8E%E8%A7%A3c%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%E7%AF%87%E7%AC%AC%E4%B8%83%E7%AB%A0

#include <stdio.h>
int main(void)
{
    float x1 = -0.01;
    float x2 = 0;
    int i;
    for (i = 0;i<=100;i++)
    {
		printf("x = %f    x = %f\n", x1 += 0.01, (x2++) / 100);
    }
    return 0;
}

 

练习7-11

代码清单7-11改写

#include <stdio.h>
int main(void)
{
	float x, y = 0.0;
	for (x = 0.0; x <= 1.0; x += 0.01) {
		printf("x=%f  ", x);
		y += x;
		printf("x的累计和=%f\n",y);
	}
	return 0;

}

 

代码清单7-12改写

#include <stdio.h>
int main(void)
{
	int i;
	float x, y=0;

	for (i = 0; i <= 100; i++) {
		printf("x=%f   ", i / 100.0);
		printf("x的累计和=%f\n", y += i/100.0);
	}
	return 0;
}

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值