1.6 数组
编写一个程序,以统计各个数字、空白符(包括空格符、制表符及换行符)以及所有其他字符的出现次数。
所有的输入字符可以分成12类,因此可以用一个数组存放各个数字出现的次数,这样比使用10个独立的变量更方便。
版本一:
#include <stdio.h>
/*统计各个数字、空白符以及其他字符出现的次数*/
int main()
{
int c,i,nwhite,nother; //定义变量
int ndigit[10]; //定义数组,用以记录数字出现的次数
nwhite = nother = 0; //初始化变量空白符和其他字符出现的次数为0
for(i=0;i<10;i++)
{
ndigit[i]=0; //遍历数组,使每个数组值都为0
}
while((c=getchar()) != EOF)
if(c >= '0' or c <='9')
++ndigit[c-'0']; //在asc码中'0'对应的值为48,'5'对应于53,故53-48=5,ndigit[5]+=ndigit[5]
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits =");
for(i = 0;i < 10;i++)
printf("%d",ndigit[i]);//遍历数组,输出他们的次数
printf(",white space = %d, other = %d\n",nwhite,nother);
}
1.7 函数
现在通过编写一个求幂的函数power(m,n)来说明函数定义的方法
# include <stdio.h>
int power(int m,int n); //声明函数
/*测试power函数*/
int main()
{
int i;
for (i = 0; i < 10; i++) {
printf("%d %d %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 = 0; i <= n; i++) {
p = p * base;
}
return p;
}
1.8 参数——传值调用
才C语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。
才C语言中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
上例中的power函数就利用了这一性质。
int power(int base,int n)
{
int i,p;
p=1;
for (i = 0; i <= n; i++) {
p = p * base;
}
return p;
}
1.9 字符数组
字符数组是C语言中最常用的数组类型。
编写一个程序,该程序读入一组文本行,并把最长的文本行打印出来。
该算法的基本框架:
while (还有未处理的行)
if(该行比已处理的最长行还要长)
保存该行
保存该行长度
打印最长行
# include <stdio.h>
#define MAXLINE 1000//宏定义
int getline(char line[],int maxline); //声明获取行长度的函数
void copy(char to[],char from[]); //声明拷贝行的函数
/*打印最长的输入行*/
int main()
{
int len; //当前行长度
int max; //目前为止发现最长行的长度
char line[MAXLINE]; //当前的输入行
char longest[MAXLINE]; //用于保存最长的行
max=0; //初始化最长行为0
while ((len = getline(line,MAXLINE)) > 0)
if (len > max){
max = len;
copy(longest,line);
}
if (max > 0)
printf("%s",longest);
return 0;
}
/*将一行读入s中,并返回该行长度*/
int getline(char s[],int lim) //函数定义。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]='\n';
return i;
}
void copy(char to[],char from[])
{
int i;
i=0;
while ((to[i] = from[i]) != '\0')
++i;
}