| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5800 人关注过本帖
标题:学写程序,先把《Hello,world!》写好
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 34楼 烟雾中的迷茫
自己多弄点数测试一下嘛,长的、短的,必须都能适用,负数也要考虑。

授人以渔,不授人以鱼。
2011-08-01 22:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以字符串返回和直接输出没有什么实质上的差异,看程序是看实质的,不是看无关重要的东西的。34楼的程序有两处毛病,第一是最后多了一个逗号,第二是负数的时候出问题。关键是自己要运行测试(那个putchar('\,')的用法就是错的,明显自己没有运行过,连编译也没通过),不要指靠别人给你测试,这也是程序员应该做到的。

尝试把它写成函数吧,弄规范一点,以后自己可以用。

[ 本帖最后由 TonyDeng 于 2011-8-1 22:23 编辑 ]

授人以渔,不授人以鱼。
2011-08-01 22:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
还有,你为什么不接受0?

授人以渔,不授人以鱼。
2011-08-01 22:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你不去质问printf()为什么允许输出负数?

授人以渔,不授人以鱼。
2011-08-01 22:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 43楼 烟雾中的迷茫
不能这样用两个printf()输出,这次是不合格了。

授人以渔,不授人以鱼。
2011-08-01 22:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
允许用type模式的逐个字符像键盘一样显示,但不允许调用多次整体输出函数。前者是可以移植到字符串即流设备上的,后者是不合规范的动作。

想象一个流设备,它的书写动作只能往前,像打印机那样,不能往返插入、删改。控制台、流设备之类,与屏幕不同,就在这里。所以,我允许你的设计直接向流设备写出,但不允许这样调用printf()也是流输出的函数,因为你自己的函数就是要取代printf()的,这样叫投机取巧,所以不合格。如果要这样,只允许把结果写在字符串中再返回,字符串随便你排序、增删、插入。

授人以渔,不授人以鱼。
2011-08-01 22:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
显示效果不错,但还不符合要求。既用printf()又用putchar()。慢慢改吧,写了之后自己从第三者的角度看待一下,呵呵~

授人以渔,不授人以鱼。
2011-08-01 23:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 49楼 风生钧起
你这是什么东西呀?

授人以渔,不授人以鱼。
2011-08-01 23:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
参考一下吧:

程序代码:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>

char* TransForm(char* p, int iVar);

void main(void)
{
    char cString[1024];

    printf("%s\n", TransForm(cString, 1234567));
    printf("%s\n", TransForm(cString, 0));
    printf("%s\n", TransForm(cString, -1234567));
}

char* TransForm(char* p, int iVar)
{
    int iIndex;            // 循环计数器
    int iCount;            // 千位计数器
    bool lNegative;        // 是否负数的标志
    char* pBuffer = p;    // 记录缓冲区的起始地址(p是动指针, pBuffer是不动的, 用于返回)

    if (iVar == 0)
    {
        // 如果传入的数值为0直接返回"0"
        *p++ = '0';
        *p = '\0';
        return pBuffer;
    }

    lNegative = (iVar < 0);
    if (lNegative)
    {
        iVar = -iVar;    // 取正数计算
    }

    iIndex = 1;
    iCount = 0;
    while (iVar > 0)
    {
        if (iCount < 3)
        {
            iCount++;
        }
        else
        {
            *p++ = ',';
            iCount = 1;
        }
        *p++ = '0' + iVar % 10;
        iVar = iVar / 10;
        iIndex++;
    }
    if (lNegative)        // 补回负数的标识
    {
        *p++ = '-';
    }
    *p = '\0';            // 字符串结束符

    return _strrev(pBuffer);    // 反转缓冲区之后返回
}
// 其实可以不返回缓冲区的地址, 改为返回字符串的字符数, 为0时失败.


改成下面这样好看一点,对比一下:
程序代码:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>

char* TransForm(char cBuffer[], int iVar);

void main(void)
{
    char cString[1024];

    // Hello,world!的翻版
    // 原先是这样写的
    // char cString[] = "Hello,world!";
    // printf("%s\n", cString);
    // 套上面的格式, 成下面这样
    printf("%s\n", TransForm(cString, 1234567));
    printf("%s\n", TransForm(cString, 0));
    printf("%s\n", TransForm(cString, -1234567));
    // 这种套换方式, 是程序语言的基本用法
    // 注意与下面变换对比:
    // printf("%d\n", 1234567);
    // 这样就可以猜到printf()内部的动作了
    // 如果要回避printf(), 可以
    // puts(TransForm(cString, 1234567));
    // 不妨比较前后两种版本(printf()版和puts()版)EXE文件的大小
}

char* TransForm(char cBuffer[], int iVar)
{
    int iIndex;            // 循环计数器
    int iCount;            // 千位计数器
    bool lNegative;        // 是否负数的标志
    char* p = cBuffer;    // 记录缓冲区的起始地址(p是动指针, cBuffer是不动的, 用于返回)

    if (iVar == 0)
    {
        // 如果传入的数值为0直接返回"0"
        *p++ = '0';
        *p = '\0';
        return cBuffer;
    }

    lNegative = (iVar < 0);
    if (lNegative)
    {
        iVar = -iVar;    // 取正数计算
    }

    iIndex = 1;
    iCount = 0;
    while (iVar > 0)
    {
        if (iCount < 3)
        {
            iCount++;
        }
        else
        {
            *p++ = ',';
            iCount = 1;
        }
        *p++ = '0' + (iVar % 10);
        iVar /= 10;
        iIndex++;
    }
    if (lNegative)        // 补回负数的标识
    {
        *p++ = '-';
    }
    *p = '\0';            // 字符串结束符

    return _strrev(cBuffer);    // 反转缓冲区之后返回
}
// 其实可以不返回缓冲区的地址, 改为返回字符串的字符数, 为0时失败.


[ 本帖最后由 TonyDeng 于 2011-8-2 01:39 编辑 ]

授人以渔,不授人以鱼。
2011-08-02 00:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
加了注释

授人以渔,不授人以鱼。
2011-08-02 00:21
快速回复:学写程序,先把《Hello,world!》写好
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036995 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved