2.3 常量

strlen函数:返回s的长度

int strlenn(char s[])
{
int i=0;
while(s[i] != '\0')
++i;
return i;
}

2.7 类型转换

atoi函数:将字符串s转换为相应的整型

int atoi(char s[])
{
int n = 0;
for (int i = 0; s[i] >= '0' && s[i] <= '9'; i++)
n = 10*n + (s[i] - '0');
return n;
}

lower函数:把字符c转换为小写形式,只对ASCII字符集有效

int lower(int c)
{
if(c >= 'A' && c <= 'Z')
return c + 'a' -'A';
else
return c;
}

rand函数:返回取值在0~32767之间的伪随机数,\(2^{15}\) = 32768

srand函数:为rand()函数设置种子数

unsigned long  int next = 1;

int rand()
{
next = next*1103515245 + 12345;
return (unsigned int)(next/65536)%32768;
} void srand(unsigned int seed)
{
next = seed;
}

练习2-3

编写函数htoi(s), 把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串中允许包含数字包括:09,af以及A~F。

int htoi(char s[])
{
int n = 0,i = 0;
if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) i = 2; for(; s[i] != '\0'; ++i) {
if(s[i] >= '0' && s[i] <= '9')
n = 16*n + (s[i] - '0');
else if(s[i] >= 'a' && s[i] <= 'f')
n = 16*n + (s[i] - 'a' + 10);
else if(s[i] >= 'A' && s[i] <= 'F')
n = 16*n + (s[i] - 'A' + 10);
else break;
}
return n;
}

2.8 自增运算符与自减运算符

squeeze函数:从字符串s中删除字符

void squeeze(char s[], char c)
{
int i,j;
for(i=j=0; s[i] != '\0'; ++i)
if(s[i] != c) //当不相等时才赋值,否则忽略
s[j++] = s[i];
s[j] = '\0';
}

strcat函数:将字符串t连接到字符串s的尾部;s必须有足够大的空间

void strcatt(char s[], char t[])
{
int i=0,j=0;
while(s[i] != '\0')
++i;
while((s[i++] = t[j++]) != '\0')
;
}

练习2-4

重写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。

void squeeze2(char s1[], char s2[])
{
int i,j,z;
for(i=j=0; s1[i] != '\0'; ++i) {
for(z=0; s2[z] != '\0'&& s1[i] != s2[z]; ++z)
;
if(s2[z] == '\0') s1[j++] = s1[i]; //s2没有与之相等的字符
}
s1[j] = '\0';
}

练习2-5

编写函数any(s1,s2),将字符s2中的任一字符在字符串s1中的第一次出现的位置作为结果返回。如果s1中不包含s2中的字符,则返回-1。(标准库函数strpbrk具有同样的功能,但它返回的是指向该位置的指针。)

int any(char s1[], char s2[])
{
int i,j; for(i=0; s1[i] != '\0'; ++i) {
for(j=0; s2[j] != '\0' && s1[i] != s2[j]; ++j)
;
if(s2[j] != '\0') return i; //发现s2有相等字符
}
return -1;
}

2.9 按位运算符

getbits 函数:返回x中第p位开始的n位, 如getbits(x,4,3) 返回4,3,2位

unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p-n+1)) & ~(~0 << n);
}

2.10 赋值运算符与表达式

bitcount函数:统计x中值位1的二进制位数

int bitcount(unsigned x)
{
int b;
for(b=0; x!= 0; x >>= 1)
if(x & 01)
++b;
return b;
}

练习2-9

在求对2的补码时,表达式x &= (x-1)可以删除x中最右边值为1的一个二进制位。请解释这样做的道理。用这一方法重写bitcount函数,以加快其执行速度

int bitcount(unsigned x)
{
int b;
for(b=0; x!= 0; x &= (x-1))
++b;
return b;
}

练习 2-10

重新编写将大写字母转换为小写字母的函数lower,并用条件表达式替代其中的if-else结构

int lower(int c)
{
return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;
}

C程序设计语言练习 第二章的更多相关文章

  1. Java语言程序设计(基础篇)第二章

    第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...

  2. C程序设计语言(第二版)习题:第一章

    第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...

  3. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  4. win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...

  5. C程序设计语言笔记-第一章

     The C Programming language notes 一 基础变量类型.运算符和判断循环         char                 字符型  character      ...

  6. C程序设计语言(第二版)习题:第二章

    这一章习题做着很舒服,毕竟很简单.所以很有感觉. 练习 2-1 Write a program to determine the ranges of char , short , int , and ...

  7. 《python语言程序设计》_第二章笔记之2.13_软件开发流程

    #程序1: 设计:由用户键入利率.贷款数以及贷款的年限,系统计算出每月还贷数和总还款数 注意:输入的年利率是带有百分比的数字,例如:4.5%.程序需要将它除以100转换成小数.因为一年有12个月,所以 ...

  8. 《python语言程序设计》_第二章笔记

    #2.2_编写一个简单的程序 项目1: 设计:radius=20,求面积area? 程序: radius=20 #给变量radius复制area=radius*radius*3.14159 #编写ar ...

  9. 《python语言程序设计》_第二章编程题

    2.1 程序: Celsius=eval(input("Enter a degree in Celsius:"))#输入摄氏度的值Celsiusfahrenheit =(9/5)* ...

随机推荐

  1. Oracle 分区默认segment大小变化(64k—>8M)

    原文链接:http://www.cnblogs.com/wcwen1990/p/6656545.html _partition_large_extents和_index_partition_large ...

  2. Mac查看进程

    Last login: Tue Jun 11 11:18:10 on ttys001 liangyufengdeMacBook-Pro:vod-admin liangyufeng$ lsof -i:6 ...

  3. 第12组 Beta冲刺(2/5)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 由于这两天在修严重Bug,故项目没有新的进展,燃尽图没有变化 展示Git当日代码/文档签入记录(组内 ...

  4. shell 修改文件所有者

    chown   用户名   文件名  -R

  5. 理解Web路由(浅谈前后端路由与前后端渲染)

    1.什么是路由? 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 路由的概念最开始是由后端提出来的,在以前用模板引擎开发页面的时候,是使用路 ...

  6. [Beta]第四次 Scrum Meeting

    [Beta]第四次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/12 22:00 30min 大运村公寓6F楼道 附Github仓库:WEDO 例会照片 工作情况 ...

  7. Redis的常用JavaAPI(Jedis)实现

    一.  pom依赖: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency> & ...

  8. Netty 多客户端连接与通信

    实现场景: 聊天 服务端,客户端A,客户端B,客户端C.当客户端发送消息给服务端后,服务端在将这条消息广播个所有客户端户端A,客户端B,客户端C. 需求1: 客户端上线后,会通知所有客户端上线. 如客 ...

  9. mysql实现oracle存储过程默认参数

    我们都知道oracle存储过程支持为参数设置默认值,这样即使存储过程升级,原来的调用也可以不受影响.但是mysql不支持,mariadb也没有支持(截止10.4也是如此).但是这一限制会导致升级麻烦重 ...

  10. ArcGIS 要素类整体平移工具-arcgis/arcpy/模型构建器案例实习教程

    ArcGIS 要素类整体平移工具-arcgis/arcpy/模型构建器案例实习教程 联系方式:谢老师,135-4855_4328,xiexiaokui#qq.com 目的:对整个要素类,按指定偏移距离 ...