C Primer Plus 第6版 编程练习 chapter 15

news2025/1/16 5:35:31

文章目录

  • 1. 第1题
    • 1.1 题目描述
    • 1.2 编程源码
    • 1.3 结果显示
  • 2. 第2题
    • 2.1 题目描述
    • 2.2 编程源码
    • 2.3 结果显示
  • 3. 第3题
    • 3.1 题目描述
    • 3.2 编程源码
    • 3.3 结果显示
  • 4. 第4题
    • 4.1 题目描述
    • 4.2 编程源码
    • 4.3 结果显示
  • 5. 第5题
    • 5.1 题目描述
    • 5.2 编程源码
    • 5.3 结果显示
  • 6. 第6题
    • 6.1 题目描述
    • 6.2 编程源码
    • 6.3 结果显示
  • 7. 第7题
    • 7.1 题目描述
    • 7.2 编程源码
    • 7.3 结果显示

1. 第1题

1.1 题目描述

编写一个函数,把二进制字符串转换为一个数值,例如,有下面的语句:

char *pbin="01001001";

那么把pbin作为参数传递给该函数后,它应该返回一个int类型的值73

1.2 编程源码

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

int str2bin(const char *s,int len){
	int sum=0;
	int base = 1;
	for(int i=len-1;i>=0;--i){
		sum += base * (s[i]-'0');
		base*=2;		
	}
	return sum;
}

int main(void){
	printf("%d\n", str2bin("01001001",8));
	
	return 0;	
}

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

编写一个程序,通过命令行参数读取两个二进制字符串,对这两个二进制数使用~运算符、&运算符、|运算符和^运算符,并以二进制字符串形式打印结果(如果无法使用命令行环境,可以通过交互式让程序读取字符串)。

2.2 编程源码

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

unsigned int str2bin(const char *s,int len){
	int sum=0;
	int base = 1;
	for(int i=len-1;i>=0;--i){
		sum += base * (s[i]-'0');
		base*=2;		
	}
	return sum;
}

void dec2bin(char *s,unsigned int n){
	int len=0;
	char c;
	if(n==0)s[len++] = '0';
	while(n){
		s[len++] = (n&1)+'0';
		n >>=1;
	}
	s[len] = '\0';
	for(int i=0,j=len-1;i<j;++i,--j){
		c=s[i];
		s[i]=s[j];
		s[j]=c;
	}
}

int main(int argc, char** argv){
	char s[10];
	
	
	dec2bin(s, str2bin(argv[1],8)&str2bin(argv[2],8));
	printf("%s & %s = %s\n", argv[1],argv[2],s);
	
	dec2bin(s, str2bin(argv[1],8)|str2bin(argv[2],8));
	printf("%s | %s = %s\n", argv[1],argv[2],s);
	
	dec2bin(s, str2bin(argv[1],8)^str2bin(argv[2],8));
	printf("%s ^ %s = %s\n", argv[1],argv[2],s);
	
	dec2bin(s, ~str2bin(argv[1],8));
	printf("~%s = %s\n", argv[1],s);
	
	return 0;	
}

2.3 结果显示

结果显示


3. 第3题

3.1 题目描述

编写一个函数,接受一个int类型,并返回该参数中打开位的数据量,在一个程序中测试该函数。

3.2 编程源码

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

unsigned int open_bit(int num){
	int sum=0;
	int base = 1;
	while(num){
		sum+= num&1;
		num>>=1;
	}
	return sum;
}

int main(int argc, char** argv){
	
	printf("%d 打开位数 %u\n", 64, open_bit(64));
	return 0;	
}

3.3 结果显示

结果显示


4. 第4题

4.1 题目描述

编写一个程序,接受两个int类型的参数:一个是值,一个是位的位置。如果指定2位的位置为1,该函数返回1,否则返回0。在一个程序中测试该函数。

4.2 编程源码

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

unsigned int open_bit(int num,int loc){
	return (num&(1<<(loc-1)))>0?1:0;
}

