C语言 7-1数字 串的练习(把字符串中的数字提取出来,判断是否递增)

C语言 7-1数字 串的练习(把字符串中的数字提取出来,判断是否递增),第1张

7-1 数字 (30 分)

Drizzle 收到一封英文信件,信件中的句子仅由若干单词和数字组成,每个单词,数字之间用单个空格隔开,请你取出其中的所有数字,并判断数字是否递增 。 如果递增,输出 True ,否则,输出 False 。

要求:

输入:一行字符串表示句子 s
输出:True 或 False

示例:

输入:

1 box has 3 blue 4 red 6 green and 12 yellow marbles

输出:

True

解释:
句子中的数字是:1, 3, 4, 6, 12 。
这些数字是按从左到右严格递增的 1 < 3 < 4 < 6 < 12 。

范围:
  • 3 <= s.length <= 200
  • s 由小写英文字母、空格和数字 0 到 9 组成(包含 0 和 9)
  • s 中数字的数目在 2 和 100 之间(包含 2 和 100)
  • s 中至少有 两个 数字
  • s 中的每个数字都是一个 小于 100 的 正 数,且不含前导零
  • s 不含前导或尾随空格
#include 
#include 

#define bool char
#define true 1
#define false 0
#define MAXLEN 255

//定义串的结构, 需要一个存放字符串的数组和表示它长度的变量
typedef struct
{
    char ch[MAXLEN+1];
    int length;
} SString;

//初始化串,很简单,只需要把长度设为0就可以了
void StrInit(SString* S)
{
    S->length = 0;
}

//串赋值
bool StrAssign(SString* T, char* ch)
{
    //判断ch是否为空,空的话就不需要赋值了
    if(ch == NULL) return false;
    //将字符串里的字符依次输入到串中
    int i = 0, j = 1;
    while(ch[i] != '\0')
    {
        //如果Ascii码在0~9范围内,说明是数字,输入到串
        if(ch[i] >= 48 && ch[i] <= 57)
        {
            T->ch[j++] = ch[i];
        }
        //不然的话全换成空格
        else
        {
            T->ch[j++] = ' ';
        }
        i++;
    }
    T->length = j-1;
    return true;
}

//输出串,测试用
bool PrintStr(SString S)
{
    //如果为空不输出
    if(S.length == 0) return true;
    for(int i = 1; i <= S.length; i++)
    {
        printf("%c", S.ch[i]);
    }
    printf("\n");
    return true;
}

//提取数, S是串, pos是数字开始的位置, k是数字的长度, 返回m是数字
int StractMath(SString S, int pos, int *k)
{
    int m = 0;
    int i = 1;
    while(S.ch[pos] !=' ' && i <= S.length)
    {
        //把连续的单个数字(字符类型)转换为整个数字(整形)
        //-48是因为ascii码
        m = m*10 + S.ch[pos]-48;
        pos++;
        i++;
    }
    *k = i-1;

    return m;
}

//判断串中元素是否按顺序排列
bool Queue(SString S)
{
    //空的就不管了
    if(S.length == 0) return false;
    //m、n用来作比较,设初值为负数是为了防止跟串里的数相等,
    //len用来存数字的长度
    int m = -1, n = -1, len;
    for(int i = 1; i <= S.length; i++)
    {
        //如果是数字的范围
        if(S.ch[i] >= 48 && S.ch[i] <= 57)
        {
            //n存m原来的值,跟下一个m值作比较
            n = m;
            m = StractMath(S, i, &len);
            //让i的位置跳过数字的范围
            i += len;
            //如果m 小于等于n说明不是顺序排列的
            if(m <= n)
            {
                //printf("%d %d\n", m,n);//测试用
                return false;
            }
        }
    }
    //一直到最后都没弹出说明是按顺序排列的。
    return true;
}



int main()
{
    //初始化
    SString S;
    StrInit(&S);
    //先把字符串搞到字符数组里
    char str[300];
    gets(str);
    //再把字符串中的数字弄到串里,不是数字的变成空格
    StrAssign(&S, str);
    //PrintStr(S);//测试用
    //按照提议返回
    if(Queue(S))
    {
        printf("True");
    }
    else
        printf("False");

    //若对您有帮助请点个赞哦~
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/706938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存