The C programming language (second edition,KR) exercise(CHAPTER 3)

      E x c e r c i s e 3 − 1 Excercise\quad 3-1 Excercise31:输出结果如图1所示,这里故意让二分搜索算法去寻找一个在数组中不存在在的数,然后去看两种二分搜索算法分别所花费的时间的大小,为了使得所花费的时间更具有可分辨性,这里让搜索过程重复执行了 100000000 100000000 100000000次。

/* Solution by Paul Griffiths (mail@paulgriffiths.net) *//*EX3_1.C=======Suggested solution to Exercise 3-1*/#include <stdio.h>
#include <time.h>int binsearch(int x, int v[], int n);     /*  Original K&R function  */
int binsearch2(int x, int v[], int n);    /*  Our new function       */#define MAX_ELEMENT 200000/*  Outputs approximation of processor time requiredfor our two binary search functions. We search forthe element -1, to time the functions' worst caseperformance (i.e. element not found in test data)   */int main(void) 
{int testdata[MAX_ELEMENT];int index;                  /*  Index of found element in test data  */int n = -1;                 /*  Element to search for  */int i;clock_t time_taken;/*  Initialize test data  */for ( i = 0; i < MAX_ELEMENT; ++i )testdata[i] = i;/*  Output approximation of time taken for 100000000 iterations of binsearch() */for ( i = 0, time_taken = clock(); i < 100000000; ++i ) {index = binsearch(n, testdata, MAX_ELEMENT);}time_taken = clock() - time_taken;if ( index < 0 )printf("Element %d not found.\n", n);elseprintf("Element %d found at index %d.\n", n, index);printf("binsearch() took %lu clocks (%lu seconds)\n",(unsigned long) time_taken,(unsigned long) time_taken / CLOCKS_PER_SEC);/*  Output approximation of time taken for 100000000 iterations of binsearch2() */for ( i = 0, time_taken = clock(); i < 100000000; ++i ) {index = binsearch2(n, testdata, MAX_ELEMENT);}time_taken = clock() - time_taken;if ( index < 0 )printf("Element %d not found.\n", n);elseprintf("Element %d found at index %d.\n", n, index);printf("binsearch2() took %lu clocks (%lu seconds)\n",(unsigned long) time_taken,(unsigned long) time_taken / CLOCKS_PER_SEC);return 0;
}/* binsearch:find x in v[0] <= v[1] <= ... v[n-1] */int binsearch(int x, int v[], int n) 
{int low, mid, high;low = 0;high = n - 1;while ( low <= high ) {mid = (low+high) / 2;if ( x < v[mid] )high = mid - 1;else if ( x > v[mid] )low = mid + 1;elsereturn mid;}return -1;
}/* binsearch2:find x in v[0] <= v[1] <= ... v[n-1] */int binsearch2(int x, int v[], int n) 
{int low, mid, high;low = 0;high = n - 1;mid = (low+high) / 2;	while (( low < high ) &&(x != v[mid])){if ( x < v[mid] )high = mid - 1;elselow = mid + 1;mid = (low+high) / 2;		}if ( x == v[mid] )return mid;elsereturn -1;
}
图1.

      E x c e r c i s e 3 − 2 Excercise\quad 3-2 Excercise32:输出结果如图2所示

#include <stdio.h>void escape(char s[], char t[]);  
void unescape(char s[], char t[]); 
int main(void) 
{char text1[100] = "\aHello,\n\tWorld! Mistakee\b was \"Extra 'e'\"!\n";char text2[100];char text3[100];    printf("Original string:\n%s\n", text1);escape(text2, text1);printf("Escaped string:\n%s\n", text2);unescape(text2, text3);printf("Unescaped string:\n%s\n", text3);return 0;
}/*  Copies string t to string s, converting specialcharacters into their appropriate escape sequences.The "complete set of escape sequences" found inK&R Chapter 2 is used, with the exception of:\? \' \ooo \xhhas these can be typed directly into the source code,(i.e. without using the escape sequences themselves)and translating them is therefore ambiguous.    */
void escape(char s[], char t[]) 
{int i=0;int j=0;while ( t[i]!='\0' ) {switch (t[i]){case '\t':s[j++]='\\';s[j++]='t';			break;case '\n':s[j++]='\\';s[j++]='n';				break;	case '\a':s[j++]='\\';s[j++]='a';			break;case '\b':s[j++]='\\';s[j++]='b';			break;case '\f':s[j++]='\\';s[j++]='f';			break;case '\r':s[j++]='\\';s[j++]='r';			break;case '\v':s[j++]='\\';s[j++]='v';			break;	case '\"':s[j++]='\\';s[j++]='\"';			break;case '\\':s[j++]='\\';s[j++]='\\';			break;								default:s[j++]=t[i];			break;			}i++;}s[j]='\0';
}/*  Copies string s to string t, converting escape sequencesinto their appropriate special characters. See the commentfor escape() for remarks regarding which escape sequencesare translated. */
void unescape(char s[], char t[]) 
{int i=0;int j=0;while ( s[i]!='\0' ) {switch (s[i]){case '\\':switch (s[++i]){case 't':t[j++]='\t';		break;case 'n':t[j++]='\n';			break;	case 'a':t[j++]='\a';		break;case 'b':t[j++]='\b';		break;case 'f':t[j++]='\f';		break;case 'r':t[j++]='\r';		break;case 'v':t[j++]='\v';		break;case '\"':t[j++]='\"';			break;case '\\':t[j++]='\\';		break;default:/*  We don't translate this escapesequence, so just copy it verbatim  */                t[j++] = '\\';t[j++] = t[i];						}			break;								default:t[j++]=s[i];			break;			}++i;}t[j]='\0';
}
图2.

      E x c e r c i s e 3 − 3 Excercise\quad 3-3 Excercise33:输出结果如图3所示。

