标题:怎们编写这个C语言程序
只看楼主
Sandy143
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-3-23
得分:0 
非常感谢!可是能帮我看看这个为什么不行吗
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define size 100
bool solve(char *a,char *b,int m,int n);
int main(){
    int m,n,i,j;
    char a[size];
    char b[size];
    fgets(a,size,stdin);
    fgets(b,size,stdin);
    m=strlen(a);
    n=strlen(b);
    for(i=0;i<m;i++)
    toupper(a[i]);
    for(j=0;j<n;j++)
    toupper(b[j]);
    if(solve(a,b,m,n))
    puts("Yes");
    else
    puts("NO");
}
bool solve(char a[],char b[],int m,int n){
    int i,j,k;
    bool p=true;
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            if((a[i]==b[j])&&(isupper(b[j])))
            tolower(b[j]);
        }
    }
    for(k=0;k<n;k++){
        if(isupper(b[k]))
        p=false;     
    }
}
2015-03-24 23:20
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
回复 19楼 jklqwe111
你的思路很正确


程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void word(char *s1, char *s2) {
    puts("Input 1st word:");
    scanf("%80[a-zA-Z]", s1);

    while(getchar()  != '\n') continue;

    puts("Input 2nd word:");
    scanf("%80[a-zA-Z]", s2);

    if(strlen(s1) != strlen(s2)) {
        printf("No!\n");
        exit(EXIT_FAILURE);
    }
}

int cmp(const char *s1, const char *s2) {
    int a[80] = {0}, b[80] = {0};
    int i, j, flag = 0;

    for(i = 0; s1[i] != '\0' && i < 80; i++) {
        if(s1[i] >= 97) a[i] = s1[i];

        else a[i] = s1[i] + 32;

        if(s2[i] >= 97) b[i] = s2[i];

        else b[i] = s2[i] + 32;
    }

    for(i = 0; a[i] && i < 80; i++) {
        for(j = 0; j < 80; j++) {
            if(a[i] == b[j]) {
                b[j] = 0;
                break;
            }
        }

        if(j == 80) {
            printf("No!!!!!\n");
            exit(EXIT_FAILURE);
        }
    }

    for(i = 0; i < 80; i++)
        flag += b[i];

    return flag;
}


int main(void) {
    char s1[81] = {0}, s2[81] = {0};
    word(s1, s2);

    if(cmp(s1, s2)) printf("No!!\n");

    else printf("Yes...\n");

    return 0;
}


Only the Code Tells the Truth             K.I.S.S
2015-03-24 23:27
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
回复 21楼 Sandy143
解决问题的逻辑错误,你好好看一下3楼版主的讲解,说几点你改一下吧,当找到相同字符时要消灭,你没做到,获得单词长度,应该做次判断,否则获得单词长度何用,另外,你已经把单词大小写全部转换,后边还要对大小写进行判断和转换,没有用的操作,关于大小写的问题,其实完全不用转换,忽略大小写判断两字符是否相等就一句代码的事,你先把这事搞定吧。再写一下代码贴出来,不要怕错,找出错误改正了是最大的进步。明天我会来,希望能看到你写的东西。
2015-03-25 00:30
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
回复 20楼 铁钩银划
代码写的精炼,值得学习,提一点建议,当对第二个单词遍历时,能否从i开始,而不从头来,因为这是有道理的,判断过的字符就没有必要再进行判断,其实,两个单词我们不应该把它看做是串,而应视为集合,因为字符可以无序,去除集合中的一个元素,是有些简便而常用的方法的。
2015-03-25 00:50
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
回复 2楼 林月儿

看你的程序,思路很好,你的想法应该是把单词中字符出现的个数记录在一个数组中,以此分辨各个单词,想法非常好,但是实现上有些复杂了,有点绕,可以单词中字符的码值-'a'为下标,增加其值。
a[i]>='a'?countm[a[i]-'a']++:countm[a[i]-'A']++;
这样就可以不用那26个字符数组了。
2015-03-28 23:54



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




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

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