c语言互质问题_C语言 充值金额问题

原问题:C语言 充值金额问题
分类:编程开发 > 最后更新时间:【2016-12-15 05:07:37】
问题补充:

如图,要判断输入的金额是否正确,判断条件怎么写?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小数。
    最佳答案由网友  grass_rt  提供
  • 公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
    19

    分享到:

    其他回答

    暂无其它回答!

      推荐