c程序设计语言已经大体的看完一遍,由于看的断断续续,导致一些早起看过的知识点有所遗忘。今天重头开始把例程和习题重新写一遍,以加深印象。
引言
引言部分有四句话引起了我的注意:
1,指针提供了与具体机器无关的地址算术运算。
2,函数可以返回基本类型,结构,联合或者指针类型的值。
3,程序员有理由期望了解、理解并真正彻底使用完整的语言。
4,唯一的要求是程序员要明确的表达他们的意图。
前两句概括了指针与函数的根本概念,后两句描述c语言的特性。
第一章,导言
划线总结
1,函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称谓参数)列表。函数传参为值传递。
2,在c语言中,所有的变量都必须先声明后使用。
3,c语言提供了一些基本数据类型,还存在这些基本数据类型的数组,结构,联合,只想这些类型的指针以及返回这些类型值的函数。
4,在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。
5,处理幻数的一种方法是富裕他们有意义的名字。#define指令可以把符号名定义为一个特定的字符串。
6,EOF(end of file,文件结束),定义在头文件<stdio.h>中。
7,赋值操作是一个表达式,并且具有一个值,即复制后左边变量保存的值。复制可以作为更大的表达式的一部分出现。
8,!=的优先级比=的优先级高。
9,函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑他是如何实现的。使用设计正确的函数,只需要知道他具有哪些功能就够了。
例程:
1.5.1文件复制:把输入一次一个字符地复制到输出
基本思想:
读一个字符
While(该字符不是文件结束指示符)
输出刚读入的字符
读下一个字符
将基本思想转换为c语言程序为:
#include<stdio.h>
/* 将输入复制到输出:版本1*/
int main()
{
int c;
c = getchar();
while ( c != EOF )
{
putchar(c);
c = getchar();
}
return 0;
}
如果将c赋值的操作放在while循环语句的测试部分中,可改写为下列形式。
#include<stdio.h>
/* 将输入复制到输出:版本2*/
int main()
{
int c;
while ( (c = getchar()) != EOF )
{
putchar(c);
}
return 0;
}
1.5.2字符计数
#include<stdio.h>
/* 统计输入的字符数:版本1*/
int main()
{
long nc;
while ( getchar() != EOF )
nc++;
printf("%ld\n",nc);
return 0;
}
改用for循环
#include<stdio.h>
/* 统计输入的字符数:版本2*/
int main()
{
double nc;
for(nc = 0;getchar() != EOF;nc++);
printf("%.0f\n",nc);
return 0;
}
1.5.4单词计数:unix系统wc程序骨干
#include<stdio.h>
#define IN 1 //在单词内
#define OUT 0 //在单词外
//统计输入的行数,单词数和字符数
int main()
{
int c,nl,nw,nc,state;
state = OUT;
nl = nw = nc = 0;
while((c = getchar()) != EOF)
{
nc++;
if(c == '\n') nl++;
if(c == ' '||c == '\t'||c == '\n')
state = OUT;
else if(state == OUT)
{
state = IN;
nw++;
}
}
printf("%d,%d,%d\n",nl,nw,nc);
return 0;
}
1.6统计一个字符是数字,空白符还是其他:
if(c >= '0'&&c <='9')
ndigit[c-'0'];
else if(c == ' '||c == '\n'||c == '\t')
nwhite++;
else
nother++;
1.7求幂的函数power(m,n),标准库中提供了计算x^y的函数:pow(x,y)。
#include<stdio.h>
int power(int m,int n);
//测试power函数
int main()
{
int i;
for(i = 0;i<10;i++)
printf("%d\t%d\t%d\n",i,power(2,i),power(-3,i));
return 0;
}
//power函数:求底数的n次幂;其中n>=0
int power(int base,int n)
{
int i,p;
p = 1;
for(i = 1;i <= n;i++)
p *= base;
return p;
}
1.9字符数组:读入一组问本行,并打印最长文本
While(还有未处理的行)
If(比最长行还要长)
保存该行
保存该行的长度
打印最长的行
首先编写一个独立函数getline():读取输入的下一行,遇到文件结束符返回0,其余返回长度。并需要另一个函数copy()把新行复制到安全位置。
#include<stdio.h>
#define MAXLINE 1000 //允许输入行的最大长度
int mygetline(char line[],int maxline);
void copy(char to[],char from[]);
//打印最长的输入行
int main()
{
int len,max; //当前行和最长行的长度
char line[MAXLINE],longest[MAXLINE]; //输入的当前行和用于保存最长的行
max = 0;
while((len = mygetline(line,MAXLINE)) > 0)
if(len > max)
{
max = len;
copy(longest,line);
}
if(max > 0)
printf("%s\n",longest);
return 0;
}
//mygetline函数:将一行读入到s中并返回其长度
int mygetline(char s[],int lim)
{
int c,i;
for(i = 0;i <lim - 1 && (c = getchar()) != EOF && c != '\n';i++)
s[i] = c;
if(c == '\n')
{
s[i] = c;
i++;
}
s[i] = '\0';
return i;
}
//copy函数
void copy(char to[],char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
i++;
}
1.10外部变量
#include<stdio.h>
#define MAXLINE 1000 //允许输入行的最大长度
int max;
char line[MAXLINE];
char longest[MAXLINE];
int mygetline(void);
void copy(void);
//打印最长的输入行
int main()
{
int len; //当前行
extern int max; //最长行的长度
extern char longest[]; //用于保存最长的行
max = 0;
while((len = mygetline()) > 0)
if(len > max)
{
max = len;
copy();
}
if(max > 0)
printf("%s\n",longest);
return 0;
}
//mygetline函数:将一行读入到s中并返回其长度
int mygetline(void)
{
int c,i;
extern char line[];
for(i = 0;i <MAXLINE - 1 && (c = getchar()) != EOF && c != '\n';i++)
line[i] = c;
if(c == '\n')
{
line[i] = c;
i++;
}
line[i] = '\0';
return i;
}
//copy函数
void copy(void)
{
int i;
extern char line[],longest[];
i = 0;
while((longest[i] = line[i]) != '\0')
i++;
}