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用户也可以间接完成部分工作。下面是…

前端对接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) 西北工业…

【简明图文教程】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全部删掉

关于部署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…

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恢复功能、自带所有驱动、出厂主题壁纸、系统属性联机支持…

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;往往会危及到整个服…

Vue 项目build打包发布到giteepages ,首页正常显示,其他路由页面报错404的解决方法

直接上解决方法&#xff1a; 打包之后dist上传之后&#xff0c;还要新创一个.spa文件&#xff0c;注意&#xff01;是 .spa 有个. 点&#xff0c;如下图 一般这样就可以开始部署了&#xff0c;然后开启giteepages服务。如果出现了首页正常显示&#xff0c;其他页面显示…

全新华为MateBook X Pro发布,将Ultra9放入980g超轻薄机身

2024年4月11日&#xff0c;在华为鸿蒙生态春季沟通会上全新的华为MateBook X Pro正式发布。该机以美学设计、创新科技以及智慧体验&#xff0c;追求重新定义Pro、重新定义旗舰&#xff0c;将颠覆消费者对传统轻薄本的认知。 华为MateBook X Pro追求极致轻薄与强大性能的完美结合…

Java安全管理器-SecurityManager

定义&#xff1a; SecurityManager是Java中的一个类&#xff0c;用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理&#xff0c;并控制哪些操作可以执行&#xff0c;哪些应该被拒绝。主要功能包括&#xff1a; 安全策略管理&#xff1a;SecurityManager允许…

D-LinkNAS 远程命令执行漏洞(CVE-2024-3273)RCE漏

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 D-LinkNAS是由D-Link公司制造的网络附加存储设备。…

SOLIDOWRKS怎么将中间格式的模具装配体转化为装配体格式

模具是工业生产中用于制作成型物品的工具&#xff0c;它由各种零件构成&#xff0c;可以通过改变所成型材料的物理状态来实现物品外形的加工。如果工程师已经有其他格式的模具装配体&#xff0c;但是又想将其他格式的模具装配体导入solidworks里面&#xff0c;并且将一个个实体…