签到

05月07日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知