acm训练 2017 02 20

来源:互联网 发布:php完全自学手册 编辑:程序博客网 时间:2024/09/21 06:34

练习一 零起点学算法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 0
原创粉丝点击