#include <stdio.h>#define MAXIMUM 1000void expand(char s1[], char s2[]);
int is_valid(char c);int main()
{char s1[MAXIMUM] = "-A-C-E-I first a-z0-9 second -a-z third   9-2 fourth   6-6- end-";	char s2[MAXIMUM];printf("%s\n", s1);expand(s1, s2);printf("%s\n", s2);return 0;
}void expand(char s1[], char s2[]) 
{char c, d;int i, j;i = j = 0;while ('\0' != (c = s1[i++])) {if (is_valid(c) && '-' == s1[i]  && is_valid(s1[i + 1])) {i++;d = s1[i];if (c > d) {while (c > d) {s2[j++] = c--;}}else {while (c < d) {s2[j++] = c++;}}}else {s2[j++] = c;}}s2[j] = '\0';
}int is_valid(char c)
{if(((c>='a') && (c<='z'))	|| ((c>='A') && (c<='Z'))	|| ((c>='0') && (c<='9'))){return 1;}else{return 0;}	
}
图3.

      E x c e r c i s e 3 − 4 Excercise\quad 3-4 Excercise34:下面我们首先来看一段代码以及输出,输出结果如图4所示。这里 i n t int int型变量能表示的数的最大范围是 [ − 2147483648 , 2147483647 ] [-2147483648,2147483647] [2147483648,2147483647],这里我们可以看到 i n t int int型可以表示的最大负数的绝对值要比 i n t int int型可以表示的最大正数的值大一(其它类型的有符号数的类型也是一样的),当我们在尝试使用书中的那个版本的 i t o a itoa itoa接口来将 i n t int int型可以表示的最大负数 − 2147483648 -2147483648 2147483648转换为字符串的时候会出现问题。书中的那个版本的 i t o a itoa itoa接口会首先将要转换的负数变成正数,但是对于 i n t int int型,它可以表示的最大正数是 2147483647 2147483647 2147483647,因此从图4中我们可以看到 i n t u = − i ; int u=-i; intu=i;操作之后 u u u的值还是 − 2147483648 -2147483648 2147483648,因此书中的那个版本的 i t o a itoa itoa接口中的 d o w h i l e do\quad while dowhile循环只会运行一次且就算是这一次对个位数的转换也是错误的,这是因为这一次循环中 n % 10 n\%10 n%10操作的结果是 − 8 -8 8,因此 n % 10 + ′ 0 ′ n\%10+'0' n%10+0操作的结果是 40 40 40(字符 ′ 0 ′ '0' 0 A S C I I ASCII ASCII码值是48,字符 ′ ( ′ '(' ( A S C I I ASCII ASCII码值是40,),因此这里并没有得到我们所预期的字符 ′ 8 ′ '8' 8。为了能够成功实现对 i n t int int型可以表示的最大负数的转换,改进后的程序在判断 d o w h i l e do\quad while dowhile循环的执行的时候改为 w h i l e ( n / = 10 ) ; while ( n /= 10 ); while(n/=10);,而不是 w h i l e ( ( n / = 10 ) > 0 ) ; while( ( n /= 10 )>0); while((n/=10)>0);也就是不为0就可以继续执行循环,且改进后的程序在求余数之后做了绝对值的操作。

#include <stdio.h>
#include <limits.h>int main(void)
{char c='\0';printf("sizeof(int)=%d\n",sizeof(int));printf("Signed int[%d to %d]\n", INT_MIN, INT_MAX);printf("Unsigned int[0 to %u]\n", UINT_MAX);int i=-2147483648;int u=-i;	printf("i=%d\n",i);	printf("u=%d\n",u);			c=(u%10)+'0';printf("c=%d\n",c);	printf("c=%c\n",c);		return 0;
}
图4.
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>void itoa_myself(int n, char s[]);
void reverse(char s[]);int main(void) 
{char buffer[100];printf("INT_MIN: %d\n", INT_MIN);itoa_myself(INT_MIN, buffer);printf("Buffer : %s\n", buffer);return 0;
}void itoa_myself(int n, char s[]) 
{int i, sign;sign = n;i = 0;do {s[i++] = abs(n % 10) + '0';} while ( n /= 10 );if (sign < 0)s[i++] = '-';s[i] = '\0';reverse(s);
}void reverse(char s[]) 
{int c, i, j;for ( i = 0, j = strlen(s)-1; i < j; i++, j--) {c = s[i];s[i] = s[j];s[j] = c;}
}

      E x c e r c i s e 3 − 5 Excercise\quad 3-5 Excercise35

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void itob(int n , char s[], int b);
void reverse(char s[]);#define MAXIMUM 100int main(){int b = 16;char s[MAXIMUM];itob(-2147483648,s,b);printf("Base %d = %s\n",b,s);return 0;
}void itob(int n, char s[], int b)
{int i = 0;int negative=0;if(n<0){negative=-1;			}if((b!=2) && (b!=8) && (b!=16)) {		printf("base error\n");	}		do{if (abs(n%b)>9)s[i++]= abs(n%b) +'A'-10;elses[i++] = abs(n%b) +'0';} while ((n/=b));if(negative==-1){s[i++]='-';			}s[i] = '\0';	reverse(s);
}void reverse (char s[])
{int i , j , c;for (i = 0, j = strlen(s)-1; i < j; i++,j--)c = s[i], s[i]=s[j], s[j]=c;
}

      E x c e r c i s e 3 − 6 Excercise\quad 3-6 Excercise36

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>void itoa_myself(int n, char s[], int minmum);
void reverse(char s[]);int main(void) 
{char buffer[100];printf("INT_MIN: %d\n", INT_MIN);itoa_myself(INT_MIN, buffer,25);printf("Buffer : %s\n", buffer);return 0;
}void itoa_myself(int n, char s[], int minmum) 
{int i, sign;sign = n;i = 0;do {s[i++] = abs(n % 10) + '0';} while ( n /= 10 );if (sign < 0)s[i++] = '-';while(i<minmum){s[i++] = ' ';		}	s[i] = '\0';reverse(s);
}void reverse(char s[]) 
{int c, i, j;for ( i = 0, j = strlen(s)-1; i < j; i++, j--) {c = s[i];s[i] = s[j];s[j] = c;}
}

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

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

相关文章

【HTML】制作一个简单的线性动画

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;两个文件夹&#xff0c;其中HTML的文件名改为[index.html]&am…

面试经典算法系列之二叉树1 -- 从前序与中序遍历序列构造二叉树

面试经典算法16 - 从前序与中序遍历序列构造二叉树 LeetCode.105 公众号&#xff1a;阿Q技术站 问题描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根…

VUE typescript 调用stompjs[Rabbit MQ]

npm拉下来最新的2.3.9版本&#xff0c;发现一些原来Js代码已经不能用了。顺便解读了下最新定义的内容 // <reference types"node" />export const VERSIONS: {V1_0: string;V1_1: string;V1_2: string;supportedVersions: () > string[]; };export class C…

airtest-ios真机搭建实践

首先阅读4 ios connection - Airtest Project Docs 在Windows环境下搭建Airtest对iOS真机进行自动化测试的过程相对复杂&#xff0c;因为iOS的自动化测试通常需要依赖Mac OS系统&#xff0c;但理论上借助一些工具和服务&#xff0c;Windows用户也可以间接完成部分工作。下面是…

es6之 Symbol 独一无二的值

1、介绍 ES5 的对象属性名都是字符串&#xff0c;这容易造成属性名的冲突。比如&#xff0c;你使用了一个他人提供的对象&#xff0c;但又想为这个对象添加新的方法&#xff08;mixin 模式&#xff09;&#xff0c;新方法的名字就有可能与现有方法产生冲突。如果有一种机制&am…

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …

PairAug:增强图像-文本对对放射学有什么用?

论文链接 代码链接GitHub - YtongXie/PairAug: [CVPR2024] PairAug: What Can Augmented Image-Text Pairs Do for Radiology? 发表于CVPR2024 机构 1) 澳大利亚机器学习研究所(AIML)&#xff0c;澳大利亚阿德莱德大学 2) 西北工业大学计算机科学与工程学院 3) 西北工业…

