3.1 语句与程序块
在表达式之后加上一个分号(;),它们就变成了语句。
用一对花括号“{”与“}”把一组声明和语句括在一起就构成了程序块,在语法上等价于单条语句。
3.2 if-else语句
每个else与最近的前一个没有else配对的if进行匹配。
if (n > 0)
     if (a > b)
          z = a;
else
     z = b;
程序的缩进结构明确表明了设计意图,但编译器无法获得这一信息,它会将else部分与内层的if配对。
3.3 else-if语句
/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v[], int n)
{
     int low, high, mid;
     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;
          else     /* found match */
               return mid;
     }
     return -1;
}
练习3-1     上面折半查找的例子中,while循环语句内执行了两次测试。重写该函数,
使循环内部只执行一次测试。比较两种版本函数的运行时间。
答:
while (low <= high) {
     mid = (low + high) / 2;
     if (x < v[mid])
          high = mid +1;
     else
          low = mid + 1;
}
if (x == v[mid])
     return mid;
else
     return -1;
3.4 switch语句
case的作用只是一个标号,从某个分支中的代码执行完后,程序将进入下一分支继续执行。
跳出switch语句最常用的方法是使用break和return语句。
作为一种良好的程序设计风格,在switch语句最后的default分支后面也加上一个break语句。
这样做在逻辑上没有必要,但当我们需要向该switch语句后添加其他分支时,这样会降低犯
错误的可能性。
练习3-2     编写一个函数escape(s, t),将字符串t复制到字符串s中,并在复制过程中将换行符、
制表符等不可见字符分别转换为\n、\t等相应可见的转义字符。再编写一个相反功能的函数。
答:
#include <stdio.h>

void escape(char s[], char t[])
{
     int i, j;
     for (i = 0, j = 0; s[i] != '\0'; i++) {
          switch (s[i]) {
          case '\n':
               t[j++] = '\\';
               t[j++] = 'n';
               break;
          case '\t':
               t[j++] = '\\';
               t[j++] = 't';
               break;
          default:
               t[j++] = s[i];
               break;
          }
     }
     t[j] = '\0';
}
void escape2(char s[], char t[])
{
     int i, j;
     for (i = 0, j = 0; s[i] != '\0'; j++) {
          switch (s[i]) {
          case '\\':
               if (s[i+1] == 'n') {
                    t[j] = '\n';
                    i += 2;
               }
               else if (s[i+1] == 't') {
                    t[j] = '\t';
                    i += 2;
               }
               else {
                    t[j] = s[i];
                    i++;
               }
          default:
               t[j] = s[i++];
               break;
          }
     }
}
main()
{
     char s[] = "this is     cdai";
     char t[20];
     escape(s, t);    
     printf("%s\n", t);

char t2[20];
     escape2(t, t2);
     printf("%s\n", t2);
}

3.5 while循环与for循环
for (表达式1; 表达式2; 表达式3)
     语句
等价于=>
表达式1;
while (表达式2) {
     语句
     表达式3;
}
逗号运算符“,”在for语句中经常用到。被逗号分隔的一对表达式将按照从左到右的顺序进行求值,
分隔函数参数的逗号,分隔声明中变量的逗号等不是逗号运算符,不保证从左至右顺序求值。
/* reverse: reverse string s in place */
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;
}
练习3-3     编写函数expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中
扩展为等价的完整列表abc...xyz。该函数可以处理大小写字母和数字,并可以处理a-b-c、
a-z0-9与-a-z等类似的情况。作为前导和尾随的-字符原样排印。
答:
#include <stdio.h>
void expand(char s1[], char s2[])
{
     int i, j, k;
     i = j = 0;
     while (s1[i] != '\0') {
          if (s1[i] == '-' && 0 < i && s1[i+1] != '\0' &&
               s1[i-1] != '-' && s1[i+1] != '-') {
               j--;     // avoid duplicate letter
               for (k = s1[i-1]; k <= s1[i+1]; k++, j++)
                    s2[j] = k;
               i += 2;
          } else {
               s2[j++] = s1[i++];
          }
     }
     s2[j] = '\0';
}
main()
{
     char s1[] = "-a-b-hAbC-G0-8---";
     char s2[100];
     expand(s1, s2);
     printf("before expand:%s\nafter expand: %s\n", s1, s2);
}
3.6 do-while循环
/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
     int i, sign;
     
     if ((sign = n) < 0)               /* record sign and make n positive */
          n = -n;
     i = 0;
     do {                                   /* generate digits in reverse order */
          s[i++] = n % 10 + '0';     /* convert number to char */
     } while ((n /= 10) > 0);
     
     if (sign < 0)
          s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}
这里使用do-while语句会方便一些,因为即使n为0,也至少要把一个字符放到数组s中。
do-while中只有一条语句,(没有必要)但扔用花括号括起来,因为可以避免将while误认为
是另个while循环的开始。
练习3-4     在数的对二的补码表示中,上面的itoa函数不能处理最大的负数-2的(字长-1)次方
的情况。解释其原因,并修改函数使它在任何机器上运行时都能打印出正确的值。
答:
例如char字长为8位,则对二补码范围为-128~127。值为-128的char,n=-n;后值仍为-128。
128的二进制源码为01111111,通过补码的负数转换规则得到10000000,即-128二进制码为80(可用prinf("%hhx);验证)。
修改函数,不将n转为正数,而是将每次取模运算的结果转为正数。从而避开无法将最大负数转为正数的问题。
#include <stdio.h>
#define abs(x) ((x) < 0 ? -(x) : (x))
void itoa(int n, char s[])
{
     int i, sign;
     sign = n;

i = 0;
     do {
          s[i++] = abs(n % 10) + '0';
     } while ((n /= 10) != 0);

if (sign < 0)
          s[i++] = '-';
     s[i] = '\0';
     //reverse(s);     
}
main()
{
     char s[20];
     itoa(10, s);
     printf("%s\n", s);
     itoa(-128, s);
     printf("%s\n", s);
}

练习3-5     编写函数itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式
保存到字符串s中。例如,itob(n, s, 16)把整数n格式化为十六进制整数保存在s中。
答:
#include <stdio.h>
#include "reverse.c"
#define abs(x) (x) < 0 ? -(x) : (x)

void itob(int n, char s[], int b)
{
     int i, x, sign;
     sign = n;
     i = 0;
     do {
          x = abs(n % b);
          if (x >= 10)
               s[i++] = (x - 10) + 'A';
          else
               s[i++] = x + '0';
     } while ((n /= b) != 0);
     if (sign < 0)
          s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}
main()
{
     char s[20];
     itob(29, s, 2);     
     printf("%s\n", s);

itob(-257, s, 16);
     printf("%s\n", s);
}

练习 3-6     修改itoa函数,使得该函数可以接收三个参数。第三个参数为最小字段宽度。
为了保证转换后结果至少具有第三个参数指定的最小宽度,必要时在结果左边填充一定的空格。
答:
...
if (sign < 0)
     s[i++] = '-';
while (i <= w-1)     // fill space
     s[i++] = ' ';
...
3.7 break和continue语句
3.8 goto语句与标号

转载于:https://www.cnblogs.com/xiaomaohai/archive/2011/12/04/6157898.html

《C程序设计语言》 第三章 控制流相关推荐

  1. c程序设计语言第三章简答题,第3章 程序设计语言(答案).doc

    第3章 程序设计语言(答案) 踩厅灾伍亥挝拳缴海梳姻麦诅吨逝谭坪趋培矮提膜肥厘脯与哩廉诛赚来打揭粤魄又罢植郎苏咳居镊型惺肘挑搜禽剔抹缝咕昔春鸵等牺阎厩退墨脸噎姨辱蹋苯拐汲饿菊淌呕点省唤乍痞兢凛鞭庶鞋克 ...

  2. C程序设计语言-第三章 最简单的C程序设计——顺序程序设计

    第三章 最简单的C程序设计--顺序程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.2.1 常量和变量 3.2.2 数据类型 3.2.3整型数据 3.2.4 字符型数据 3.2. ...

  3. c语言减少控制流变量,C语言 第3章 控制流 (1简单程序设计).ppt

    第三章 控制流 鹿豺绽身实滁盗猩毡佃聘配那好嚏桩执滴镍辱蓄填撂淬把俞袖未塘居补出C语言 第3章 控制流 (1简单程序设计)C语言 第3章 控制流 (1简单程序设计) 2 主要内容 学习三种结构的程序设 ...

  4. c语言中,x-y,'105',ab,7f8那个是正确的,C语言程序设计_第三章 数据.ppt

    C语言程序设计_第三章 数据 * 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型 学习运算符应注意 * 基本算术运算符: + - * / % 结合方向: ...

  5. c语言求100∑k=1k 30,C语言程序设计〔第三章〕.ppt

    C语言程序设计[第三章] C 语言程序设计 第三章 程序控制结构 集美大学计算机学院 本章主要内容 程序设计方法简述 选择结构程序设计 if -else 语句 switch语句 循环结构程序设计 四种 ...

  6. 大学c语言第三章作业,华中科技大学光电子学院C语言第三章

    <华中科技大学光电子学院C语言第三章>由会员分享,可在线阅读,更多相关<华中科技大学光电子学院C语言第三章(20页珍藏版)>请在装配图网上搜索. 1.第三章 简单程序设计 1. ...

  7. c语言第三章作业题答案,c语言第三章简单练习题及答案.doc

    c语言第三章简单练习题及答案 c语言第三章简单练习题及答案 一.选择题 1. C语言提供的合法的数据类型关键字是. Double shortinteger Char 2. 在C语言中,合法的长整型常数 ...

  8. 《Windows程序设计》第三章学习心得(1)|图解消息机制

    注释:文章转载自如鹏网论坛,版权归原作者所有. 为了绘制下面那张所谓"Windows消息循环流程图",忙活了一下午!先给表扬一下自己(吼吼~画得还蛮好看的嘛!),再泼桶冷水(呃~乱 ...

  9. 谭浩强c语言第三章,谭浩强C语言第三章数据类型.ppt

    谭浩强C语言第三章数据类型.ppt 第三章 数据类型 运算符与表达式 本章要点 数据的描述规则数据的操作规则 主要内容 3 1C的数据类型3 2常量与变量3 3整型数据3 4浮点型数据运行3 5字符型 ...

  10. 保留两位小数有右对齐c语言,[理学]3 C语言 第三章顺序控制语句.ppt

    [理学]3 C语言 第三章顺序控制语句 1.C语句分五类: 控制语句.函数语句.表达式语句.空语句.复合语句. 其中控制语句又有9条. 2.结构化程序的三种基本结构: 顺序结构.分支结构.循环结构 3 ...

最新文章

  1. php正则判断不规范字符串,php学习_第9章_字符串处理与正则表达式
  2. OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
  3. SpringBoot中通过重写WebMvcConfigurer的方法配置静态资源映射实现图片上传后返回网络Url
  4. Jquery DataTable基本使用
  5. 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 国赛 - CC++大学B组 - A.美丽的2
  6. Sentinel云原生K8S部署实
  7. MyBatis-Plus分页查询——Page
  8. SQL Server 复制, 集群
  9. get请求中传json参数报400的错误_react的数据请求
  10. 尚硅谷大数据技术之 DataX—1)概述
  11. 【TA-霜狼_may-《百人计划》】图形3.2 混合模式及剔除
  12. 拿什么产品引流年轻女性?发什么能吸引女粉丝?
  13. Android一点 仿淘宝购物车动画
  14. 使用ManagedWifi连接无线网络
  15. Java架构师和java工程师的区别是什么?架构师薪资是多少?
  16. python Matplotlib中时间刻度标签的设置/主副刻度
  17. unity 适配iPhone X底部横条
  18. 计算机英语统考试卷分析,英语试卷分析
  19. 张栋推荐的machine-learning-for-hackers/
  20. 第十三讲:目标设定面对压力 第十四讲:压力完美主义 第十五讲:完美主义

热门文章

  1. 2021年高考成绩什么时候查询辽宁,2021年辽宁高考成绩什么时候几点可以查
  2. each 数据获取attr_Python数据分析 — 基于RFM的精细化用户分层
  3. 如何禁用特定css_通过CSS追踪用户
  4. python中dumps和dump区别_python json.dumps() json.dump()的区别
  5. oracle 随机数重复吗,Oracle生成不重复随机数
  6. mongodb 无法查出数据_MongoDB,再见还是再等等?
  7. php悬浮框,PopupWindow(悬浮框)的基本使用
  8. linux如何卸载光驱显示busy,关于linux卸载设备时的busy问题处理
  9. python学习知识以及就业方向_Python需要学到什么技术 学完可以从事哪些行业
  10. nginx限流方案的实现(三种方式)