acm训练 2017 02 20

练习一 零起点学算法68——删除字符
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
Sample Input
ABCDE
E
ASD Dfg fhd
D
Sample Output
ABCD
AS fg fhd

测试代码一:

#include<stdio.h>
#include<string.h>
/*
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
*/
int fun_cut(char *ptoc, char a,int cnt); //删除字符串中指定字符并返还头指针
int main()
{
    char str[100];
    char a;
    while (gets(str) && gets(&a) != NULL)
    {
        char *ptoc = str;
        int i;
        int cnt = strlen(str);
        cnt = fun_cut(ptoc, a, cnt);
        for (i = 0; i < cnt; i++)
            printf("%c", *(ptoc + i));
        printf("\n");
    }
    return 0;
}
int fun_cut(char *ptoc, char a,int cnt) //删除字符串中指定字符并返还头指针
{
    int i,j;
    for (i = 0; i < cnt; i++)
    {
        for(;*(ptoc+i)==a;)
        {
            if (i == cnt - 1)
            {
                cnt--;
                break;
            }
            else for (j = i; j + 1 < cnt; j++) *(ptoc + j) = *(ptoc + j + 1);
            cnt--;
        }
    }
    return cnt;
}

运行结果:
这里写图片描述

测试结果:wrong!!!
!?完全不知道错在哪里
测试代码二:

#include<stdio.h>
#include<string.h>
/*
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
*/
void fun_cut(char *ptos, char ch); //删除字符串中指定字符并返还头指针
int main()
{
    char str[100] = { 0 ,},ch,b;
    while (gets(str) != NULL)
    {
        ch = getchar();
        b=getchar(); //过滤掉输入的换行符
        fun_cut(str, ch);
        puts(str);
    }
    return 0;
}
void fun_cut(char *ptos, char ch) //删除字符串中指定字符并返还头指针
{
    char *_ptos_1 = ptos;
    for (; *ptos != 0; ptos++)
        if (*ptos != ch) *_ptos_1++ = *ptos;
    *_ptos_1 = 0;
}

运行结果: 通过
小结:测试代码一程序编写没有到位,while (gets(str) && gets(&a) != NULL)语句没有实现获得str与a的目的,第一应该使用a=getchar()来获取a;第二,编写时没有考虑到换行符的影响,应当用一个变量b,来b=getchar()过滤掉换行符,于是精简程序得到如下代码
这里写图片描述
但是如图调试窗口所示,我需要的字符ch为\n换行符,b反而为我输入的空格字符,猜想到当使用getchar时它是从右开始录入字符的,当右数第一个字符被赋予给第一个getchar后,第二个getchar将右数第二个字符赋予下一个变量(换行符也算),于是将用于过滤换行符的语句放到靠后位置

练习二: 零起点学算法69——查找最大元素
Description
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入”(max)”。
Sample Input
abcdefgfedcba
xxxxx
Sample Output
abcdefg(max)fedcba
x(max)x(max)x(max)x(max)x(max)
测试代码一:

#include<stdio.h>
#include<string.h>
/*
Description
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果
如果存在多个最大的字母,就在每一个最大字母后面都插入"(max)"。
*/
#define Pm printf("(max)")
void fun_findmax(char *ptos);
int main()
{
    char str[100];
    while (gets(str) != NULL)
    {
        char *ptos = str;
        fun_findmax(ptos);
    }
    return 0;
}
void fun_findmax(char *ptos)
{
    int i;
    int cnt = strlen(ptos);
    int max = (int)*ptos;
    for (i = 1; i < cnt; i++)
        max = max > *(ptos + i) ? max : *(ptos + i);
    for (i = 0; i < cnt; i++)
    {
        if((int)*(ptos + i)==max) 
        {
            printf("%c", *(ptos + i));
            Pm;
        }
        else printf("%c", *(ptos + i));
    }
    printf("\n");
}

运行结果:
这里写图片描述
测试结果:Aceepted!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值