共有回帖数 0 个
-
现在我看这三本书学C语言基础。
k&r的"The C Programming Language"及其答案书,英文原版,清华大学出版社,23元+12元=35元。 谭浩强的<C语言程序设计>,第一版,24元。
k&r的书很有趣,满载了有趣、有启发性、有用的程序实例,但是对于初学者有点太难了,很多地方翻开谭老写的相关章节会易理解很多。
而只看谭老的书又太枯燥了,他的书把道理说明白了,可是缺乏启发性,看了没有编程的冲动。
现在我是主要看k&r,谭老作参考。
-------------------------------
k&r的第一章是综合介绍,每一节都给出有趣的完整的例程,从最经典的HelloWorld程序到cat到wc到C语言语法检查程序。 这些例程对初学者来说有点难,我硬着头皮把第一章的例程都运行了一遍(不包括答案),开头的还挺有趣,后面的就越来越迷糊了。
在第一章的最后k&r说“我们已经学习了C的基础,这些知识已经可以用来写一些程序了,在学习后面的内容之前,先停下来写些稍长的程序是个好主意”。
说得很有道理,动动手动动脑可以巩固一下所学的知识,刚好我也有了灵感,决定写一个“进制转换”程序。
程序的功能就是把一个n进制的数转换成其它进制数, 例如输入一个10进制数,程序就自动把它转换为 2进制、8进制、16进制。 如果输入一个2进制数,程序就自动把它转换成 10进制、8进制、16进制。
这样一个程序不会太难,但对我也有一定难度(事实上后来发现对我来说是挺难的了),做出来之后也有一定用途。
写了几天,现在已经把主要的几个函数解决了 我的数学很差,自己写了一个n进制转10进制的算法,写得丑,自己看着都不舒服。后来很巧我买的一本“C语言实用程序设计100例”里有这种算法,我就拿来用了,看着舒服多了。但是它对10进制以上要用字母表示数字的情况无能为力,我对这个程序的最大贡献就是解决了这个问题��
/* 进制转换程序 ConvertNumber Version 0.5.2 #20060210
* a Bunki program. Kikistar SoftStyle.
* All Rights Died, All Freedom Reserved.
* http://kikistar.com
* E-mail: kikistar.com@gmail.com
*/
#include stdio.h
#include stdlib.h /* the strtol(), k&r p252 */
#include ctype.h
#include string.h
char getindex(int n);
int getnumber(char stringin[], int base);
void intton(int numin, int baseout, char numout[]);
void goback(void);
void printwarn(void);
main()
{
int numberin;
char stringin[30];
int basein, baseout, e;
char numberout[30];
printf("n");
printf("进制转换 ConverNumber 0.5.2n");
printf("---------------------------------------------------n");
printf("| 本程序用以对数字进行进制转换。 |n");
printf("| |n");
printf("| 请先选择一种进制,然后输入一个数字, |n");
printf("| 我会把这个数字转换成其它进制数。 |n");
printf("---------------------------------------------------n");
e = 1;
while (e == 1) {
printf("nttA. 十进制t(10)n");
printf("ttB. 十六进制t(16)n");
printf("ttC. 八进制t(8)n");
printf("ttD. 二进制t(2)n");
printf("nttE. 安全出口n");
printf("n请输入以上选项前的一个字母(然后按回车键):");
switch (getindex(1)) {
case 'a': case 'A':
printf("n请输入一个十进制数:");
numberin = getnumber(stringin, 10);
if (numberin 0)
break;
if (numberin == 2147483647)
printwarn();
printf("ntt %d (10)n", numberin);
intton(numberin, 16, numberout);
printf("tt= %s (16)n", numberout);
intton(numberin, 8, numberout);
printf("tt= %s (8)n", numberout);
intton(numberin, 2, numberout);
printf("tt= %s (2)nn", numberout);
goback();
break;
case 'b': case 'B':
printf("n请输入一个十六进制数:");
numberin = getnumber(stringin, 16);
if (numberin 0)
break;
numberin = strtol(stringin, NULL, 16);
if (numberin == 2147483647){
printwarn();
strcpy(stringin, "7FFFFFFF (一个 '7' 和七个 'F'.)");
}
printf("ntt %s (16)n", stringin);
printf("tt= %ld (10)n", numberin);
intton(numberin, 8, numberout);
printf("tt= %s (8)n", numberout);
intton(numberin, 2, numberout);
printf("tt= %s (2)nn", numberout);
goback();
break;
case 'c': case 'C':
printf("n请输入一个八进制数:");
numberin = getnumber(stringin, 8);
if (numberin 0)
break;
if (numberin == 2147483647){
printwarn();
strcpy(stringin, "17777777777 (一个 '1' 和十个 '7'.)");
}
printf("ntt %s (8)n", stringin);
numberin = strtol(stringin, NULL, 8);
printf("tt= %ld (10)n", numberin);
intton(numberin, 16, numberout);
printf("tt= %s (16)n", numberout);
intton(numberin, 2, numberout);
printf("tt= %s (2)nn", numberout);
goback();
break;
case 'd': case 'D':
printf("n请输入一个二进制数:");
numberin = getnumber(stringin, 2);
if (numberin 0)
break;
if (numberin == 2147483647){
printwarn();
strcpy(stringin, "1111111111111111111111111111111 (三十一个 “1”。)");
}
printf("ntt %s (2)n", stringin);
numberin = strtol(stringin, NULL, 2);
printf("tt= %ld (10)n", numberin);
intton(numberin, 16, numberout);
printf("tt= %s (16)n", numberout);
intton(numberin, 8, numberout);
printf("tt= %s (8)nn", numberout);
goback();
break;
case 'e': case 'E':
e = 0;
break;
default :
printf("n7");
printf("t----------------------------------------------------------n");
printf("t| Error! |n");
printf("t| 请输入一个字母 'i', 'h', 'o', 'b', 或 'e' |n");
printf("t| 然后按回车键。 |n");
printf("t----------------------------------------------------------n");
break;
}
}
printf("nt感谢你使用本程序!欢迎来blog来mail交流。n");
printf("thttp://my.opera.com/419/n");
printf("tkikistar.com@gmail.comnn");
return 0;
}
char getindex(int width)
{
int i;
char index, index2;
/* 过滤所输入的全部char,记录第一个 */ /* k&r p18 */
for (i=1; (index2 = getchar()) != 'n'; ++i)
if (i == 1)
index = index2;
/* i-1 to take away 'n'. Use this sentence to control the width of index.
* for this time, more than one charater or just enter Enter is invaild
* and return ' ' */
if (i - 1 != width)
index = ' ';
return index;
}
int getnumber(char stringin[], int base)
{
char number[1000];
char wrong;
int i, j;
j = 0;
for (i=0; ((number=getchar()) != 'n'); ++i)
if (base = 2 && base = 10) {
if (number '0' || number = base+'0'){
wrong = number;
j = 1;
}
}
else if (base = 11 && base = 36) {
if (!(isxdigit(number)) || toupper(number) = base+'A'){
wrong = number;
j = 1;
}
}
else {
printf("Error03!n");
printf("Sorry, I can only convert a number base from 2 to 36.");
}
if (j == 1) {
printf("n7");
printf("t------------------------------------------n");
printf("t| Error! |n");
if (wrong != '.')
printf("t| %2d进制数里没有 '%c'. |n", base, wrong);
else
printf("t| 不好意思啦,我不会转换带小数点的数字 |n");
printf("t------------------------------------------n");
goback();
return -1;
}
number = ' '; /* k&r p29, p30 */
strcpy(stringin, number);
if (i == 0)
return -1;
else
return atoi(number);
}
/* 算法参考 C语言实用程序设计100例 人民邮电出版社
*
* 本函数把 numin(一个十进制数) 转换成 numout(baseout进制数),
* baseout的范围是2-36
*
/* 用函数的参数“返回”数据,k&r Section 1.9 */
void intton(int numin, int baseout, char numout[])
{
int j, i;
for (i = 0; numin != 0; ++i) {
j = numin % baseout;
if (j 9)
numout = j + 55;
else
numout = j + '0';
numin /= baseout;
}
/* reverses numout[] */ /* k&r Exercise 1-19 */
for (j = 0; j = i/2-1; ++j) {
numout = numout[j];
numout[j] = numout[i-1-j];
numout[i-1-j] = numout;
}
numout = ' '; /* k&r p30 */
}
void goback() {
printf("n 请按回车键继续...n");
while (getchar() != 'n')
;
}
void printwarn()
{
printf("n7");
printf("t--------------------------------------------n");
printf("t| 注意! |n");
printf("t| 以下是数字是我能处理的最大数了。 |n");
printf("t--------------------------------------------n");
}
编译好的文件
http://my.opera.com/419/homes/blog/connum052.zip
楼主 2016-02-04 14:23 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知