希望能早点掌握阅读英文原版书的能力,嗯.
这本书买了很长时间了,之前一直没有时间看.
/* 1.2温度转换 */ #include<stdio.h> main(){ //int x = 0; //int fahr; for(int fahr = 0; fahr <= 300; fahr = fahr + 20){ printf("%3d\t %9.1f\t%d\n",fahr, (5.0 / 9.0) * (fahr - 32),&fahr); } /* int lower,upper,step; float fahr,celsius; lower = 0; upper = 300; step = 20; fahr = lower; //printf("华氏\t摄氏\n"); while(fahr <= upper){ celsius = 5 * (fahr - 32) / 9; printf("%3.0f%.2f\n",fahr,celsius); fahr = fahr + step; } */ }
/* 1.4 符号常量 */ #include<stdio.h> #define LOWER 0 #define UPPER 300 #define STEP 20 main3(){ int fahr; for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP){ printf("%3d\t%6.2f\n",fahr,(5.0 / 9.0) * (fahr - 32)); } }
VS的C编辑器好难用,跟ECLIPSE写JAVA的感觉没法比.
/* 1.5 统计字符和行数 */ #include<stdio.h> main(){ long nc; nc = 0; while(getchar() != EOF) ++nc; printf("%ld",nc); int c ; while((c = getchar()) != EOF){ putchar(c); } //putchar(c); printf("EOF != c:%d\n" + (c!=EOF)); printf("EOF:%d\n" , EOF); getchar(); }
很简单的练习,有了编程经验再学这些东西,感觉都知道一样,但有些东西需要再确定一下.
/* 1.5.4单词计数 */ #include<stdio.h> #define IN 1 #define OUT 0 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 == '\n' || c == '\t') state = OUT; else if(state == OUT){ state = IN; ++nw; } } printf("%d\t%d\t%d\n", nl, nw, nc); }
/* 1.6 使用数组统计一些字符的出现字数 */ #include<stdio.h> main(){ int c, i, nwhite, nother; int ndijit[10]; nwhite = nother = 0; for(i = 0; i < 10; ++i) ndijit[i] = 0; while((c = getchar()) != EOF){ if(c >= '0' && c <= '9') ++ndijit[c - '0']; else if( c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; } printf("dijit = "); for(i = 0; i < 10; ++i) printf(" %d",ndijit[i]); printf(", white space = %d,other = %d\n",nwhite, nother); getchar(); }
在考虑要不要改成JAVA式的驼峰命名方式,那个方式更科学啊.但就没有了使用c的感觉了,哈哈
/* 1.9 字符数组,统计最长行的长度 */ #include<stdio.h> #define MAXLINE 10000 int getline(char line[], int maxline); void copy(char to[], char from[]); main(){ int len, max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE)) > 0){ if(len > max){ max = len; copy(longest, line); } } if(max > 0) printf("%s\n", longest); return 0; } int getline(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; } void copy(char to[], char from[]){ int i; i = 0; while((to[i] = from[i]) != '\0') ++i; }
char类型是小整形,是整形的一种,它属于整形.
字符串在内存中以字符数组的形式存储,以'\0'作为字符串结束记号.
发现在上个例子中,while里面的if语句没有带大括号,于是在java里面也试了一下,果然if语句块只算一条语句,一条语句是不需要括起来的.
package com.dh.test; public class MainTest { public static void main(String[] args) { System.out.println("start"); int i = 0; while(true) if(i == 0){ break; } System.out.println("out of while"); } }
外部变量的练习.
/* 1.10 外部变量和作用域 打印最长行 */ #include<stdio.h> #define MAXLINE 1000 int max; char line[MAXLINE], longest[MAXLINE]; int getLine(void); void copy(void); main(){ int len; extern int max; extern char longest[]; max = 0; while((len = getLine()) > 0){ if(len > max){ max = len; copy(); } } if(max > 0) printf("%s\n", longest); //return 0; } int getLine(void){ int c, i; extern char line[]; for(i = 0; i < MAXLINE -1 && (c = getchar()) != EOF && c != '\n'; ++i ) line[i] = c; if(i == '\n'){ line[i] = c; ++i; } line[i] = '\0'; return i; } void copy(void){ int i; extern char line[], longest[]; i = 0; while((longest[i] = line[i]) != '\0') ++i; }
第一章的练习,不明白为什么在同一行字符后面[CTRL + Z]无法结束循环.
/* 练习1-20 TAB替换为空格 */ /* 接受一行输入;如果包含TAB,则计算当前位与TAB结束位的差,替换为空格 */ #include<stdio.h> #define TABLENGTH 8 #define MAXLENGTH 1000 char text[MAXLENGTH]; int getText(void); main(){ extern char text[]; getText(); printf("%s\n",text); } int getText(void){ extern char text[]; int c, i, j; int spaceCount = 0; /* 要填充的空格个数 */ int linePosition = 0; /* 当前行的位置 */ for(i = 0; (i < MAXLENGTH - 1) && (c = getchar()) != EOF; ++i){ printf("value of c:%d\n" , c); if(c == '\n') linePosition = 0; if(c == 't'){ spaceCount = TABLENGTH - (linePosition % TABLENGTH); } if(spaceCount > 0){ for(j = 0; j < spaceCount; ++j){ text[i + j] = c; } i += spaceCount; } else text[i] = c; linePosition++; } printf("out of for loop"); }
2013年9月15日0:01:17
大师就是大手笔,连练习都那么费时间.
/* 练习1-21 将空格转换为TAB */ /* while(行未结束){ if(是空格){ if(上个字符不是空格) 记录空格起始位置; if(位置在TAB终止位上) 替换从空格起始位置到该位置的所有空格位TAB字符; } } */ #include<stdio.h> #define MAXLENGTH 1000 #define TABLENGTH 8 void entab(void); char text[MAXLENGTH]; main(){ extern char text[]; entab(); printf("value of tab:%d\n",'\t'); printf("%s",text); return 0; } void entab(){ int ss;//空格起始位置; int i; int cc = 0;//字符计数 char c; extern char text[]; for(i = 0; i < MAXLENGTH -1 && (c = getchar()) != EOF; ++i){ ++cc; text[i] = c; if(c == ' '){ if(i == 0 || text[i - 1] != ' ') ss = i; if(cc % TABLENGTH == TABLENGTH){ text[ss] = '\t'; i = ss; } } } }