int main(int argc, char** argv){
	
	printf("%d 位置为 %u\n", 64, open_bit(15, 6));
	return 0;	
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

编写一个函数,把一个unsigned int 类型值中的所有位向左旋转指定数据的位,例如,rotate_1(x,4),把x中所有位向左移动4个位置,而且从最左端移出的位会重新出现在右端,也就说,把高阶位移出的位让如低阶位。在一个程序中测试该函数。

5.2 编程源码

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

unsigned int open_bit(int num,int loc){
	return (num<<loc)|(num>>(32-loc));
}

int main(int argc, char** argv){
	
	printf("%d 位置为 %u\n", 11, open_bit(11, 4));
	return 0;	
}

5.3 结果显示

结果显示


6. 第6题

6.1 题目描述

设计一个位字段结构以存储下面的信息。
字体ID:0~255之间的一个数;
字体大小:0~127之间的一个数;
对齐:0~2之间的一个数,表示左对齐,居中,右对齐
加粗:开1闭0
斜体:开1闭0
下划线:开1闭0
在一个程序中使用结构来打印字体参数,并使用循环菜单来让用户改变参数,例如,该程序的一个运行示例如下。

ID SIZE ALIGENMENT B I U
1 12 left off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline 
q)quit
s
Enter font size (0~127):36
ID SIZE ALIGENMENT B I U
1 36 left off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline 
q)quit
a
select alignment:
l)left c)center r)right
ID SIZE ALIGENMENT B I U
1 36 right off off off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline 
q)quit
i
ID SIZE ALIGENMENT B I U
1 36 right off on off
f) change font s)change size a)chang alignment
b) toggle bold i)toggle italic u)toggle underline 
q)quit
q
Bye

6.2 编程源码

#include<stdio.h>
#include<stdlib.h>

struct font{
	unsigned int id:8;
	unsigned int size:7;
	unsigned int align:2;
	unsigned int b:1;
	unsigned int i:1;
	unsigned int u:1;
};

void display(const struct font *f){
	char *key[2]={"off", "on"};
	char *ali[3] = {"left","center","right"};
	
	printf("ID\tSIZE\tALIGENMENT\tB\tI\tU\n");
	printf("%d\t%d\t%s\t\t%s\t%s\t%s\n",f->id,f->size,ali[f->align],key[f->b],key[f->i],key[f->u]);
	
	printf("f) change font\t s)change size\t a)chang alignment\n");
	printf("b) toggle bold \ti)toggle italic \tu)toggle underline \n");
	printf("q)quit\n");
}
void change_font(struct font *f){
	int num;
	printf("Enter font id (0~255):");
	scanf("%d", &num);
	f->id=num;
	while(getchar()!='\n');
}
void change_size(struct font *f){
	int num;
	printf("Enter font size (0~255):");
	scanf("%d", &num);
	f->size=num;
	while(getchar()!='\n');
}

void change_ali(struct font *f){
	printf("select alignment:\n");
	printf("l)left \tc)center \tr)right\n");
	char c=getchar();
	switch(c){
		case 'l':f->align = 0;break;
		case 'c':f->align = 1;break;
		case 'r':f->align = 2;break;
		default:f->align = 0;break;
	}
	while(getchar()!='\n');
}

int main(int argc, char** argv){
	struct font f={0};
	char c;
	display(&f);
	while((c=getchar())!='\n'){
		while(getchar()!='\n');
		switch(c){
			case 'f':change_font(&f);break;
			case 's':change_size(&f);break;
			case 'a':change_ali(&f);break;
			case 'b':f.b=1;break;
			case 'i':f.i=1;break;
			case 'u':f.u=1;;break;
			case 'q':printf("Bye");exit(EXIT_SUCCESS);
		}
		display(&f);
	}
	
	return 0;	
}

6.3 结果显示

结果显示


7. 第7题

7.1 题目描述

编写一个与编程练习6功能相同的程序,使用unsigned long 类型的变量储存字体信息,并且使用按位运算符而不是位成员来管理这些信息

7.2 编程源码

#include<stdio.h>
#include<stdlib.h>

struct font{
	unsigned int id:8;
	unsigned int size:7;
	unsigned int align:2;
	unsigned int b:1;
	unsigned int i:1;
	unsigned int u:1;
};

