共有回帖数  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号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知