useRef总结

一、使用ref引用值 在react中ref的主要用途是用来获取DOM元素或者某个组件实例的引用。当你想访问真实的DOM节点&#xff0c;或者需要在组件之间共享可变数据且不需要触发重新渲染时&#xff0c;通常会使用ref。在vue中ref是响应式的&#xff0c;当数据发生改变时&#xff0c;相…

【简明图文教程】Node.js的下载、安装、环境配置及测试

文章目录 前言下载Node.js安装Node.js配置Node.js配置环境变量测试后言 前言 本教程适用于小白第一次从零开始进行Node.js的下载、安装、环境配置及测试。 如果你之前已经安装过了Node.js或删除掉了Node.js想重新安装&#xff0c;需要先参考以下博客进行处理后&#xff0c;再根…

渗透测试实战——第一站

仅供交流学习使用&#xff0c;请勿用于非法用途 前言&#xff1a;刚学了sql注入&#xff0c;只听理论总感觉没啥用&#xff0c;今天花了一半个多小时&#xff0c;去尝试寻找有漏洞的网站&#xff0c;最终找到了一个&#xff1b;实践是检验真理的唯一标准。 我是通过黑客常用语法…

牛客 NC36 在两个长度相等的排序数组中找到上中位数【中等 模拟 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6fbe70f3a51d44fa9395cfc49694404f 思路 直接模拟2个数组有顺序放到一个数组中&#xff0c;然后返回中间的数参考答案java import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 pu…

