PAT乙级系列:第二题

来源:互联网 发布:c语言源码网站 编辑:程序博客网 时间:2024/05/29 18:55

题目如下
这里写图片描述

第一步:输入
因为n小于10的100次方,所以可以用长度为100的字符型数组保存。这里仍然要讨论结束符的问题。如果输入长度为100,那么编译器会不会自动再数组结尾插入一个结束符?如果使用cin>>,是不会出现这种情况的。这里做了一个小尝试。

#include<iostream>using namespace std;int main(){    char a[3];    cin>>a;    cout<<a;}

输入长度为3的字符串,输出也为长度为3的字符串。

第二部:计算总和
2.1求输入字符串的位数。

int getInputLen(const char (&a)[100]){    int len=0;    for (int i =0;i<100;i++)    {        if (a[i]!=NULL)        {            len++;        }    }    return (len);}

什么是NULL,为什么在数组中没有赋值的地址上的值为NULL?
c++中定义NULL即为0.在数组中,无论什么类型的数组,如果元素没有被初始化,就会被设定为默认值‘0’。int型将会初始化为0.char或者string型数组将会初始化为“”(ASCII码为0)。所以,上述判定条件也可以写成: if (a[i]!=0).
虽然这里不涉及空指针问题,但是我也查了一点这方面的资料。空指针不会指向任何对象和函数。所以任何对象或者函数的地址均不为空。那么空指针到底指向什么地方呢?答案是,看系统而定。有的是指向地址为0的内存。有的是指向其他的位置。
参考资料:
初始化问题

空指针问题
2.2 求和

int getSum(const char (&a)[100]){    int len = getInputLen(a);    int sum=0;    for (int i =0;i<len;i++)    {        sum = sum + (int)a[i]-48;    }    return (sum);}

这里注意格式转换就行
第三部 输出
3.1 定义string数组。
用含有10个元素的string数组来存储拼音信息。之所以用const,是因为希望保护string内的元素,不允许修改。

const string pinYin[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

3.2 打印
这里我思考了一段时间,如何保证从非零首位开始打印。我想的办法是从高位开始遍历,设置一个标志位,当标志位为1时,才能够打印。而只有出现非零值时,标志位才会改变为1.还有就是如何将int型值的每一位依次取出。算法如下

void output(const string (&pinYin)[10], int sum){    int a[3]={-1,-1,-1};    int flag=0;    for ( int i =3;i>0;i--)    {        int b = sum % (int)pow(10,i);        a[i-1]=b /(int)pow(10,i-1) ;        if (a[i-1]!=0)        {            flag=1;        }        if(flag==1)        {            cout<<pinYin[a[i-1]];        }        if (i!=1 & flag==1)        {            cout<<' ';        }    }}

综合代码:

#include<iostream>#include<string>#include"math.h"using namespace std;void getInput(char (&a) [100]){    cin>>a;}int getInputLen(const char (&a)[100]){    int len=0;    for (int i =0;i<100;i++)    {        if (a[i]!=0)        {            len++;        }    }    return (len);}int getSum(const char (&a)[100]){    int len = getInputLen(a);    int sum=0;    for (int i =0;i<len;i++)    {        sum = sum + (int)a[i]-48;    }    return (sum);}void output(const string (&pinYin)[10], int sum){    int a[3]={-1,-1,-1};    int flag=0;    for ( int i =3;i>0;i--)    {        int b = sum % (int)pow(10,i);        a[i-1]=b /(int)pow(10,i-1) ;        if (a[i-1]!=0)        {            flag=1;        }        if(flag==1)        {            cout<<pinYin[a[i-1]];        }        if (i!=1 & flag==1)        {            cout<<' ';        }    }}int main(){    const string pinYin[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};    char input[100]={'0'};    int sum=0;    getInput(input);    sum = getSum(input);    output(pinYin,sum);    return(0);}
原创粉丝点击