鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 晚起鸟儿

请帮忙改下程序,输出以ABCD排列

[复制链接]
发表于 2016-7-16 08:53:57 | 显示全部楼层
晚起鸟儿 发表于 2016-7-14 15:02
if(......)最后一个不用判断也有十二种可能呀,当然这样比较直观,但是代码量还要冗长得多……

我的想 ...

看了我后面的回复,首先抱歉,没有测试就说了与编译器没有关系。

另外你的思路是正确的,需要用ASCII码做排序,具体之后算法其实会学到,不用急,另外为什么别人代码会那么长,其实就是简单做一个排序不会那么长,主要是为了防止乱输入等问题,例如你的目的是比较A到Z,而别人 硬要输入汉字例如“小明”咋办。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-17 08:43:59 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2016-7-17 09:54 编辑
donkkong 发表于 2016-7-14 11:49
首先肯定一点,与编译器无关,另外你的疑问应该是设计一个程序,可以做到排序功能,这个会涉及到冒泡算法, ...


后来发现我写的程序是不对的,除了执行打印ABCD其它都没用上,而不是提取输入的字符进行排序,这个程序是我自己用的,不用考虑故意乱输的问题,而且在实际应用中还要加入更多其它元素,所以尽量弄简单些,买菜去,吃了午饭再来想,然后再想想弄成可随机输入1-4个字母,并提取字母后面实数并放到对应位置,朋友们请帮我一起想想,热爱鱼C^_^~

#include<stdio.h>
char one,two,three,four;
int main(){        four=three=two=one='A'&&'B'&&'C'&&'D';       
  scanf("%c%c%c%c",&one,&two,&three,&four);
  printf("%c%c%c%c\n",'A','B','C','D');}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-18 13:52:15 | 显示全部楼层
晚起鸟儿 发表于 2016-7-17 08:43
后来发现我写的程序是不对的,除了执行打印ABCD其它都没用上,而不是提取输入的字符进行排序,这个 ...

其实搜索一个叫冒泡算法的就可以有相关结果,我之前学鱼c视频的时候后面有一节也会讲到,如果没有把整个c语言鱼c视频看完,可以慢慢往下看,如果心急,可以搜索“c语言冒泡算法”哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-19 07:04:36 | 显示全部楼层
donkkong 发表于 2016-7-18 13:52
其实搜索一个叫冒泡算法的就可以有相关结果,我之前学鱼c视频的时候后面有一节也会讲到,如果没有把整个c ...

冒泡算法是算实数的呀,字符的不会弄~
以下是我的思路供参考:

输入字符串-搜索并计算字符个数-判断如果是四个查找并获取A后面的实数,将A后面的实数保存到ONE,
再查找并获取B后面的实数保存到TWO,再查找并获取C后面的实数保存到THREE,再查找并获取D后面
的实数保存到FOUR-打印出ONE,TWO,THREE,FOUR存放的数值,并带上ABCD。

如果是其它个数按上面方法依次减少查找次数并执行~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-19 10:44:54 | 显示全部楼层
晚起鸟儿 发表于 2016-7-19 07:04
冒泡算法是算实数的呀,字符的不会弄~
以下是我的思路供参考:

这个感觉简单快捷一点,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-19 11:45:06 | 显示全部楼层
晚起鸟儿 发表于 2016-7-19 07:04
冒泡算法是算实数的呀,字符的不会弄~
以下是我的思路供参考:

亲,怪不得你一直想不通,一直会出现纠结啦,原来你的困惑在于abcd不能比较,其实字符abcd是可以比较的,透过ASCII就可以比较了,字符'A'的ascII码是101,字符'C'的ascII码是103,字符'Z'的ascII码是132,参考以下代码,但我没有编译器,直接写的,你需要先调试看看有没有错误
#include <stdio.h>

int main()
{
    char ch;
    scanf("%c", ch);//输入一个字符测试
    printf("字符型输入为:%c\n整形输入为:%d\n", ch, ch);//整形输出的数字就是ascII码

    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-19 20:11:12 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2016-7-19 20:21 编辑
大奔G 发表于 2016-7-19 10:44
这个感觉简单快捷一点,


还是不好,如果是CAD呢?获取不到B,所以每个条件语句里面还得增加获取不到返回零值,
并进行下一个字母搜索,而且系统怎么知道总共有几个数,输出哪几个呢?如果判断出是三个
就输出ABC和ONE TWO THREE里面的数值?显然不对!还得判断是哪几个字母
,根据各种条件打印……整出一长串代码~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-19 20:46:09 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2016-7-20 07:23 编辑
donkkong 发表于 2016-7-19 11:45
亲,怪不得你一直想不通,一直会出现纠结啦,原来你的困惑在于abcd不能比较,其实字符abcd是可以比较的, ...


谢谢,您少打了&应为scanf("%c",&ch);其实我要整的程序比较复杂,需要进行多次上下行间的字母判断的计算器,以前提过相对完整的问题,无奈太复杂,加上我嘴笨别人听不明白,所以把问题先简后难来提问,那些数值不是提取出来排序打印就完了,中间要进行各种运算,各种判断,所以我觉得首先要把数值提取出来存放到指定地址方便取值才是首要。已知条件就是从键盘输入的为ABCD这四个字母中的1-4个字母,且不分先后,每个字母后面各有一个实数。将每个实数存放到指定地址(这些地址对应ABCD),然后将实数提取出来并依顺序打印出来。如随机输入B3.2 D5 A2.15打印出A2.15 B3.2 D5

我的想法:先从键盘输入一串字符串,再获取第一个字符,判断是哪个字母,并将后面的实数存放到对应地址,再判断后面是字母还是回车,如是字母继续前面操作,如是回车提取存放的实数,并依顺序打印出来,可以帮忙写出代码吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-20 15:53:29 | 显示全部楼层
本帖最后由 donkkong 于 2016-7-20 15:59 编辑

你所指的代码其实不难写,属于简单类型的,只要弄懂冒泡算法就可以了,我上网找了个冒泡算法,按你的要求改了一下,还是那样,没编译器调试,也没有缩进,请不要介意,逻辑上应该没问题,可能会出现语法问题
#include <stdio.h>

int main()
{
char ch[4];//定义字符数组
char tempCh;//字符交换用途
int number[4];//定义整形数组
int i, j, tempNumber;
scanf("%c%d%c%d%c%d%c%d", &ch[0],&number[0],&ch[1],&number[1],&ch[2],&number[2],&ch[3],&number[3])//输入的时候请输入整数,如果你想要浮点型,例如b4a777c97d654就改成f吧
for (j = 0; j < 4 - 1; j++)
for (i = 0; i < 4 - 1 - j; i++)
if(ch[i] < ch[i + 1])
{
tempCh=ch[i];
ch[i]=ch[i+1];
ch[i+1]=tempCh;
tempNumber=number[i];
number[i]=number[i+1];
number[i+1]=tempNumber;
}//字符比较,比较后将字符及整形一起排序
for (i = 0; i < 4; i++)
printf("%c:%d", ch[i], number[i]);
printf("\n");

return 0;
}


算法原型:http://zhidao.baidu.com/link?url ... wD8lPAx9nhsI7uj_7wK

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +1 收起 理由
晚起鸟儿 + 1 + 5 + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-22 07:18:57 | 显示全部楼层
donkkong 发表于 2016-7-20 15:53
你所指的代码其实不难写,属于简单类型的,只要弄懂冒泡算法就可以了,我上网找了个冒泡算法,按你的要求改 ...

运行出现几个错误改不好,另外希望每个实数能存放到对应的一个地址,方便进行运算时取用~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-24 13:48:58 | 显示全部楼层
donkkong 发表于 2016-7-19 11:45
亲,怪不得你一直想不通,一直会出现纠结啦,原来你的困惑在于abcd不能比较,其实字符abcd是可以比较的, ...

'A'不是97
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-26 11:02:41 | 显示全部楼层
晚起鸟儿 发表于 2016-7-22 07:18
运行出现几个错误改不好,另外希望每个实数能存放到对应的一个地址,方便进行运算时取用~

其实我想帮你调试一个程序的,可惜我家上不了鱼c网站,只能在公司上,但公司没有编译器,先不要纠结这个问题啦,后面会慢慢解开的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-26 18:50:39 | 显示全部楼层
我觉得这个能符合你的要求
# include <stdio.h>
# include <ctype.h>
# define NUM 4
struct buf
{
        char letter;
        double number;
};
int main()
{
        struct buf ljd[NUM];
        struct buf temp;
        int i = 0;
        int j = 0;
        int count = 0;
        char choice = 0;


        for(count = 0;count < NUM;count++)
        {
                fflush(stdin);
                printf ("你是否想输入%s串字母和数字(Y/N):",count ? "下一":"一");
                scanf ("%c",&choice);

                if ('n' == tolower(choice))
                        break;
                fflush(stdin);
                printf ("请输入第%d个字母:",count+1);
                scanf ("%c",&ljd[count].letter);
                printf ("请输入第%d个数字:",count+1);
                scanf ("%lf",&ljd[count].number);


        }
        for (i = 0;i < count;i++)
        {
                for (j = i+1;j < count;j++)
                {
                        if (ljd[i].letter > ljd[j].letter)
                        {
                                temp = ljd[i];
                                ljd[i] = ljd[j];
                                ljd[j] = temp;
                        }
                }

        }

        for (i = 0;i < count;i++)
                printf ("%c  %lf\n",ljd[i].letter,ljd[i].number);

        return 0;
}

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +1 收起 理由
晚起鸟儿 + 1 + 5 + 1 写代码辛苦了,鼓励下~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-27 05:19:29 | 显示全部楼层
ljd884497 发表于 2016-7-26 18:50
我觉得这个能符合你的要求
# include
# include

大哥,运行正常,但不是我要的,我粘一段平时上班用的程序给您过目,希望您
能明白我写这个程序的目的~

%
O2047(2-MR810)
T707G40
G50M3S2600
G96S230
G0Z35.5
X117.5
G1G41Z37.5
X115.5Z38.5R0.2F0.15
X78.2
W2.1
X78.78A210
Z42.5R0.2F0.25

程序是分行运行的,这是其中一小段,在WORD文档中打开每行末尾有回车符号,
拷贝到机床中字母和实数中间会自动有空格,每行末尾会有分号,这些大写字母
各有特定的意义,所以数字在不同的字母后面就表示不同的意义,如果按您的方法
输入会很累的,我们要做的就是使用户操作尽量简单,而写这个系统的FANUC
公司就是这样做的~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-27 07:20:33 | 显示全部楼层
晚起鸟儿 发表于 2016-7-22 07:18
运行出现几个错误改不好,另外希望每个实数能存放到对应的一个地址,方便进行运算时取用~

先说抱歉,之前的那段代码我回家调试了下,确实语法错误非常多,下面的是调试过的代码,应该能用了,如果需要浮点型,将定义的int改成float,将d改成f就可以了。

回个帖要先把代码拷贝回家,然后调试后拷贝会公司才可以发给你,这网我还是醉了!

#include <stdio.h>
#include <windows.h>

int main()
{
        char ch[4];//定义字符数组
        char tempCh;//字符交换用途
        int number[4];//定义整形数组
        int i, j, tempNumber;
        printf("输入的时候请输入4次字符整数,按回车结束\n");
        scanf("%c%d%c%d%c%d%c%d", &ch[0],&number[0],&ch[1],&number[1],&ch[2],&number[2],&ch[3],&number[3]);
        for (j = 0; j < 3; j++)
        {
                for (i = 0; i < 3 - j; i++)
                        if(ch[i] > ch[i + 1])
                        {
                                tempCh=ch[i];
                                ch[i]=ch[i+1];
                                ch[i+1]=tempCh;
                                tempNumber=number[i];
                                number[i]=number[i+1];
                                number[i+1]=tempNumber;
                        }//字符比较,比较后将字符及整形一起排序
        }
        for (i = 0; i < 4; i++)
        {
                printf("%c:%d", ch[i], number[i]);
                printf("\n");
        }
       
        system("pause");
        return 0;
}

评分

参与人数 1荣誉 +1 贡献 +1 收起 理由
晚起鸟儿 + 1 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-27 10:03:53 | 显示全部楼层
兄弟根据你的要求,我双写了一个版本,你看怎么样?
# include <stdio.h>
# include <ctype.h>
# include <stdlib.h>
# define NUM 20
struct ljd
{
        char letter;
        double number;
};
int main()
{
        struct ljd *pf[NUM] = {NULL};
        struct ljd *temp;
        char buf[256];
        int i = 0;
        int k = 0;
        int j = 0;
        char TempString[20];
        char TempChar;
        double TempNum = 0.0;


        printf ("请输入原始码:");
        gets(buf);

        while(buf[i] != '\0')
        {
                if (isalpha(buf[i]))
                {
                        TempChar = buf[i];
                        pf[j] = (struct ljd *)malloc(sizeof(struct ljd));
                        pf[j]->letter = TempChar;
                        i++;
                }
                else
                {
                        while (!isalpha(buf[i+k]) && buf[i+k] != '\0')
                        {
                                TempString[k] = buf[i+k];
                                k++;
                        }
                        TempString[k] = '\0';
                        TempNum = atof(TempString);
                        pf[j]->number = TempNum;
                        j++;
                        i += k;

                }
               
                k = 0;
       

               
        }
        for (i = 0;i < j;i++)
        {
                for (k=i+1;k < j;k++)
                {
                        if (pf[i]->letter > pf[k]->letter)
                        {
                                temp = pf[i];
                                pf[i]= pf[k];
                                pf[k] = temp;
                        }
                }

        }



        for (i = 0;i < j;i++)
        {
                printf ("%c %.2lf  ",pf[i]->letter,pf[i]->number);
                free(pf[i]);
                pf[i] = NULL;
        }

        printf("\n");
        system("pause");

        return 0;
}

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +1 收起 理由
晚起鸟儿 + 1 + 5 + 1 写得不错,能详细注释么

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-28 16:47:57 | 显示全部楼层
donkkong 发表于 2016-7-27 07:20
先说抱歉,之前的那段代码我回家调试了下,确实语法错误非常多,下面的是调试过的代码,应该能用了,如果 ...

首先错的依然非常多,而且程序缺少灵活性。另外我登录鱼C正常呀,基本直接打开保存的网页就可回复
,而无需登录,建议您用QQ号和QQ密码登录。
错.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-28 17:00:46 | 显示全部楼层
ljd884497 发表于 2016-7-12 17:01
这是根据你的要求写的。
# include
# include

您是用ASCLL码排列大小的吧,请问打印时单独让F及后面的实数排在行末如何修改呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-28 18:21:06 | 显示全部楼层
请问打印时单独让F及后面的实数排在行末如何修改呢
什么意思?我没有看懂你的要求,举个例子看看?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-29 05:09:02 | 显示全部楼层
本帖最后由 晚起鸟儿 于 2016-7-29 12:41 编辑
ljd884497 发表于 2016-7-28 18:21
请问打印时单独让F及后面的实数排在行末如何修改呢
什么意思?我没有看懂你的要求,举个例子看看?


%
O2047(2-MR810)
T707G40
G50M3S2600
G96S230
G0Z35.5
X117.5
G1G41Z37.5
X115.5Z38.5R0.2F0.15  //F在最后
X78.2
W2.1
X78.78A210
Z42.5R0.2F0.25   //F在最后
M30  //M30为读取结束


您看明白了么?而且我希望可以一直输入很多行,直到最后一行出现M30并回车,
系统结束读取,并把排好序的程序像上面这样打印出来。
另外我希望每个字母和后面的实数以个体被单独存放在指定位置,方便随时调用,
如:
X115.5Z38.5R0.2F0.15  //按字母+实数为一个分别单独存放,如X115.5为第一个,Z38.5为第二个……
X78.2  //每行分配五个存放空间,但可为等于或少于五个
W2.1   //W为Z的增量,单独存放的目的是为加入计算,出现W则要查找前面最后一个出现Z的位置
     //这里查找到Z38.5,系统计算出38.5+2.1=40.6,于是输出这行时输出Z40.6
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表