《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-1

在一些比较著名的公司的C语言相关面试中,往往会出一些基于C语言的算法设计和数据结构的题目。因为这类题目不但可以考查面试者最基本的编程功底,还可以考查面试者的综合素质,以及应用计算机解决实际问题的能力。另外,要想成为一名合格的程序设计人员,单纯地掌握编程语言的基本语法是远远不够的。熟练掌握一些常用算法的实现方法和常用的数据结构编程也是十分必要的。本章将介绍一些C语言算法设计和数据结构相关的题目。

【例10-1】输入一个字符串并将它输出,以Ctrl+Z组合键表示输入完毕,要求将输入的字符串中多于1个的连续空格符合并为1个。

例如输入字符串Hello world!,输出为Helllo world!。

【分析】

     这类输入流操作的问题可以直接对输入的字符进行判断和处理,无需将输入的字符保存在数组或者其他的数据结构中,这样会非常容易解决。

     本题要求将输入的字符串中多于1个的空格符合并为1个,因此可以在输入每个字符时判断它是否是空格符。如果是空格符,则接下来的空格符不输出;否则输出接下来的任意字符。其算法描述如下:

inputString()
{
    char c, lastc = 'a';
    c = getchar();
    while(c!=EOF)
    {
        if(c!=' '){
            putchar(c);
            lastc = c;
            c = getchar();   
            }
        else{
            if(lastc!=' ')
                putchar(c);  
            lastc = c;
            c = getchar();
        }
    }
}

   在该算法中,对于输入字符c进行判断。(1)如果输入的字符不是空格符,则将它输出,并用变量lastc将其保存,作为下一个输入字符的参考,然后再输入一个字符;(2)人如果输入的字符是空格符,则要判断它的上一个字符lastc是否是空格符,仅当lastc不是空格符时才将c输出,否则不输出。同样这里要用lastc将该字符保存,作为下一个输入字符的参考,然后再输入下一个字符。重复(1)、(2)的操作,直到输入Ctrl+Z组合键(即EOF)为止,循环结束。这样输出的字符串中多于1个的连续空格符就会被合并为1个输出。

    由于第一个输入的字符无论是否是空格符都要被输出,因此lastc的初始值应为任意的非空格字符,这里赋初值为字符a.

   这里要注意,只有当用户从终端输入回车符时,输入的字符串才作为一个输入流被getchar()函数一个一个地接收,再被函数putchar()一个一个地输出。

  下面给出完整的测试程序,程序清单10-1

#include <stdio.h>
inputString()
{
    char c, lastc = 'a';
    c = getchar();
    while(c!=EOF)
    {
        if(c!=' '){
            putchar(c);
            lastc = c;
            c = getchar();   
            }
        else{
            if(lastc!=' ')
                putchar(c);  
            lastc = c;
            c = getchar();
        }
    }
}
main()
{
     inputString();
     getche();
}


由运行结果可以看到是想要的结果。当输入一个回车时,也是立即显示一个回车,所以才间距那么大。

Question:1、为什么组合键Ctrl+Z就是EOF呢?是默认的吗?

                2、getche()函数是什么待查,以前我只是用过getch()函数。难道这两个函数一样的作用?

这是我在win7旗舰版系统,Visual C++ 6.0上运行的结果。

第一天

希望接下来每天可以至少一题地看、思考。希望对同样感兴趣的人有所帮助,一起努力哈

这仅是非商业盈利性的资源共享。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值