void display(unsigned long f){
	char *key[2]={"off", "on"};
	char *ali[3] = {"left","center","right"};
	
	printf("ID\tSIZE\tALIGENMENT\tB\tI\tU\n");
	printf("%d\t%d\t%s\t\t%s\t%s\t%s\n",(f>>12)&255,(f>>5)&127,ali[(f&(3<<3))>>3],key[(f&4)>>2],key[(f&2)>>1],key[f&1]);
	
	printf("f) change font\t s)change size\t a)chang alignment\n");
	printf("b) toggle bold \ti)toggle italic \tu)toggle underline \n");
	printf("q)quit\n");
}
void change_font(unsigned long *f){
	int num;
	printf("Enter font id (0~255):");
	scanf("%d", &num);
	*f = (*f&(~(255<<12)))|(num<<12);
	while(getchar()!='\n');
}
void change_size(unsigned long *f){
	int num;
	printf("Enter font size (0~255):");
	scanf("%d", &num);
	*f = (*f&(~(127<<5))) |(num<<5);
	
	while(getchar()!='\n');
}

void change_ali(unsigned long *f){
	printf("select alignment:\n");
	printf("l)left \tc)center \tr)right\n");
	char c=getchar();
	int num;
	switch(c){
		case 'l':num = 0;break;
		case 'c':num = 1;break;
		case 'r':num = 2;break;
	}
	*f = (*f&(~(3<<3))) |(num<<3);
	printf("%d\n",*f);
	while(getchar()!='\n');
}

int main(int argc, char** argv){
	unsigned long f=0;
	char c;
	display(f);
	while((c=getchar())!='\n'){
		while(getchar()!='\n');
		switch(c){
			case 'f':change_font(&f);break;
			case 's':change_size(&f);break;
			case 'a':change_ali(&f);break;
			case 'b':f|=4;break;
			case 'i':f|=2;break;
			case 'u':f|=1;;break;
			case 'q':printf("Bye");exit(EXIT_SUCCESS);
		}
		display(f);
	}
	
	return 0;	
}

7.3 结果显示

结果显示


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用easyexcel 导出多级表头demo

先看效果&#xff1a; 1、引入maven依赖 <!--EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency> 2、实体类 package com.…

c语言 编译与链接

编译与链接 翻译环境和执行环境翻译环境1.1预编译1.2编译1.3汇编&#xff08;ASM&#xff09;2.链接 执行环境最后给大家附上一张关于本节知识内容的图供大家更好理解~ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/522d488885ba44d99aa504d6b21c88d5.png) &…

yolov8+deepsort的代码实现

按照官方描述&#xff0c;YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数&#xff0c;可以…

Python新手常见问题——列表中删不掉的0

1.测试代码 运行代码 nums1 [1,2,3,0,0,0] print(type(nums1))for i in nums1:if i 0:nums1.remove(i) print(nums1)效果如下 2.疑问&#xff1a; 上面代码&#xff0c;为什么把nums1里面的0移除不干净 3.原因&#xff1a; 在 Python 中&#xff0c;不建议在循环中直接…

蒙特卡洛概率抽样简介

蒙特卡罗方法是一类对概率分布进行随机抽样的技术。 在许多问题领域中&#xff0c;描述或估计概率分布相对简单&#xff0c;但计算所需的数量却很棘手。这可能是由于多种原因造成的&#xff0c;例如domain的随机性质或随机变量的指数级数量增长。 相反&#xff0c;可以通过使…

学校智慧能源消耗管理系统,破解学校节能降耗难题

随着碳达峰、碳中和工作的主要任务&#xff0c;学校作为能源集中地&#xff0c;且能源情况较为复杂的建筑&#xff0c;有效降低能源消耗、减少能源使用成本&#xff0c;已经成为学校一项紧迫的任务。 学校能耗痛点有哪些&#xff1f; 1、规模大 学校是集教学、科研、生活于一…

zabbix客户端配置及自定义监控

部署zabbix客户机 1.服务端和客户端都配置时间同步 yum install -y ntpdate ntpdate -u ntp.aliyun.com 2.服务端和客户端都设置 hosts 解析 cat > /etc/hosts << EOF 172.16.23.16 localhost 172.16.23.17 zbx-server EOF 3.被监控端 //设置 zabbix 的下载源&…

