讨教问题,函数返回不成功

C语言 码拜 9年前 (2016-04-19) 820次浏览
#include <stdio.h>
#include <windows.h>
void meum(void);
double xuanze(char ch);
int main(void)
{
    const int jbsj = 40;
    const double jb = 1.5;
    const double shui15 = 0.15;
    const double shui20 = 0.20;
    const double shui25 = 0.25;
    const int jd1 = 300;
    const int jd2 = 450;
    double sj, base, gz, shui, jgz;
    char ch;
    meum();
    while((ch = getchar()) != "q")
    base = xuanze(ch);
    printf("请输入您工作的时间: \n");
//  while ((scanf_s("%lf", &sj)) == 1.00) {
    while ((sj = getchar()) != "q"){
        if (sj > jbsj)
            sj = 40 + (sj - 40)*1.5;
        gz = sj * base;
        if (gz <= 300) {
            shui = gz * shui15;
            jgz = gz - shui;
        }
        else if (gz <= 450) {
            shui = jd1 * shui15 + (gz - jd1) * shui20;
            jgz = gz - shui;
        }
        else {
            shui = jd1 * shui15 + (jd2 - jd1) * shui20 + (gz - jd1) * shui25;
            jgz = gz - shui;
        }
        printf("您的工资为%.2f,税金为%.2f,净工资为%.2f.\n\n\n", gz, shui, jgz);
        fflush(stdin);
        meum();
    }
    system("pause");
    return 0;
}
void meum(void)
{
    printf("*************************************************************************\n");
    printf("a)$8.75/hr                          b)$9.33/hr\n");
    printf("c)$10.00/hr                         d)$11.20/hr\n");
    printf("q)quit  \n");
    printf("*************************************************************************\n");
    printf("请根据以上选项输入您的每小时的基本工资(q to quit): ");
}
double xuanze(char ch)
{
    double base;
    switch (ch) {
        case "a": base = 8.75; break;
        case "b": base = 9.33; break;
        case "c": base = 10.00; break;
        case "d": base = 11.20; break;
        default: printf("请输入a、b、c、d,q to quit.\n"); break;
    }
    printf("您的基本工资为%.2f/H.\n", base);
    return base;
}

个人感觉的问题在于:
1、xuanze()函数中提取的char值应该为:本人输入的a\b\c\d\q\及回车键,因此每次都是:
“您的基本工资为.
请输入a、b。”
2、不知道为什么此函数循环不正确。
请各位高手指点。

解决方案

10

1.第18行这样用不行while((ch = getchar()) != “q”)
2.第22行之后的while循环里面的逻辑也需要稍微改下

#include <stdio.h>
#include <windows.h>
void meum(void);
double xuanze(char ch);
int main(void)
{
    const int jbsj = 40;
    const double jb = 1.5;
    const double shui15 = 0.15;
    const double shui20 = 0.20;
    const double shui25 = 0.25;
    const int jd1 = 300;
    const int jd2 = 450;
    double sj, base, gz, shui, jgz;
    char ch;
 
    meum();
    if((ch = getchar()) != "q")
		base = xuanze(ch);
    printf("请输入您工作的时间: \n");
//  while ((scanf_s("%lf", &sj)) == 1.00) {
    while (ch != "q"){

		scanf("%lf", &sj);
        if (sj > jbsj)
            sj = 40 + (sj - 40)*1.5;
        gz = sj * base;
        if (gz <= 300) {
            shui = gz * shui15;
            jgz = gz - shui;
        }
        else if (gz <= 450) {
            shui = jd1 * shui15 + (gz - jd1) * shui20;
            jgz = gz - shui;
        }
        else {
            shui = jd1 * shui15 + (jd2 - jd1) * shui20 + (gz - jd1) * shui25;
            jgz = gz - shui;
        }
        printf("您的工资为%.2f,税金为%.2f,净工资为%.2f.\n\n\n", gz, shui, jgz);
 
        fflush(stdin);
        meum();
		ch = getchar();
		if(ch == "q")
			break;
		base = xuanze(ch);

    }
    system("pause");
    return 0;
}
 
void meum(void)
{
    printf("*************************************************************************\n");
    printf("a)$8.75/hr                          b)$9.33/hr\n");
    printf("c)$10.00/hr                         d)$11.20/hr\n");
    printf("q)quit  \n");
    printf("*************************************************************************\n");
    printf("请根据以上选项输入您的每小时的基本工资(q to quit): ");
}
 
double xuanze(char ch)
{
    double base;
    switch (ch) {
        case "a": base = 8.75; break;
        case "b": base = 9.33; break;
        case "c": base = 10.00; break;
        case "d": base = 11.20; break;
        default: printf("请输入a、b、c、d,q to quit.\n"); break;
    }
    printf("您的基本工资为%.2f/H.\n", base);
    return base;
}

5

将第二层while循环放到第一层循环之中,如下:

while((ch = getchar()) != "q"){
    base = xuanze(ch);
    printf("请输入您工作的时间: \n");
//  while ((scanf_s("%lf", &sj)) == 1.00) {
    while ((sj = getchar()) != "q"){
        if (sj > jbsj)
            sj = 40 + (sj - 40)*1.5;
        gz = sj * base;
        if (gz <= 300) {
            shui = gz * shui15;
            jgz = gz - shui;
        }
        else if (gz <= 450) {
            shui = jd1 * shui15 + (gz - jd1) * shui20;
            jgz = gz - shui;
        }
        else {
            shui = jd1 * shui15 + (jd2 - jd1) * shui20 + (gz - jd1) * shui25;
            jgz = gz - shui;
        }
        printf("您的工资为%.2f,税金为%.2f,净工资为%.2f.\n\n\n", gz, shui, jgz);
 
        fflush(stdin);
        meum();
    }
}

另外,你输入的时间为什么要和‘q’比较,这样没什么意义吧。
时间可以以 scanf(“%lf”,&sj) 的形式输入,不过要在输入之前清空一下缓冲区,即应该是:
fflush(stdin);
scanf(“%lf”,&sj);

10

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。

//请今后要用
int c;
scanf("%c",&c);
//时,都改为
char s[2];
int c;
scanf("%1s",s);
c=s[0];

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨教问题,函数返回不成功
喜欢 (0)
[1034331897@qq.com]
分享 (0)