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.rhkb.cn/news/308519.html

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

相关文章

3D室内装潢设计 Sweet Home 3D for Mac 中文直装版

Sweet Home 3D 是一款非常棒的家装辅助设计软件&#xff0c;支持包括中文在内的16中语言&#xff0c;它能帮您通过二维的家居平面图来设计和布置您的家具,还可以用三维的视角浏览整个装修布局的全貌。是一款操作起来简单方便&#xff0c;使用起来快捷、迅速&#xff0c;拥有超高…

C语言——数据在内存中的存储

引言 数据是程序运行的核心。当我们用C语言编写程序时&#xff0c;我们实际上是在操纵内存中的数据。这些数据在内存中是如何储存的&#xff0c;今天我们就来学习这些内容。 基本数据类型 1.整型 int: 基本整型&#xff0c;通常占用4个字节 short: 短整型&#xff0c;通常占用…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行&#xff0c;输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录&#xff08;默认在C盘下的Program …

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示汉字应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD12864显示汉字应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD12864简单介绍一、LCD12864点阵型液…

【四十八】【算法分析与设计】单调栈,单调栈模板,单调栈求个元素最近小于(等于)或者大于(等于)下标

求各个元素左边和右边的最近的小于&#xff08;等于&#xff09;的下标 最近的小于的计算过程: 实现的过程需要用到一个stack<>st 黑盒:在st的元素都可以正确计算出最近小于的元素下标那么我们依次将arr中的元素入栈计即可 1.栈里面存储的是vector&#xff0c;vector存…

无人机巡检技术革命性变革光伏电站运维管理

在中国广袤的大地上&#xff0c;光伏电站如雨后春笋般崛起&#xff0c;晶体硅组件板在阳光下熠熠生辉&#xff0c;为人们带来了源源不断的绿色能源。然而&#xff0c;随着光伏产业的迅猛发展&#xff0c;电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入&#xff0c;…

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量…

一起学习python——基础篇(19)

今天来说一下python的如何修改文件名称、获取文件大小、读取文中指定的某一行内容。 1、修改文件名称&#xff1a; import os testPath"D:/pythonFile/test.txt" testPath2"D:/pythonFile/test2.txt" #修改文件名称使用rename方法&#xff0c; #第一个参…

滑动窗口例题

一、209:长度最小的子数组 209:长度最小的子数组 思路&#xff1a;1、暴力解法&#xff1a;两层for循环遍历&#xff0c;当sum > target时计算子数组长度并与result比较&#xff0c;取最小的更新result。提交但是超出了时间限制。 class Solution {public int minSubArray…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

CMake 学习笔记2

其他很好的总结 CMake教程系列-01-最小配置示例 - 知乎 CMake 保姆级教程&#xff08;上&#xff09; | 爱编程的大丙 10-补充(完结)_哔哩哔哩_bilibili 1、基本关键字 SET命令的补充 &#xff08;1&#xff09;SET命令设置执行标准 #增加-stdc11 set(CMAKE_CXX_STANDARD…

CMake快速入门

文章目录 目的环境准备快速入门总结 目的 C/C的代码可以直接使用编译工具链进行编译&#xff0c;这种方式文件一多就不方便了。也可以编写 Makefile 然后使用 make 进行编译&#xff0c;当然写 Makefile 其实也挺繁琐。对于大型项目比较流行的是编写 CMakeLists.txt 然后使用 …

Hive的分区与排序

一、Hive分区 1.引入&#xff1a; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff…

2024最新在线工具箱网站系统源码

2024最新在线工具箱网站系统源码 下载地址: 2024最新在线工具箱网站系统源码-JXASP源码网https://www.jxasp.com/think-php/12489.html

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法一条SQL足以。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

OpenCV4.10使用形态运算提取水平线和垂直线

目标 在本教程中&#xff0c;您将学习如何&#xff1a; 应用两个非常常见的形态运算符&#xff08;即膨胀和侵蚀&#xff09;&#xff0c;并创建自定义内核&#xff0c;以便在水平轴和垂直轴上提取直线。为此&#xff0c;您将使用以下 OpenCV 函数&#xff1a; erode()dilate…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

CSS基础之伪类选择器(如果想知道CSS的伪类选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;学习CSS就必须要学习选择器&#xff0c;在之前我们已经学习了基本选择器和复合选择器&#xff0c;但是还有几个选择器没有学习&#xff0c;这篇文章主要讲解伪类选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-…

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数…