深入剖析UDP反射放大攻击原理及其有效防护策略

引言 随着互联网的飞速发展和业务复杂性的提升&#xff0c;网络安全问题日益凸显&#xff0c;其中分布式拒绝服务&#xff08;DDoS&#xff09;攻击成为危害最为严重的一类网络威胁之一。UDP反射放大攻击作为一种高效的DDoS手段&#xff0c;因其攻击成本低廉、威力巨大&#x…

IDEA中无法保存设置 Cannot Save Settings

确定原因: 在IDEA中父工程不应该存在有子工程的相关东西 首先,这是我的DCYJ项目(观察右侧的Content Root) 其次,这是我的EAPOFode项目(观察右侧的Content Root爆红处) 最后我将DCYJ项目右侧的Content Root全部删掉

es 倒排索引

es 倒排索引TRee 倒排索引树&#xff08;TRee&#xff09;通常指的是Elasticsearch中用于支持高速搜索的一种数据结构。它是一种树状结构&#xff0c;可以通过特定的词项&#xff08;terms&#xff09;来快速定位包含这些词项的文档。 在Elasticsearch中&#xff0c;倒排索引…

关于部署ELK和EFLKD的相关知识

文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana&#xff08;展示数据可视化界面&#xff09;1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…

TS基础1-基础环境搭建

目录 1&#xff0c;编译选项1.1&#xff0c;target1.2&#xff0c;module1.3&#xff0c;lib1.4&#xff0c;输入目录1.5&#xff0c;include1.6&#xff0c;files 2&#xff0c;使用第三方库简化流程2.1&#xff0c;ts-node2.2&#xff0c;nodemon 使用 tsc --init 初始化配置…

ASUS华硕ROG幻16Air笔记本电脑GU605M原装出厂Win11系统工厂包下载,带有ASUSRecovery一键重置还原

适用型号&#xff1a;GU605MI、GU605MY、GU605MZ、GU605MV、GU605MU 链接&#xff1a;https://pan.baidu.com/s/1YBmZZbTKpIu883jYCS9KfA?pwd9jd4 提取码&#xff1a;9jd4 华硕原厂Windows11系统带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性联机支持…

Vue3学习02 路由

Vue3学习02 路由 路由基本使用两个注意点路由器工作模式to的两种写法【命名路由】【嵌套路由】路由传参query参数params参数 路由规则的props配置replace属性编程式导航重定向 路由 路由器检测到路由的变化&#xff0c;路径变化&#xff0c;对应的组件也变化 基本使用 想使用…

Java后端搭建流程

目录 一、后端开发准备工作 1.下载 2.安装jdk &#xff0c;配置JAVA-HOME path 3.启动Tomcat 4.访问ip和端口 二、创建web项目 1.新建一个项目 2.发布web应用到服务器 &#xff08;1&#xff09;对LoginServlet继承HttpServlet &#xff08;2&#xff09;重写父类方法…

如何让视频流媒体平台免受网络攻击

在各国&#xff0c;流媒体服务已越来越受到大众的欢迎。有统计表明&#xff0c;目前视频流已占网络整体流量的80%以上。不过如您所见&#xff0c;近年来&#xff0c;数字威胁的不断增加&#xff0c;也让网络攻击逐年递增。单个视频用户受到的危险&#xff0c;往往会危及到整个服…