leedcode刷题笔记day1

题目大意&#xff1a; 暴力解法 两个for循环&#xff08;也是我一看到题目想到的方法&#xff09; 枚举在数组中所有的不同的两个下标的组合逐个检查它们所对应的数的和是否等于 target 复杂度分析 时间复杂度:O(n2)&#xff0c;这里 n 为数组的长度 空间复杂度:O(1)&#x…

精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)

Dockerfile实战总结 前提介绍实战总结方案创建容器时传入环境变量调整宿主机和容器的时间差异解决办法 指定容器的rootfs的大小快速管理容器和镜像快速删除容器的原理--format格式化输出输出所有容器的name输出所有容器名包含test的容器查看退出状态的容器删除所有容器删除/启动…

transbigdata笔记:其他方法

1 出租车相关 1.1 taxigps_to_od 提取出租车OD信息 transbigdata.taxigps_to_od(data, col[VehicleNum, Stime, Lng, Lat, OpenStatus]) 输入出租车GPS数据&#xff0c;提取OD信息 data出租车GPS数据col[VehicleNum, Time, Lng, Lat, OpenStatus]五列 比如GPS数据长这样&am…

docker screen 常用基础命令

1.docker基础命令 1.1开启docker systemctl start docker #开启docker service docker restart #重启docker systemctl stop docker #关闭docker 1.2查看命令 docker images #查看docker镜像docker ps #查看正在运行的镜像或者容器docker ps -a #查看所有容器1.3运…

信驰达科技参与《汽车玻璃集成UWB数字钥匙发展研究白皮书》编制工作

为进一步探索汽车数字钥匙技术路线及开发思路&#xff0c;中国智能网联汽车产业创新联盟&#xff08;CAICV&#xff09;、福耀玻璃工业集团股份有限公司联合发起了《汽车玻璃集成UWB数字钥匙发展研究白皮书》研究工作。 2023年12月20日&#xff0c;由中国智能网联汽车产业创新…

Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx

目录 前言一、/proc/kmsg1、简介2、如何修改内核日志缓冲区3、dmesgklogctl 函数&#xff08;来源于 man 手册&#xff09; 4、扩展阅读 二、 /proc/sys/kernel/printk_xxx三、/dev/kmsg 前言 本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件&#xff0c;共同学习&am…

C语言总结十二:文件操作详细总结

在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同的硬件设备也都被看成一个文件。对这些文件的操作&#xff0c;等同于对磁盘上普通文件的操作。我们不去探讨硬件设备是如何被映射成文件的&#xff0c;把任意 I/O 设备&#xff0c;转换成…

ResNet论文翻译和精读

1:论文原文 论文原文&#xff1a; ResNet 2&#xff1a;该论文解决了什么问题&#xff1f; 改论文解决了深层的神经网络训练时的梯度消失和梯度爆炸的问题&#xff1b; 3&#xff1a;该论文的创新点&#xff1f; 将快捷连接应用到了网络中构建成了残差网络块&#xff1b;…

【嘉立创EDA-PCB设计指南】3.网络表概念解读+板框绘制

前言&#xff1a;本文对网络表概念解读板框绘制&#xff08;确定PCB板子轮廓&#xff09; 网络表概念解读 在本专栏的上一篇文章【嘉立创EDA-PCB设计指南】2&#xff0c;将设计的原理图转为了PCB&#xff0c;在PCB界面下出现了所有的封装&#xff0c;以及所有的飞线属性&…

代码随想录算法训练营29期|day 22 任务以及具体安排

235. 二叉搜索树的最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root null) return null;//向左遍历if(root.val > p.val && root.val > q.val){TreeNode left lowestCommonAncestor(roo…

Redis和MySQL如何保持数据一致性

前言 在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以&#xff0c;我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求。但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键…

基于springboot+vue的在线拍卖系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

redis数据安全(四)复制

关系数据库通常会使用一个主服务器向多个从服务器发送更新&#xff0c;并使用从服务器来处理所有读请求&#xff0c;Redis也采用了同样的方法来实现自己的复制特性&#xff0c;并将其用做扩展性能的一种手段。 一、特点&#xff1a; 1、异步复制&#xff1a;Redis默认使用的是…