c语言互质问题_C语言 充值金额问题
如图,要判断输入的金额是否正确,判断条件怎么写?1.输入负数2.输入字母加数字,如ab1003.输入数字加字母,如100ab速求一个大神

最佳答案
题主的问题其实并不太难,需要逐位访问字符串数组即可。
我设计了一段代码,能够免除题主判断字符串中是否有字母的烦恼,只能输入:
1. 数字(不允许输入字母);
2. 最多一个小数点;
3. Backspace退格键,用于修改输入信息;
4. Enter回车键,用于终止输入数字。
缺陷有:
1. 没有实现Delete键删除操作;
2. 没有实现←光标向左移动和→光标向右移动的功能。
因此下面的信息不可能在我设计的程序中被录入:
0123
0.1.2.3
abc123
123abc
下面是我设计的代码。请注意,核心功能集中在最下方input_num( ) 函数的定义中:

/**
Filename: recharge.c
Author : grass_rt
*/
#include <stdio.h>
#include <conio.h> // 使用getch( )函数
#include <stdlib.h> // 使用atof( ) 函数
#define YES (1)
#define NO (0)
#define MAX (51) // 表示存储数字的字符串的最大长度
#define INFINITE (-1) // 表示小数点后的小数位数不受限制
#define FLOAT_LIMIT (2) // 本程序中小数点后只允许出现2位
/**
double input_num(const int max_len, const int float_limit);
作用:
返回用户输入的金额
输入参数:
1. int max_len :数字的最大长度。
2. int float_limit:小数的最大长度,在本程序中允许输入小数位是2位
输入FLOAT_LIMIT表示没有限制。
返回值:
用户输入的金额
*/
double input_num(int max_len, int float_limit);
int main(void) {
double cash;
printf("How many to recharge: ");
cash = input_num(MAX, FLOAT_LIMIT);
printf("You have recharged $%g.\n", cash);
system("pause");
return 0;
}
double input_num(const int max_len, const int float_limit) {
int c; // 用于接收用户输入
int len = 0; // 统计用户输入字符串的长度
int float_flag = NO; // 用户是否输入了小数点
int end_flag = NO; // 用户是否输入结束
int zero_flag = NO; // 防止用户在开始处输入多个0
int float_len = 0; // 用户已经输入的小数位数
char buf[max_len] = {'\0', }; // 用于记录用户输入的字符串
while(NO == end_flag) {
c = getch();
switch(c) {
// 当输入小数点时
case '.':
// 如果输入小数点
if (NO == float_flag) {
zero_flag = NO; // 则可以输入数字
float_flag = YES; // 确认当前数字是小数
} else {
// 不允许重复输入小数点
continue;
}
// 当输入数字时
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
// 如果第1位是0,则不能输入任何数字
// 或者当浮点数长度超过规定的限制,也不能输入任何数字
if (YES == zero_flag || (float_len > float_limit && INFINITE != float_limit))
continue;
else {
// 如果第1位是0,则设置标识符
if ('0' == c && 0 == len)
zero_flag = YES;
// 如果是小数状态,则增加小数长度
if (YES == float_flag)
float_len++;
break;
}
// 当输入Backspace时
case '\b':
// 不能删除启点之前的字符
if (len > 0) {
// 如果删除到小数点则取消小数标记
if ('.' == buf[len]) {
float_flag = NO;
// 如果此时第1位是0,则不允许输入数字
if ('0' == buf[0])
zero_flag = YES;
}
// 如果是小数状态,需要减少小数长度
if (YES == float_flag)
float_len--;
// 减少总长度
--len;
printf("\b \b");
}
continue;
// 当输入Enter,结束金额输入
case '\r':
case '\n':
end_flag = YES;
// 填充字符串结束标记
buf[len] = '\0';
putchar('\n');
continue;
// 其他字符不作处理
default:
continue;
}
// 如果输入没有超长则记录用户输入到字符串并进行显示
if (len < max_len) {
buf[len++] = c;
putchar(c);
}
}
// 将字符串转换为double
return atof(buf);
}
追答:有一点忘记在声明中写清:在这段程序中,如果输入的第一个字符是0,那么第二个字符只允许输入小数点和Backspace。这是因为,如果第一个字符是0,那么输入任何数字都会显得很“怪”。比如: 0123 000123 01.23所以,我在功能上做了这种设计。
顺便说一下getch( )函数,这个函数需要加载conio.h才能使用。它只接收用户输入,但是并不会将用户输入的信息“返显”到屏幕上。这也就是我能够“屏蔽”用户输入的原因。需要注意的是,该函数的这种特性只能在Windows平台才能实现。在Linux平台下,getch( )与getchar( )函数没有区别。至于atof( )函数,需要加载stdlib.h。能够将字符串转换为double小数。
其他回答
暂无其它回答!