- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的程序来自“C 答案书”的练习 1-13。这是为了理解和自学。
<小时/>我为下面的问题做好了准备:
<小时/>#define MAXWORD 11
<小时/>
数组 wl[ ] 的元素被初始化为零。
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
如果字长大于零且小于最大值,则将它们存储在数组中。
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
...
}
下面的循环从 i = 1 开始。为什么 wl[1] 打印出看似 wl[0] 的内容?
/* PRINT COUNTER HEADER */
for (i = i; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
...
}
<小时/>
额外信用!
请教我如何自己找到您的答案。
<小时/>i = 0 时的输出
0 - 0 :
1 - 111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
<小时/>
i = 1 时的输出
1 - 111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
<小时/>
完整的源代码:
/* Write a program to print a histogram of the lengths of words in
* its input. It is easy to draw the histogram with the bars horizontal; a vertical
* orientation is more challenging.
*
* 1 | ***
* 2 | ****
* 3 | ******
* 4 | *********
* 5 | **
* X | **********
*
* There were 7 words greater than 11 character.
* --------------------------------------------- */
#include <stdio.h>
#define MAXHIST 15 /* max length of histogram */
#define MAXWORD 11 /* max length of a word */
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* print horizontal histogram */
int
main(void)
{
int c, i, nc, state;
int len; /* length of each bar */
int maxvalue; /* maximum value for wl[] */
int ovflow; /* number of overflow words */
int wl[MAXWORD]; /* word length counters */
state = OUT;
nc = 0; /* number of chars in a word */
ovflow = 0; /* number of overflow words */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
/* READ CHARACTERS UNTIL EOF */
while ( (c = getchar() ) != EOF) {
/* IF BLANK FOUND */
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT;
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
nc = 0;
}
/* NEW WORD FOUND */
else if (state == OUT) {
state = IN;
nc = 1; /* beginning of a new word */
}
/* SAME WORD FOUND */
else {
++nc; /* inside a word */
}
}
maxvalue = 0;
/* FIND LARGEST WORD */
for (i = 1; i < MAXWORD; ++i) {
if (wl[i] > maxvalue) {
maxvalue = wl[i];
}
}
/* PRINT COUNTER HEADER */
for (i = 1; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
/* FIND A COUNTER */
if (wl[i] > 0) {
/* SCALE ITS HISTOGRAM */
if ( (len = wl[i] * MAXHIST / maxvalue) <= 0) {
len = 1;
}
}
/* NO COUNTER FOUND */
else {
len = 0;
}
/* PRINT COUNTER LENGTH */
while (len > 0) {
putchar('*');
--len;
}
putchar('\n');
}
/* PRINT OVERFLOW COUNT */
if (ovflow > 0) {
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}
return 0;
}
最佳答案
代码运行良好:wl
存储长度等于或小于 10 的单词计数(wl[1]
长度为 1 的单词数, wl[2]
长度为 2 的单词数,等等),因此 wl[0]
始终为 0,因为不存在长度为 0 的单词。
有时,当您使用数组时,您想忘记数组的位置从 0 到 n-1,并简化代码的其他部分,这就是这里发生的情况。
这就是它如何处理索引 0
#define MAXWORD 10 /* max length of a word */
...
int wl[MAXWORD]; /* word length counters */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
...
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc - 1];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
...
for (i = 0; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i+1, wl[i]);
...
}
++wl[nc - 1];
和 printf("%5d - %5d : ", i+1, wl[i]);
很少见并且很难理解这个例子。代码没问题,但是为了澄清我认为作者试图做的事情,我会建议这个
#define MAXWORD 10 /* max length of a word */
...
int wl[MAXWORD + 1]; /* word length counters */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 1; i < MAXWORD; ++i) {
wl[i] = 0;
}
...
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
...
for (i = 1; i <= MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
...
}
关于c - 为什么 arr[1] 打印的内容看起来像是 arr[0] ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111870/
这个问题在这里已经有了答案: Unexpected result with `in` operator chaining (1 个回答) Chaining "is" operators (4 个回答)
我想知道为什么下面的代码会崩溃。 int main( ) { int arr = 1 && arr; return 0; } 但不是下面的代码 int main( ) {
什么是计算一组数字平均值的更准确方法,ARR[0]/N+ARR[1]/N...+ARR[N-1]/N 或 (ARR[0]+ARR[1]...+ARR[N-1])/N? (ARR 是一组数字,N 是该组
#include using namespace std; int main() { int arr[5] = {5, 8, 1, 3, 6}; int len = *(&arr +
在下面的代码中,是什么意思 vector avector (arr, arr + sizeof(arr) / sizeof(arr[0]) ); 在 main() 中? vector bubbleSo
我主要是这样使用的: arr.push(element) 但我见过有人这样使用: arr.push.apply(arr, element) 这两种方法有什么区别? 最佳答案 我认为在使用“列表”时更常
任务是重新排列一个数组,使 arr[i] 变成 arr[arr[i]],复杂度为 O(1)额外的空间。 例子: 2 1 3 5 4 0 变成: 3 1 5 0 4 2 我可以想到一个O(n²) 的解决
今天我来了一篇 Eric Lippert 的文章他试图澄清运算符优先级和评估顺序之间的迷思。最后有两个代码片段让我感到困惑,这是第一个片段: int[] arr = {0};
view和copy的意思是不同的,如果你有一个view,那么如果你改变1另一个也应该改变,如果你有一个副本那么改变1应该不会影响另一个 有 3 种制作 view 的方法/copy数组的 arr_2 =
这个问题在这里已经有了答案: How does *(&arr + 1) - arr give the length in elements of array arr? (3 个回答) Why are
我想将自己的值输入到 20 个大数组中,并将其复制到 2 个 10 个小数组中,然后必须打印第二个数组的值。我收到错误 ArrayIndexOutOfBoundsException 我的代码有什么问题
我是 C++ 新手。我正在尝试实现一个堆栈。我声明 arr默认构造函数中的命名变量。 但是当我编译我的代码时,我收到一条错误消息 'arr' was not declared in this scop
这个问题已经有答案了: Pointers - Difference between Array and Pointer (2 个回答) 已关闭 6 年前。 (C语言)之间有什么区别 int * a i
这个问题已经有答案了: How come an array's address is equal to its value in C? (6 个回答) 已关闭 4 年前。 这两个打印有什么区别,我在两
是一样的 char* s1[size]; 到 char** s2 = malloc(size * sizeof(char*)); 它们有什么区别吗? 最佳答案 理论上,*arr[]和**arr是不同的
我有一个字符串数组 arr[5][8] = {...} (声明了每个字符串),我试图了解 arr[3 的值是什么] - arr[2] 是什么以及它的类型是什么。我无法理解为什么地址之间的差异以字节为单
var arr = [foo,bar,xyz]; arr[arr.indexOf('bar')] = true; 在 JS 中有更简单的方法吗? 最佳答案 你可以只使用对象。 var obj = {f
这个问题在这里已经有了答案: What is the difference when we use array names instead of spread operator? (3 个答案) 关
在修改屏蔽数组中的数据时,我没想到会出现以下行为。似乎可以使用 [] 操作数修改某些值,但不是全部。但是,如果您访问它的数据属性,那么您可以修改所有内容。仅当元组中某个单元格的掩码中存在 True 值
我不明白如何确定以下元素: *(arr+1)[1] - 7 被打印出来。 **(arr+1) - 打印 4。 #include int main() { int arr[3][3]={1,2
我是一名优秀的程序员,十分优秀!