C\C++

C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序

末鹿安然 提交于 2020-04-11 11:03:17
首先,这个程序应该逐个读取字符,并且应该有些方法判断何时停止 ;第二, 它应该能够识别并统计下列单位:字符、行和单词。 下面是伪代码描述: read a character while there is more input increment character count if a line has been read ,increment line count if a word has been read ,increment word count read next character 前面已经有输入循环的模型了: while ((ch=getchar())!=STOP) { .... } 这里的 STOP代表通知输入结束的ch取值。 现在我们暂且选择一个在文本中不常见的字符(|)。 现在来考虑一下循环体。因为程序使用getchar()来输入字符,所以可以在每个循环周期通过递增一个计数器的值来统计字符 。为了统计行数,程序可以检查换行符。如果字符 是换行符,程序就递增行数计数器的值。有个问题是如果STOP字符出现在一行的中间该 怎么办?行数计数应不应该增加呢?一种做法是将它作为一个不完整的行统计,也就是说,该行有字符 而没有换行符。可以通过追踪前一个字符来识别这种情况 。如果STOP之前所读入的最后一个字符不是换行符,就计数一个不完整行。 最棘手的部分是识别单词,首先

C Primer Plus 第9章 函数 9.3 递归

情到浓时终转凉″ 提交于 2020-03-01 06:13:05
9.3.1 递归的使用 为了具体说明,请看下面的例子。程序清单9.6中函数main()调用了函数up_and_down()。 我们把这次调用称为“第一级递归”。然后up_and_down()调用其本身,这次调用叫做“第二级递归”。 第2级递归调用第3级递归,依此类推。为了深入其中看看究竟发生了什么, 程序不仅显示出了变量n的值,还显出出了存储n的内存的地址&n(本章稍后部分将更全面的讨论&运算符。 printf()函数使用%p说明符来指示地址 )。 程序清单9.6 recur.c程序 /*recur.c --递归举例*/ #include <stdio.h> void up_and_down(int); int main(void) { up_and_down(1); return 0; } void up_and_down (int n) { printf("Level %d : n location %p\n",n,&n); /*1*/ if(n<4) up_and_down(n+1); printf("Level %d : n location %p\n",n,&n); /*2*/ } 我们来分析程序中递归的具体工作过程。首先main()使用参数1调用了函数up_and_down()。于是up_and_down()中形式参量n的值为1,故打印语句#1输出了Leve 1。 然后

C Primer Plus 第11章 11.8 命令行参数

拥有回忆 提交于 2020-01-07 15:14:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 现代的图形界面出现之前是命令行界面 。Dos和Unix就是例子。 命令行(command line)是在一个命令行环境下,用户输入的用于运行程序的行。 假定有一个程序在名为fuss 的文件中,那么在UNIX下运行该程序的命令行如下: $ fuss 或者在windows命令行模式下,如windows xp命令提示符: c> fuss 命令行参数(command-line argument)是同一行中的附加项。如下例: % fuss -r Ginger 一个C程序可以读取这些附加项为自己所用。 C程序通过使用main()的参数读取这些项目 。程序清单11.27给出了一个典型的例子。 程序清单11.27 repeat.c程序 /*repeat.c --带有参数的main()函数*/ #include <stdio.h> int main (int argc,char * argv[]) { int count; printf("The command line has %d arguments: \n",argc - 1); for (count=1;count<argc;count++) printf("%d: %s\n",count,argv[count]); printf("\n"); return 0; }

C Primer Plus 第11章 11.6 字符串例子:字符串排序

