您的位置:首页 > 其它

The C programming language --第一章 基本概念读书笔记

2011-07-19 14:48 429 查看
1、只要printf语句的每个变元的%d中指明打印长度,则打印的数字会在打印区域内右对齐。%-d左对齐
2、在所有可以使用某个类型的变量的值的地方都可以使用该类型更复杂的表达式。赋值语句是一个表达式,其值是赋值后位于=左边变量的值。换言之,赋值语句可以作为更大的表达式的一部分出现。
3、EOF(End of File 文件结束符) 是一个在《stdio.h》中定义的整数,各系统可能有差异,我系统中定义为-1.#define EOF (-1).
在linux/Unix中 EOF 是ctrl+d 在windows中是ctrl+z。
4、赋值运算符的结合性是从右至左。如a=b=c=0 相当于 a=(b=(c=0)) .一般说,除单目、赋值和条件运算符是自右向左结合外,其余都是自左向右结合性的.
5、数组下标可以是任何整数表达式,包括整数变量(如i)与整数常量;关键词return后可以跟任何表达式,函数不一定都返回一个值。不含表达式的r e t u r n语句用于使控制返回调用者(但不返回有用的值),如同在达到函数的终结右花括号时“脱离函数”一样。函数原型中的参数名是可有可无的。如int power(int,int);
6、C语言中的数学函数 pow 其原型为 double pow( double x, double y ); 头文件:math.h 功能:计算x的y次幂。 返回值:x应大于零,返回幂指数的结果。
7、函数定义的一般形式为:
返回值类型 函数名(可能有的参数说明)
{
说明序列
语句序列
}
8、在C语言中,所有函数变元都是“按值”传递的,被调用函数不能直接更改调用函数中变量的值,它只能更改其私有临时拷贝的值。在必要时,也可以在对函数改写,使之可以修改调用例程中的变量。此时调用者要向被调用函数提供所要改变值的变量的地址(从技术角度看,地址就是指向变量的指针),而被调用函数则要把对应的参数说明成指针类型,并通过它间接访问变量。但要注意一个特殊情况:当把数组名用作变元时,传递给函数的值是数组开始处的位置或地址—不是数组元素的副本。在被调用函数中可以通过数组下标来访问或改变数组元素的值。


9、 由于自动变量(局部变量)只在函数调用执行期间存在,故在函数的两次调用期间自动变量不保留在前次调用时所赋的值,且在函数的每次调用执行时都要显式给其赋初值。如果没有给自动变量赋初值,那么其中所存放的是无用数据。
由于外部变量可以全局访问,因此可以用外部变量代替变元表用于在函数间交换数据。而且,外部变量在程序执行期间一直存在,而不是在函数调用时产生、在函数执行完时消失,即使从为其赋值的函数返回后仍保留原来的值不变。外部变量必须在所有函数之外定义,且只能定义一次,定义的目的是为之分配存储单元,在每一个函数中都要对所要访问的外部变量进行说明,说明所使用外部变量的类型。在说明时可以用extern语句显式指明,也可以通过上下文隐式说明。事实上,比较常用的做法是把所有外部变量的定义放在源文件的开始处,这样就可以省略extern说明。
“定义”指变量建立或分配存储单元的位置,而“说明”则指指明变量性质的位置,但并不分配存储单元。


习题选摘
1-9 编写一个程序,把它的输入复制到输出,并在此过程中将相连的多个空格用一个空格代替。
解法一:思路:利用变量控制,若连续空格多于一个,就跳过不输出。

#include<stdio.h>

int main()
{
int c;
int space=0;
while((c=getchar())!=EOF)
{
if(c==' ')
if(space==1) space=1;
else
{  putchar(c);space=1;}
else
{  putchar(c);space=0;}

}
putchar('\n');
return 0;

}

解法二:利用字符数组接收去空格

#include <stdio.h>
#include <string.h>

int main()
{
char s[256];
gets(s);
int i,len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]==' ')
{
printf(" ");
while(s[i+1]==' ')
{
i++;
}
}
else
{
printf("%c",s[i]);
}
}
return 0;
}

下面这个是个统计行数、单词数与字符数的程序,觉得很实用,思想很好。
#define IN 1 /* 在单词内*/
#define OUT 0 /* 在单词外*/
/* 统计输入的行数、单词数与字符数*/
main ( )
{
int c, nl, nw, nc, state;
/*state变量用于记录程序是否正在处理一个单词(是否在一个单词中),它的初值是“不>在单词中”,即被赋初值为O U T。*/
state = OUT;
nl = nw = nc = 0;
while ( (c = getchar ( ) ) != EOF ) {
++nc;
if ( c =='\n' )
++nl;
if ( c == ' ' ||c == '\n' || c == '\t' )
state = OUT;
else if ( state == OUT ) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}

练习1 - 11 你准备怎样测试单词计数程序?如果程序中出现任何错误,那么什么样的输入最有利于发现这些错误?
答:那些满足边界条件的输入情况最有助于发现单词计数程序中的错误。这些边界条件包括:
——没有输入;
——没有单词(只有换行符)
——没有单词(只有空格、制表符和换行符)
——每个单词各占一行(没有空格和制表符)
——单词出现于文本行行首的情况
——单词出现于一串空格之后的情况
练习1-12 编写一个程序,以每行一个单词的形式打印输入.(单词是一个不包含空格,制表符或换行符的字符序列)
解法一:思路--字符不是空白字符就打印出来,如果一个单词已到结尾就打印一个换行符。可以这样判断一个单词是否到结尾:前一个字符是单词的组成部分,当前字符不是单词的组成部分。
#include <stdio.h>

#define IN  1 /*在单词内部*/
#define  OUT 0 /*在单词外部*/

int main()
{
int c,pre,curr;
pre=curr=OUT;
while((c=getchar())!=EOF)
{
if(c==' '||c=='\t'||c=='\n')
{  pre=curr;
curr=OUT;
//判断是否遇到单词结尾,若遇到结尾便输出空格
if(pre==IN&&curr==OUT)
putchar('\n');
}

else {
pre=curr;
curr=IN;
putchar(c);

}
}
return 0;
}

解法二:思路:利用数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: