二维字符串数组,你别告诉我你看不懂s[10][10]
垂直就比水平麻烦点,没什么意思。估计有人帮你。我反正对这个问题没兴趣了
垂直就比水平麻烦点,没什么意思。估计有人帮你。我反正对这个问题没兴趣了
#include <stdio.h> #define MAXHIST 15 /* 直方图的最大长度 */ #define MAXWORD 11 /* 输入单词的最大长度 */ #define IN 1 /* 在一个单词内部 */ #define OUT 0 /* 在一个单词外部 */ main() { int c, i, j, nc, state; int maxvalue; /* wl[] 数组里最大的值 */ int ovflow; /* 溢出的词数 */ int wl[MAXWORD]; /* 计算单词长度 */ state = OUT; nc = 0; /* 一个单词的字符数 */ ovflow = 0; /* 单词字符数大于最大长度 */ for (i = 0; i < MAXWORD; ++i) /* 给数组赋值 */ wl[i] = 0; while ( (c = getchar()) != EOF ){ if (c == ' ' || c == '\n' || c == '\t'){ /* 遇到空格,换行,Tab表示一个单词的结束 */ state = OUT; if (nc > 0) /* 单词长度大于0 */ if (nc < MAXWORD) /* 长度小于最大值 */ ++wl[nc]; /* 在相应的单词长度上加1 */ else ++ovflow; /* 大于最大值的单词加1 */ nc = 0; } else if (state = OUT) { /* 是否是单词的开始 */ state = IN; /* 把状态改为在单词内 */ nc = 1; /* 重新开始记录单词数 */ } else ++nc; } maxvalue = 0; for (i = 1; i < MAXWORD; ++i) /* 找出数组里最大的值 */ if (wl[i] > maxvalue) maxvalue = wl[i]; for (i = MAXHIST; i > 0; --i) { /* 打印直方图 */ for (j = 1; j < MAXWORD; ++j) if (wl[j] * MAXHIST / maxvalue >= i) /* 这条语句是什么原理? */ printf("*"); else printf(" "); putchar('\n'); } for (i = 1; i < MAXWORD; ++i) printf("%4d ", i); putchar('\n'); for (i = 1; i < MAXWORD; ++i) printf("%4d ", wl[i]); putchar('\n'); if (ovflow > 0) printf("There are %d words >= %d\n", ovflow, MAXWORD); }
#include <stdio.h> #define MAXHIST 15 /* 直方图的最大长度 */ #define MAXWORD 11 /* 输入单词的最大长度 */ #define IN 1 /* 在一个单词内部 */ #define OUT 0 /* 在一个单词外部 */ main() { int c, i, j, nc, state; int maxvalue; /* wl[] 数组里最大的值 */ int ovflow; /* 溢出的词数 */ int wl[MAXWORD]; /* 计算单词长度 */ state = OUT; nc = 0; /* 一个单词的字符数 */ ovflow = 0; /* 单词字符数大于最大长度 */ for (i = 0; i < MAXWORD; ++i) /* 给数组赋值 */ wl[i] = 0; while ( (c = getchar()) != EOF ){ if (c == ' ' || c == '\n' || c == '\t'){ /* 遇到空格,换行,Tab表示一个单词的结束 */ state = OUT; if (nc > 0) /* 单词长度大于0 */ if (nc < MAXWORD) /* 长度小于最大值 */ ++wl[nc]; /* 在相应的单词长度上加1 */ else ++ovflow; /* 大于最大值的单词加1 */ nc = 0; } else if (state = OUT) { /* 是否是单词的开始 */ state = IN; /* 把状态改为在单词内 */ nc = 1; /* 重新开始记录单词数 */ } else ++nc; } maxvalue = 0; for (i = 1; i < MAXWORD; ++i) /* 找出数组里最大的值 */ if (wl[i] > maxvalue) maxvalue = wl[i]; for (i = MAXHIST; i > 0; --i) { /* 循环最大直方图的次数 15 */ for (j = 1; j < MAXWORD; ++j) /* 每循环一次直方图次数,就循环一回数组的值。判断并输出*或空格,好打印出垂直的直方图 */ if (wl[j] * MAXHIST / maxvalue >= i) /* 这样可可以打印出一个 15*10 的直方图,每次输出一行输出15次 */ printf("*"); /* 这里的计算 是判断是否需要在一个位置输出*号 */ else /* 用单词长度数 × 直方图最大值 / 单词长度最大值 >= 直方图对应的行数 */ printf(" "); /* 大于行数就打印 * 否则打印空格 */ putchar('\n'); /* 在循环完10次后换行,在继续循环下一行 */ } for (i = 1; i < MAXWORD; ++i) printf("%d ", i); putchar('\n'); for (i = 1; i < MAXWORD; ++i) printf("%d ", wl[i]); putchar('\n'); if (ovflow > 0) printf("There are %d words >= %d\n", ovflow, MAXWORD); }
#include <stdio.h> #include <stdbool.h> #include <ctype.h> #define MAX_WORDS 10 int main(void) { int a[MAX_WORDS] = {0}; // 所有单词的最大长度 int max_len = 0; // 输入的单词数 int nwords = 0; int c; int len = 0; bool is_inword = false; bool is_space; while (nwords < MAX_WORDS && (c = getchar())) { is_space = isspace(c); if (is_space && !is_inword) { continue; } else if (is_space) { a[nwords++] = len; if (len > max_len) { max_len = len; } len = 0; if (c == '\n') { break; } } else { ++len; is_inword = true; } } for (int i = max_len; i > 0; --i) { for (int j = 0; j <= nwords; ++j) { if (a[j] >= i) { printf("* "); } else { printf(" "); } } putchar('\n'); } return 0; }
[此贴子已经被作者于2016-7-25 22:08编辑过]
#include <stdio.h> int main(void) { int y, i, j; int x[11]; y = 15; for(i=1; i<11; ++i) x[i] = i; for(i=y; i>0; --i){ for(j=1; j<11; ++j){ if( x[j] >= i ) printf("*"); else printf(" "); } putchar('\n'); } }
#include <stdio.h> #define MAXHIST 15 /* 直方图的最大长度 */ #define MAXWORD 11 /* 输入单词的最大长度 */ #define IN 1 /* 在一个单词内部 */ #define OUT 0 /* 在一个单词外部 */ main() { int c, i, j, nc, state; int maxvalue; /* wl[] 数组里最大的值 */ int ovflow; /* 溢出的词数 */ int wl[MAXWORD]; /* 计算单词长度 */ state = OUT; nc = 0; /* 一个单词的字符数 */ ovflow = 0; /* 单词字符数大于最大长度 */ for (i = 0; i < MAXWORD; ++i) /* 给数组赋值 */ wl[i] = 0; while ( (c = getchar()) != EOF ){ if (c == ' ' || c == '\n' || c == '\t'){ /* 遇到空格,换行,Tab表示一个单词的结束 */ state = OUT; if (nc > 0) /* 单词长度大于0 */ if (nc < MAXWORD) /* 长度小于最大值 */ ++wl[nc]; /* 在相应的单词长度上加1 */ else ++ovflow; /* 大于最大值的单词加1 */ nc = 0; } else if (state = OUT) { /* 是否是单词的开始 */ state = IN; /* 把状态改为在单词内 */ nc = 1; /* 重新开始记录单词数 */ } else ++nc; } maxvalue = 0; for (i = 1; i < MAXWORD; ++i) /* 找出数组里最大的值 */ if (wl[i] > maxvalue) maxvalue = wl[i]; for (i = MAXHIST; i > 0; --i) { /* 循环最大直方图的次数 15 */ for (j = 1; j < MAXWORD; ++j) /* 每循环一次直方图次数,就循环一回数组的值。判断并输出*或空格,好打印出垂直的直方图 */ if (wl[j] * MAXHIST / maxvalue >= i) /* 这样可可以打印出一个 15*10 的直方图,每次输出一行输出15次 */ printf("*"); /* 这里的计算 是判断是否需要在一个位置输出*号 */ else /* 用单词长度数 × 直方图最大值 / 单词长度最大值 >= 直方图对应的行数 */ printf(" "); /* 大于行数就打印 * 否则打印空格 */ putchar('\n'); /* 在循环完10次后换行,在继续循环下一行 */ } for (i = 1; i < MAXWORD; ++i) printf("%d ", i); putchar('\n'); for (i = 1; i < MAXWORD; ++i) printf("%d ", wl[i]); putchar('\n'); if (ovflow > 0) printf("There are %d words >= %d\n", ovflow, MAXWORD); }
[此贴子已经被作者于2016-7-26 23:56编辑过]
#include <stdio.h> #include <ctype.h> int main(void) { int y, i, j, c, max, nc, test; int x[11]; y = 15; test = 0; nc = 0; for(i=1; i<11; ++i) x[i] = 0; //x[1] = 1; //x[2] = 2; //x[3] = 1; while ((c=getchar()) != EOF ){ if(isalpha(c)){ ++nc; test = 1; } else { if(test == 1){ ++x[nc]; nc = 0; test = 0; } } } max = 0; for(i = 1; i < 11; ++i) if (x[i] > max) max = x[i]; for(i=y; i>0; --i){ for(j=1; j<11; ++j){ //if( (x[j]*15/max) >= i ) /* 主要就是改动这两个表达式,它的直方图就完全不一样了 */ if (x[j] >= i) printf("* "); else printf(" "); } putchar('\n'); } }