标题:一道练习题,本人做了好久才做出来,有些不懂的地方请指教,谢谢
只看楼主
我是殊帕面
Rank: 2
等 级:论坛游民
帖 子:10
专家分:10
注 册:2014-3-30
结帖率:100%
已结贴  问题点数:20 回复次数:8 
一道练习题,本人做了好久才做出来,有些不懂的地方请指教,谢谢
编写程序包括下面的函数
main函数:定义数组,实现菜单,获取用户输入,调用函数
input函数:输入任意长度的字符串
Delete函数:删除字符串中用户指定的字符
goleft函数:将删除指定字符后的字符串向左轮转2位
函数原型:
void input(char *);
void Delete(char *,char);
void goleft(char *);
测试用例:    程序执行,显示“please input string”
              用户输入,“a*bb**ccc***dddd****”
              程序执行,显示“please intput the char”
              用户输入,“*”
              程序执行,显示“abbcccdddd”
程序执行,显示”after goleft 2 location”
程序执行,显示“bcccddddab”
程序执行,显示“continue?”
用户输入“1或者y”  重复上述过程
用户输入“2或者n”  程序结束

程序代码:
#include<stdio.h>
int main()
{
    void input(char *);
    void Delete(char *,char);                   //函数声明 
    void goleft(char *);
    char string[100],c;
    char ch;
    while(1)
    {
    printf("please input string:\n");
    input(string);                              //调用input函数,输入字符串string 
    printf("please intput the char:\n");
    scanf("%c",&c);                            //输入要删去的字符 
    getchar();                                 //吃掉回车 
    Delete(string,c);                          //调用Delete函数,删除字符串string中指定的字符c 
    printf("%s\n",string);
    printf("after goleft 2 location:\n");
    goleft(string);                             //调用goleft函数,使字符串string向左轮转2位 
    printf("%s\n",string);
    printf("continue?\n");
    ch=getchar();                              //输入y或者n 
    getchar();                                 //吃掉回车 
    if(ch=='2'||ch=='n')
        break;
    }
    return 0;
}
void input(char *str)
{
    gets(str);                                //输入字符串 
}

void Delete(char *str,char c)
{
   char *p1;
   int i=0;
   p1=str;
   for(;*p1!='\0';)
   {
     if(*p1!=c)
     { 
       *(str+i)=*p1;                        //这里我做了好久,写得很乱,请指教 
       i++;                                   
       p1++;
     }
     else p1++;
   }
   *(str+i)='\0';       
} 

void goleft(char *str)
{   
    char s[100],*p1,*p2;
    for(p1=str+2,p2=s;*p1!='\0';p1++,p2++)
    *p2=*p1;                                  //这里我只会这样做,如果向左轮转3位,就肯能不会了 
    p1=str;                                   //求这类问题的方法,谢谢 
    *p2++=*p1++;*p2++=*p1;*p2='\0';
   for(p1=str,p2=s;*p1!='\0';p1++,p2++)
   *p1=*p2; 
}

虽然做出来了,但还是有不太懂的地方,请指教,谢谢!
搜索更多相关主题的帖子: 编写程序 练习题 please 字符串 用户 
2014-04-28 20:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:4 
嘗試把實現了的忘掉,重新寫一次。多寫才有思路,一定要忘掉,牢記張無忌是怎麽學太極拳的那個故事。

授人以渔,不授人以鱼。
2014-04-28 22:26
code_farmer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:117
注 册:2014-4-21
得分:4 
回复 2 楼 TonyDeng
有道理
2014-04-28 23:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
學習、做題,最怕的不是做不出來,而是做出來了但不再回頭去雕琢它,就以爲懂了,於是去做別的題,這樣是學不到深處的。題目要多做,多寫程序,指的是反覆推敲、雕琢,而不是大量做不同的題目,就如一個藝術家,每次都做不同的作品,這些作品的質量和他本人的造詣,都不會高到哪去,其實很多座右銘都談到這個道理。在一個程序基本做出來之後,推敲的時候,其實最怕被已經“成功”的思維牽著走,不知不覺又做出同樣的產品,所以最好把過去的成功和輝煌都忘掉,重新開始,思路就截然不同,此時隨著你的見識積累,每次都有新的解決方案出現,最終回過頭來看原先的程序,如果發現有共同的地方,就表明這個共同點是關鍵點,它是有價値的,否則不可能不同的方案都呈現共同的東西,這才是你的經驗!