╄→尐↘猪︶ㄣ 提交于 2020-01-07 14:15:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们来解决一个把字符串按字母表顺序排序的问题。准备花名册、建立索引以及很多其他情况下都会用到字符串排序。 这个程序的一个主要工具就是strcmp( ),因为可以使用这个函数来决定两个字符串的顺序 。一般的做法是读取一个字符串数组、对它们进行排序并输出。先前,我们给出一个读取字符串的方案,我们就按那个方案开始该程序。输出字符串不会有什么问题。程序使用的标准排序算法,后面会进行解释。我们在其中使用了一个小技巧,看您能否弄明白它。程序清单11.25给出了程序。 程序清单11.25 sort_str.c程序 /*sort_str.c 读进一些字符串并对它们排序*/ #include <stdio.h> #include <string.h> #define SIZE 81 /*字符串长度限制,包括'\0' */ #define LIM 20 /*最多读取的行数 */ #define HALT " " /*用空字符串终止结束 */ void stsrt(char *strings[],int num); /*字符串排序函数*/ int main(void) { char input[LIM][SIZE]; /*存储输入的数组*/ char *ptstr[LIM]; /*指针变量的数组*/ int ct=0; /*输入计数

C Primer Plus 第7章 C控制语句:分支和跳转 7.6 continue和break

我的梦境 提交于 2019-12-06 05:49:53
7.6.1 continue语句 该语句可以用于三种循环形式 。 当运行到该语句时, 它将导致剩余的迭代部分被忽略,并开始下一次的迭代。 如果continue语句处于嵌套结构中,它仅仅影响它的最里层的结构。 程序清单7.9 skippart.c /*skippart.c--使用continue跳过部分循环*/ #include <stdio.h> int main (void) { const float MIN = 0.0f; const float MAX = 100.0f; float score; float total = 0.0f; int n = 0; float min = MAX; float max = MIN; printf("Enter the first score (q to quit):"); while(scanf("%f",&score)==1) { if(score<MIN || score>MAX) { printf("%0.1f is an invalid value.Try again:",score); continue; } printf("Accepting %0.1f: \n",score); min = (score<min)?score:min; max = (score>max)?score:max; total +=

C Primer Plus 第8章 字符输入/输出和输入确认 8.7 菜单浏览

人盡茶涼 提交于 2019-12-05 20:55:56
8.7.1 任务 我们来更具体的考虑菜单程序需要执行的任务。该程序需要获取用户的响应,并且需要基于该响应选择一系列的动作。而且,程序还应该提供一种方法让用户可以回到菜单以做更多的选择。C的switch语句是筛选动作的一个很方便的工具,因为每个用户选择可对应于一个特定的case标签。可以使用while语句来提供对菜单的重复访问。可以使用伪代码按照下列方式描述该过程: get choice while choice is not 'q' switch to desired chice and execute it get next choice 8.7.2 使执行更顺利 程序顺利执行的目标:处理正确输入时顺利执行和处理错误输入时顺利执行。 例如,您能做的一件事是让“获取选项”部分筛选掉不合适的响应,从而仅使正确的响应被传送到switch语句。这表明须为输入过程提供一个只返回正确响应的函数。将其与while循环、switch语句相结合会产生下列的程序结构: #include <stdio.h> char get_choice (void); void count(void); int main(void) { int choice ; while((choice=get_choice())!='q') { switch(choice) { case 'a' : printf("Buy

C Primer Plus 第8章 字符输入/输出和输入确认 8.3 重定向和文件

本小妞迷上赌 提交于 2019-12-04 23:42:38
输入和输出涉及到函数、数据和设备。例如,考虑echo_eof.c程序。该程序使用了输入函数getchar()、输入设备(我们已经假设)是键盘,输入数据流由单独的字符组成。假设您希望保持相同的输入函数和相同的类型的数据,但希望改变程序寻找数据的位置。“程序如何了解在哪里寻找其输入?” 默认情况下,使用标准I/O包的C程序将标准输入作为其输入源 。这就是前面标识为stdin的流。该流是作为向计算机中读取数据的常规方式而建立的。一台现代的计算机是一个灵活的工具,您可能指示它到其他地方寻求输入。特别地,您可以告诉一个程序从文件而不是键盘寻求其输入。 令程序与文件一同工作有两种方式。 一种方式是明确的使用打开文件、关闭文件、读文件、写文件等专门的函数。 这种方法我们在第13章中讨论。 第二种方式是使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向(redirect)输入和输出,例如输入到文件和从文件中输出。 换句话说,就是您将stdin流重新分配至文件。getchar()程序继续从该流中取数据,而不真正关心流是从何处获取其数据。这种方法比第一种方法在一此方面功能更有限,但它更容易使用,而且使您能够更加熟悉常用的文件处理技术。 重定向的一个主要问题是其与操作系统而不是C相关联。 Unix、Linux和Dos重定向 一、输入重定向 假设您已经编译了echo_eof.c程序

C Primer Plus 第8章 字符输入/输出和输入确认 8.5 创建更友好的界面

家住魔仙堡 提交于 2019-12-04 23:42:28
8.5.1 使用缓冲输入 问题在于缓冲输入需要您按下回车键来提交您的输入。这一动作还传输一个程序必须处理的换行符。您必须使程序至少能够处理这种情况 。 程序清单8.4 guess.c程序 /*guess.c--一个低效且错误的猜数程序*/ #include <stdio.h> int main (void) { int guess=1; char response; /*添加一个char变量存储响应*/ printf("Pick an integer from 1 to 100.I will try to guess "); printf("it.\nRespond with a y if my guess is right and with"); printf("\nan n if it is wrong.\n"); printf("uh...is your number %d?\n",guess); while ((response = getchar())!='y') /*获取用户响应并和y进行比较*/ { if (response=='n') /*if else 来区别字符n和以个的字符*/ printf("Well,then,is it %d\n",++guess); else printf("Sorry,I understand only y or n.\n");

C Primer Plus 第8章 字符输入/输出和输入确认 8.6 输入确认

寵の児 提交于 2019-12-03 21:41:00
程序清单8.7 使用两个函数来向一个算术函数传送整数,该函数计算特定范围内所有整数的平方和。程序限制这个特定范围的上界不应该超过1000,下界不应该小于-1000。 /*checking.c --输入确认*/ #include <stdio.h> #include <stdbool.h> //确认输入了一个整数 int get_int(void); //确认范围的上下界是否有效 bool bad_limits (int begin,int end,int low,int high); //计算从a到b之间的整数的平方和 double sum_squares(int a,int b); int main (void) { const int MIN = -1000; //范围的下界限制 const int MAX = +1000; //范围的上界限制 int start; //范围的下界 int stop; //范围的上界 double answer; printf("This program computes the sum of the squares of " "integers in a range.\nThe lower bound should not " "be less than -1000 and \nthe upper bound should not " "be

C Primer Plus 第9章 函数 9.1 函数概述

不打扰是莪最后的温柔 提交于 2019-12-02 18:10:23
9.1 函数概述 首先,什么是函数? 函数(funcation)是用于完成特定任务的程序代码的自包含单元 。 为什么使用函数?第一, 函数的使用可以省去重复代码的编写 。第二,即使某种功能在程序中只使用一次,将其以函数的形式实现也是有必要的, 因为函数使得程序更加模块化,从而有利于程序的阅读、修改和完善。 许多程序员喜欢把函数看作“黑盒子”,即对应一定的输入会产生特定的结果或返回某个数值,而黑盒子的内部行为并不需要考虑,除非是该函数的编写者。以这种方式看待函数 有助于把精力投入到程序整体设计而不是其实现细节 。因此,编写函数代码之前 首先要考虑的是函数的功能 以及函数和程序整体上的关系 。 9.11 编写和使用一个简单的函数 编写一个在一行中输出40个星号的函数,然后我们使用该函数打印一个简单的信头。程序清单9.1给出了完整的程序,它由main()函数和starbar()函数组成。 程序清单 9.1 lethead1.c程序 /*lethead1.c*/ #include <stdio.h> #define NAME "GIGATHINK,INC." #define ADDRESS "101 Megabuck plaza" #define PLACE "Megapolis,CA 94904" #define WIDTH 40 void starbar(void); /*声明函数原型