C语言学习第六天
1.6 数组
编写一个统计各个数字、空白符(包括空格符、制表符及换行符)以及所有其他字符出现的次数。这个程序的实用意义并不大,但我们可以通过该程序讨论C语言多方面的问题。
所有的输入字符可以分成12类,因此可以用一个数组存放各个数字出现的次数,这样比用10个独立的变量更方便。
#include
/* 统计各个数字、空白符及其他字符出现的次数 */
main() {
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
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);
}
该程序中的声明语句
int ndigit[10];
将变量ndigit声明为由10个整型数构成的数组。在C语言中,数组下标总是从0开始,因此该数组的10个元素分别为ndigit[0]、ndigit[1]、 ...、ndigit[9],这可以通过初始化和打印数组的两个for循环语句反映出来。
数组下标可以时任何整型表达式,包括整型变量(如i)以及整型常量。
由定义可知,char类型的字符时小整型,因此cahr类型的变量和常量在算术表达式中等价于int类型的变量和常量。这样做既自然又方便,例如,c-'0'是一个整型表达式,如果存储在c中的字符时'0'~'9',其值将为0~9,因此可以充当数组ndigit的合法下标。
程序中经常使用下列方式表示多路判定:
if(条件1)
语句1
else if (条件2)
语句2
...
...
else
语句n
在这种方式中,各条件从前往后依次求值,直到满足某个条件,然后执行对应的语句部分。这部分语句执行完成后,整个语句体执行结束。如果所有条件都不满足,则执行位于最后一个else之后的语句(如果有的话)。在第一个if与最后一个else只见可以有0个或多个下列形式的语句序列:
else if (条件)
语句
练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图必较容易绘制,垂直方向的直方图则要困难些。
练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图。
----------------------------------------------------------------------------------------------------
#include
/* 练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图必较容易绘制,垂直方向的直方图则要困难些。 */
main() {
int c, curlword, i, j; // 表示当前输入字符和当前单词长度
int lword[50];
int lwordMax; // 表示单词出现的最大次数
i = j = curlword = lwordMax = 0;
for(i = 0; i < 50; i++) {
lword[i] = 0;
}
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n') {
if (curlword != 0) {
++lword[curlword];
}
curlword = 0;
} else {
curlword++;
}
}
for(i = 0; i < 50; i++) {
if (lword[i] > lwordMax)
lwordMax = lword[i]; // 找出最大值,最大值表示垂直直方图要输出的行数
};
printf("----单词长度水平直方图----\n");
for (i = 0; i < 50; i++) {
if (lword[i]) {
printf("长度%2d|\t", i);
for (j = 0; j < lword[i]; j++) {
printf(" *");
}
printf("\n");
}
}
printf("------| ");
for(i = 0; i < lwordMax; i++) {
printf("---", i);
}
printf("\n");
printf("次数 | ");
for(i = 1; i <= lwordMax; i++) {
printf("%2d", i);
}
printf("\n");
printf("-----------------\n");
printf("----单词长度垂直直方图----\n");
for (i = lwordMax; i > 0; i--) { // i表示图中这一行单词出现次数
printf("次数%2d| ", i);
for (j = 0; j < 50; j++) {
if(lword[j]) // 有统计的此才输出
if(lword[j] < i)
printf(" ");
else
printf(" * "); // 当前单词长度大于等于当前高度
}
printf("\n");
}
printf("------| ");
for(i = 0; i < 50; i++) {
if(lword[i])
printf("---", i);
}
printf("\n");
printf("长度 | ");
for(i = 0; i < 50; i++) {
if(lword[i])
printf("%2d ", i);
}
printf("\n-----------------\n");
}
------------------------------------------------------------------------------------------------------
#include
/* 练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图。*/
main() {
int c, i, j, lcharMax;
int charTime[128]; // 假设只计算a~z,A~Z,0~9字符频度,其他的就太多了
i = j = lcharMax = 0;
for (i = 0; i < 128; i++)
charTime[i] = 0;
while ((c = getchar()) != EOF)
++charTime[c];
for(i = 0; i < 128; i++) {
if (charTime[i] > lcharMax)
lcharMax = charTime[i]; // 找出最大值,最大值表示垂直直方图要输出的行数
};
printf("----字符频度水平直方图----\n");
for (i = 0; i < 128; i++) {
if (charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z')) {
printf("字符%c|\t", i);
for (j = 0; j < charTime[i]; j++) {
printf(" *");
}
printf("\n");
}
}
printf("-----|--");
for(i = 0; i < lcharMax; i++) {
printf("---", i);
}
printf("\n");
printf("次数 | ");
for(i = 1; i <= lcharMax; i++) {
printf("%2d", i);
}
printf("\n");
printf("-----------------\n");
printf("----字符频度垂直直方图----\n");
for (i = lcharMax; i > 0; i--) { // i表示图中这一行单词出现次数
printf("次数%2d| ", i);
for (j = 0; j < 128; j++) {
if(charTime[j] && (j>= '0' && j <= '9' || j >= 'a' && j <= 'z' || j >= 'A' && j <= 'Z')) // 有统计的此才输出
if(charTime[j] < i)
printf(" ");
else
printf(" * "); // 当前单词长度大于等于当前高度
}
printf("\n");
}
printf("------|--");
for(i = 0; i < 128; i++) {
if(charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z'))
printf("---", i);
}
printf("\n");
printf("字符 | ");
for(i = 0; i < 128; i++) {
if(charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z'))
printf(" %c ", i);
}
printf("\n-----------------\n");
}