舉個簡單的例子,所謂“吸收回車”,你寫那麽多程序,都發現這個需求是經常遇到的,那麽就表明這是很現實的問題,你必須集中力量把它解決完善了,並抽取出來,構建成自己的工具庫,以後拿來就用,不是每次都寫在程序代碼,大量的重覆勞動和重覆代碼(何況還總是嵌入在邏輯代碼中模糊主線邏輯,以致不註釋都不知道那是要幹什麽的)。其他的都是類似理解,順便說一句,很多人包括樓主現在那個僅用一個getchar()就以爲可以解決問題的代碼,其實是不行的,為什麽不行,多運行幾次自己的程序就知道了,仍然是把自己的代碼忘掉,當自己是普通的用戶,去實際使用自己的產品,人家之所以測試部門和開發部門是“敵人”,就是這個道理,哪有自己既當運動員又當裁判的。又是一個“忘”字!

授人以渔,不授人以鱼。
2014-04-28 23:25
a6670892
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2014-4-25
得分:4 
void move(int *str,int m)
{
arry_begin=str[0];
for(p=str;(p+1)!='\0';p++)
    *p=*(p+1);
*(str+strlen(str))=arry_begin;
if(m>0) move(arry,m);
}
小小的尝试(m是轮几位)
2014-04-29 00:54
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:4 
关于删除字符的  你看看这样是否清晰一些呢

程序代码:
void strdel(char* source,char dest)
{
    char* p=source;   //去除目标字符后指针
    while(*source!='\0')
    {
        if(*source!=dest)
        {
            *p=*source;
            source++;
            p++;
        }
        else
        {
            source++;  //如果等于目标字符 则源串指针空跑
        }
    }
    *p='\0';
}

DO IT YOURSELF !
2014-04-29 08:34
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用a6670892在2014-4-29 00:54:32的发言:

void move(int *str,int m)
{
arry_begin=str[0];
for(p=str;(p+1)!='\0';p++)
    *p=*(p+1);
*(str+strlen(str))=arry_begin;
if(m>0) move(arry,m);
}
小小的尝试(m是轮几位)



要是贴代码的话  麻烦你贴能运行的代码  好不

DO IT YOURSELF !
2014-04-29 08:38
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
程序代码:
void strmove(char *str,int m)
{
    char tmp[100]={'\0'};   //感觉这里最好使用申请动态内存
    int i=0;
    char* p=str;
    char* p2=str+m;
    for(i=0;i<m;i++) tmp[i]=*(str+i);  //先把待移动的串挪走
    while(*p2!='\0')
    {
       *p++=*p2++;
    }
    for(i=0;i<m;i++) *p++=tmp[i];      //再把挪走的串接到末尾处
    *p='\0';
}


值得一提的是,本题目不能使用头文件string.h 否则就不好玩了

[ 本帖最后由 wp231957 于 2014-4-29 08:50 编辑 ]

DO IT YOURSELF !
2014-04-29 08:48
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
得分:4 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    void Delete(char *,char);                   //函数声明
    void goleft(char *);
    void move(char *str,int m);
    char string[100],c;
    int m;

    while(1)
    {
        printf("please input string:\n");
        gets(string);   
       
        printf("please intput the char:\n");
        scanf("%c",&c);                            //输入要删去的字符
        getchar();                                 //吃掉回车 

        Delete(string,c);                          //调用Delete函数,删除字符串string中指定的字符c
        printf("%s\n",string);

        printf("after goleft 2 location:\n");
        goleft(string);
        //调用goleft函数,使字符串string向左轮转2位
        printf("%s\n",string);     

        m=5;
        printf("after goleft %d location:\n",m);
        move(string,m);
        puts(string);
       
        printf("continue?\n");
        c=getchar();                              //输入y或者n
        getchar();                                 //吃掉回车
        if(c=='2'||c=='n')
            break;
    }
    return 0;
}

void Delete(char *str,char c)
{
   char *p;
   int i=0;

   for(p=str;*p;p++)
   {
     if(*p!=c)
       *str++=*p;   
   }
   *str='\0';      
} 

void goleft(char *str)
{  
    char *p,c1=*str,c2=*(str+1);

    for(p=str+2;*str=*p;str++,p++);
                                
    *str++=c1;  *str++=c2; *str='\0';
}

void move(char *str,int m)
{
    char *p=str;
    char *q=(char*)malloc(m*sizeof(char));
    int i;

    for(i=0; i<m && *p ;i++)       
        *(q+i)=*p++;
    *(q+i)='\0';

    for(;*str=*p;str++,p++);
    for(i=0;*str=*(q+i);str++,i++);   
}
2014-04-29 10:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-430785-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.226965 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved