请帮忙改下程序,输出以ABCD排列
本帖最后由 晚起鸟儿 于 2016-7-13 03:46 编辑#include<stdio.h>
#include<conio.h>
char one,two;
float num1, num2;
int main(){
scanf("%c%f%c%f",&one,&num1,&two,&num2);
if(one=='A')
{
printf("%c%f%c%f\n",one,num1,two,num2);
}
else if(one=='B')
{
printf("%c%f%c%f\n",two,num2,one,num1);
}
getch();
},three,four
以上为输入两个大写字母A和B,(输入不以字母顺序输入)字母后面各附带一个实数,
输出结果以AB及后面带的数值排列~
我想弄成可以随机输入1-4个字母及对应实数,只能输入A,或者输入A,B或者输入A,B,C或者输入A,B,C,D,
(输入不以字母顺序输入)每个字母后面各有一个实数,输出结果按字母表顺序输出,
并且字母后面带的实数跟在字母后面,比如保持num1在one后面,num4在four后面 这是根据你的要求写的。
# include <stdio.h>
# include <ctype.h>
# include <stdlib.h>
# define NUM 20
struct ljd //定义一个存放 字母和数字的结构
{
char letter;
double number;
};
int main()
{
struct ljd *pf = {NULL};//声明多个指向结构体的指针用于指向保存输入的数据
struct ljd *temp; // 声明一个临时的指针用于指针的交换
char buf; //用于接受原始码
int i = 0; // 循环计数
int k = 0; // 循环计数
int j = 0; // 循环计数
char TempString; // 临时字符串,用于从原始码中取出的字符串的存放
char TempChar; // 临时字符,用于从原始码中取出的字符的存放
double TempNum = 0.0;// 临时变量,用于把字符串转换成数字
printf ("请输入原始码:");
gets(buf); //接受所有输入的
while(buf != '\0') //循环查找字母和数字,并分开提取
{
if (isalpha(buf))// 如果是字母,则 开辟一个结构体内存,用于保存字母和数据
{
TempChar = buf;
pf = (struct ljd *)malloc(sizeof(struct ljd));
pf->letter = TempChar; // 这里保存的是字母
i++;
}
else /* 如果是数字,则开始循环查找这个数字的结尾(只到另一个字母)*/
{
while (!isalpha(buf) && buf != '\0')
{
TempString = buf;
k++;
}
TempString = '\0';//到这里,提取的数字还是字符串,所以下面要有atof()转换成数字
TempNum = atof(TempString);
pf->number = TempNum;
j++;
i += k;
}
k = 0; // 循环结束时,要把k清零,以便下一次查找数字是从0开始循环
}
for (i = 0;i < j;i++) // 这里是给保存的结构数据按字母从小到大排列
{
for (k=i+1;k < j;k++)
{
if (pf->letter > pf->letter)
{
temp = pf;
pf= pf;
pf = temp;
}
}
}
for (i = 0;i < j;i++)// 正常循环输出
{
printf ("%c %.2lf",pf->letter,pf->number);
free(pf);
pf = NULL;
}
printf("\n");
system("pause");
return 0;
} 不理解题意
假如我输入的是
c 1.2 e 2 会输出什么
r 9 w 2.4 t 3 g 0.0 会输出什么?
话说,我这样输入对吗?
如果对那输出是
c 1 e 2
g 0 r 9 t 3 w 2
吗? 人造人 发表于 2016-7-12 22:23
不理解题意
假如我输入的是
c 1.2 e 2 会输出什么
当然不行,首先是大写字母,而且只能是A,或者输入A,B或者输入A,B,C或者输入A,B,C,D(输入不以字母顺序输入)其他显示“输入有误,请重新输入”就行了~ #include<stdio.h>
#include<conio.h>
int main(){
char charity="ABCD";
float number;
scanf("%f%f",number,number+1);
if(number<number)
{
printf("%c%f%c%f\n",charity,*number,charity,*(number+1));
}
else
{
printf("%c%f%c%f\n",charity,*(number+1),charity,*number);
}
getch();
}
只输入数字,不输入字母 晚起鸟儿 发表于 2016-7-13 03:45
当然不行,首先是大写字母,而且只能是A,或者输入A,B或者输入A,B,C或者输入A,B,C,D(输入不以字母顺序输 ...
这样?
A 2.3 C 4.1 D 5.0
B 1.1
D 4.4 A 1.3 C 4.0
输出
A 2.3 C 4.1 D 5.0
B 1.1
A 1.3 C 4.0 D 4.4 人造人 发表于 2016-7-13 09:58
这样?
A 2.3 C 4.1 D 5.0
B 1.1
对呀,这正是我想要的结果,随机输入的哦 小剑剑 发表于 2016-7-13 09:22
只输入数字,不输入字母
这样的不行哦,而且只能比较前两个数,但代码写得很简练 晚起鸟儿 发表于 2016-7-13 12:18
对呀,这正是我想要的结果,随机输入的哦
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MAX_BUFF_LEN 100 // 输入不能超过 50 个字符
#define ALPHABET_NUM 4 //字母个数,在这里是4,即 A B C D
/* real_num_str_len
参数 str :包含有实数的字符串(实数前面可以有空格)
返回值 :
-3(一个很长的实数 )
-2 (实数前面空格太多 )
-1 (字符串中是有实数,但是字符串以字母开始)
函数返回 : 实数字符串的长度(实数前面可以有空格)
举个例子
字符串 " 123.45000 90.0"函数返回15 (从一开始到123.45000 ,0后面)
字符串 " 54.3 abc"函数返回5 (从一开始到54.3, 3后面)
如果字符串不是 实数字符串
例如 字符串 "a 123.30" 字符串中是有实数,但是字符串以字母开始,所以不算,这种情况返回 -1
*/
int real_num_str_len(char const *str)
{
int ret = 0;
int decimal_point_flag = 0; //小数点标志
int ret_bak = 0;
while(*str == ' ')
{
ret++;
if(ret >= 100) // 实数前面空格太多,继续下去可能会死循环
{
return -2;
}
str++;
}
ret_bak = ret; // 备份ret
while(1)
{
if( (*str < '0') || (*str > '9') )
{
switch(*str)
{
case '+' :
case '-' :
break;
case '.' :
if(decimal_point_flag == 1) // 已经有一个小数点了,现在又有一个,就在这里结束吧
{
return ret;
}
else
{
decimal_point_flag = 1;
}
break;
default :
return ret;
}
}
ret++;
str++;
if(ret - ret_bak > 50) // 一个很长的实数,报错吧
{
return -3;
}
}
}
int str_handler(char *buff)
{
char *str_temp;
int block_len = 0; // 一个字符和字符后面的实数分成一个块
int i = 0;
int j = 0;
char *new_buff = NULL;
int blank_space = 0;
int blank_count = 0;
while(1) // 检查字符串,并把字符串分成块放在 str_temp
{
while(buff == ' ') // 去掉每个块前面的空格
{
blank_space++;
if(blank_space >= 100) // 块前面空格太多,继续下去可能会死循环
{
return -3;
}
i++;
}
switch(buff)
{
case '\n' :
goto next;
case 'A' : // no break
case 'B' : // no break
case 'C' : // no break
case 'D' :
block_len = real_num_str_len(&buff);
if(block_len < 0)
{
return -1;
}
block_len++; // 指向下一个块
new_buff = malloc(block_len + 1);
if(new_buff == NULL) // 无法申请内存
{
return -2;
}
strncpy(new_buff, &buff, block_len);
*(new_buff + block_len) = '\0';
str_temp = new_buff;
break;
default : return -1;
}
i += block_len;
blank_count++;
if(buff == '\n') // 已经确定字符串没有问题,并且字符串已经按块放在 str_temp
{
break;
}
}
next:
// 下面开始排序
for(i = 0; i < blank_count - 1; i++)
{
for(j = 0; j < blank_count - i - 1; j++)
{
if(str_temp < str_temp)
{
char *temp = str_temp;
str_temp = str_temp;
str_temp = temp;
}
}
}
//排序完成,现在把str_temp 复制到 buff 就真的完事了
*buff = '\0';
for(i = blank_count - 1; i >= 0; i--)
{
strcat(buff, str_temp);
strcat(buff, " "); // 在两个块之间加入空格
free(str_temp); // 释放通过 malloc 申请的内存
}
return 0;
}
int main(void)
{
char buff;
printf("请输入:");
while(1)
{
fgets(buff, MAX_BUFF_LEN, stdin);
if(str_handler(buff) == 0) //str_handler 返回0 表示字符串没有问题,并且已经排序
{
break;
}
printf("输入有误,请重新输入:");
}
printf("%s\n", buff);
system("pause");
return 0;
}
人造人 发表于 2016-7-14 00:10
vc6.0运行好多报错,请问是不是需要用高些的版本运行,或者您是用VS?
首先肯定一点,与编译器无关,另外你的疑问应该是设计一个程序,可以做到排序功能,这个会涉及到冒泡算法,以后会在鱼c视频里面学到,所以可以先不急
另外如果要实现排序,或比较,最好是将内存储存的数据对掉,而不是更改输出(printf)的顺序,举个例子
char ch1, ch2, ch3, ch4;
scanf("%c%c%c%c",&ch1,&ch2,&ch3,&ch4,);//随机输入例如DBCA
if(...........)
{
.........................//算法代码段,用于将&ch1,&ch2,&ch3,&ch4的内容换成ABCD
}
printf("%c%c%c%c\n",ch1, ch2, ch3, ch4);//显示器输出ABCD,输出顺序是不应该改变的,
也不确定你是否理解,以为我之前看你的思路是改变输出顺序,而没有想其实应该改变储存顺序才对 晚起鸟儿 发表于 2016-7-14 06:17
vc6.0运行好多报错,请问是不是需要用高些的版本运行,或者您是用VS?
#include <stdlib.h>
加上这个,我是用 c-free 不加 #include <stdlib.h> 也能啊
你加上这个试试 人造人 发表于 2016-7-14 12:34
#include
加上这个,我是用 c-free 不加 #include也能啊
你加上这个试试
加了还是报错
D:\Microsoft Visual Studio\MyProjects\tiao\tiao.c(29) : error C2084: function 'int __cdecl real_num_str_len(const char *)' already has a body
D:\Microsoft Visual Studio\MyProjects\tiao\tiao.c(84) : error C2084: function 'int __cdecl str_handler(char *)' already has a body
D:\Microsoft Visual Studio\MyProjects\tiao\tiao.c(181) : error C2084: function 'int __cdecl main(void )' already has a body
执行 cl.exe 时出错.
程序好复杂,看不懂的说,辛苦了~ donkkong 发表于 2016-7-14 11:49
首先肯定一点,与编译器无关,另外你的疑问应该是设计一个程序,可以做到排序功能,这个会涉及到冒泡算法, ...
if(......)最后一个不用判断也有十二种可能呀,当然这样比较直观,但是代码量还要冗长得多……
我的想法是设定A>B>C>D,然后查找这四个字母的位置,按从小到大顺序排列,不知是否要用到ascll码,
具体怎样写也弄不来呀~ 晚起鸟儿 发表于 2016-7-14 14:32
加了还是报错
D:\Microsoft Visual Studio\MyProjects\tiao\tiao.c(29) : error C2084: function 'int _ ...
c-free 下没有问题,vs2015 下也没有问题,
你好像是多写了一份,把现在的程序删除(如果需要,请备份),重新复制这个
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#define MAX_BUFF_LEN 100 // 输入不能超过 50 个字符
#define ALPHABET_NUM 4 //字母个数,在这里是4,即 A B C D
/* real_num_str_len
参数 str :包含有实数的字符串(实数前面可以有空格)
返回值 :
-3(一个很长的实数 )
-2 (实数前面空格太多 )
-1 (字符串中是有实数,但是字符串以字母开始)
函数返回 : 实数字符串的长度(实数前面可以有空格)
举个例子
字符串 " 123.45000 90.0"函数返回15 (从一开始到123.45000 ,0后面)
字符串 " 54.3 abc"函数返回5 (从一开始到54.3, 3后面)
如果字符串不是 实数字符串
例如 字符串 "a 123.30" 字符串中是有实数,但是字符串以字母开始,所以不算,这种情况返回 -1
*/
int real_num_str_len(char const *str)
{
int ret = 0;
int decimal_point_flag = 0; //小数点标志
int ret_bak = 0;
while(*str == ' ')
{
ret++;
if(ret >= 100) // 实数前面空格太多,继续下去可能会死循环
{
return -2;
}
str++;
}
ret_bak = ret; // 备份ret
while(1)
{
if( (*str < '0') || (*str > '9') )
{
switch(*str)
{
case '+' :
case '-' :
break;
case '.' :
if(decimal_point_flag == 1) // 已经有一个小数点了,现在又有一个,就在这里结束吧
{
return ret;
}
else
{
decimal_point_flag = 1;
}
break;
default :
return ret;
}
}
ret++;
str++;
if(ret - ret_bak > 50) // 一个很长的实数,报错吧
{
return -3;
}
}
}
int str_handler(char *buff)
{
char *str_temp;
int block_len = 0; // 一个字符和字符后面的实数分成一个块
int i = 0;
int j = 0;
char *new_buff = NULL;
int blank_space = 0;
int blank_count = 0;
while(1) // 检查字符串,并把字符串分成块放在 str_temp
{
while(buff == ' ') // 去掉每个块前面的空格
{
blank_space++;
if(blank_space >= 100) // 块前面空格太多,继续下去可能会死循环
{
return -3;
}
i++;
}
switch(buff)
{
case '\n' :
goto next;
case 'A' : // no break
case 'B' : // no break
case 'C' : // no break
case 'D' :
block_len = real_num_str_len(&buff);
if(block_len < 0)
{
return -1;
}
block_len++; // 指向下一个块
new_buff = malloc(block_len + 1);
if(new_buff == NULL) // 无法申请内存
{
return -2;
}
strncpy(new_buff, &buff, block_len);
*(new_buff + block_len) = '\0';
str_temp = new_buff;
break;
default : return -1;
}
i += block_len;
blank_count++;
if(buff == '\n') // 已经确定字符串没有问题,并且字符串已经按块放在 str_temp
{
break;
}
}
next:
// 下面开始排序
for(i = 0; i < blank_count - 1; i++)
{
for(j = 0; j < blank_count - i - 1; j++)
{
if(str_temp < str_temp)
{
char *temp = str_temp;
str_temp = str_temp;
str_temp = temp;
}
}
}
//排序完成,现在把str_temp 复制到 buff 就真的完事了
*buff = '\0';
for(i = blank_count - 1; i >= 0; i--)
{
strcat(buff, str_temp);
strcat(buff, " "); // 在两个块之间加入空格
free(str_temp); // 释放通过 malloc 申请的内存
}
return 0;
}
int main(void)
{
char buff;
printf("请输入:");
while(1)
{
fgets(buff, MAX_BUFF_LEN, stdin);
if(str_handler(buff) == 0) //str_handler 返回0 表示字符串没有问题,并且已经排序
{
break;
}
printf("输入有误,请重新输入:");
}
printf("%s\n", buff);
system("pause");
return 0;
}
晚起鸟儿 发表于 2016-7-14 14:32
加了还是报错
D:\Microsoft Visual Studio\MyProjects\tiao\tiao.c(29) : error C2084: function 'int _ ...
你遇到的问题其他人也遇到了,看https://www.so.com/s?q=function+%27int+__cdecl+main(void+)%27+already+has+a+body&src=srp&fr=360chrome_toolbar_search&psid=c1bfa9aec646690ec81dffd45aaeb109
建议换一个编译系统吧,vc6适合初学者,你不是初学者吧,vs 2015 ,c-free都很不错 人造人 发表于 2016-7-14 15:29
c-free 下没有问题,vs2015 下也没有问题,
你好像是多写了一份,把现在的程序删除(如果需要,请备份) ...
还是不行,删了重新复制粘贴也不行,我的是VC++6.0,没有多写,一样是206行 晚起鸟儿 发表于 2016-7-14 15:43
还是不行,删了重新复制粘贴也不行,我的是VC++6.0,没有多写,一样是206行
http://www.tuxi.com.cn/888-11825-118252201.html 人造人 发表于 2016-7-14 15:44
http://www.tuxi.com.cn/888-11825-118252201.html
说实在的,我觉得您程序写得太复杂,虽然注释很详细,但我这菜鸟还是无法理解,应该可以更简单些的,c-free以前下载过,因为是跟鱼总视频练习,鱼总用VC6,没英文基础的菜鸟我无法适应用别的软件~ 晚起鸟儿 发表于 2016-7-15 13:32
说实在的,我觉得您程序写得太复杂,虽然注释很详细,但我这菜鸟还是无法理解,应该可以更简单些的,c-fr ...
为了程序的健壮性,这样是值得的,想想一个程序因为用户的错误输入或是故意刁难的输入,程序就死机或是莫名其妙的输出,我无法忍受这样的结果,还有c-free 可以是中文的呀
页:
[1]
2