C语言项目,功能8,9不能正常实现,求修改,按如图要求 30C

图片说明
#include "stdio.h"
#include "string.h"//字符串函数
#include "stdlib.h"
#include"stdbool.h"
long Fact(int n);
long FactSum(int v);
//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数
void displaymain()//显示主菜单
{
printf("*******************\n");
printf("简易计算器\n");
printf("*******************\n");
printf("请选择\n");
printf("1:加法\n");
printf("2:减法\n");
printf("3:乘法\n");
printf("4:除法\n");
printf("5:求余\n");
printf("6:累加\n");
printf("7:阶乘\n");
printf("8:阶乘累加\n");
printf("9:退出系统\n");
}
void password()
{
int i=0,temp;
bool login_status=false;
char password[10]={0}; //声明一个最多有十个元素的数组,并且初始化值为0;
//for(i=0;i {
for(i=0;i<3;i++)
{
printf("请输入密码:");
scanf("%s",password);//输入密码(字符串)
if(strcmp("19491001",password)==0)
{
login_status=true;
break;
}else printf("密码错误,重新输入");
}

if(true==login_status)//strcmp:比较两个字符串是否一样
{
printf("登陆成功\n");
int choice,flag=0;
void displaymain();
void plus();
void minus();
void multiply();
void divide();
void complementation();
void accumulation();
int factorial();
int factorialSum();
while(flag==0)
{
putchar('\n');
displaymain();
printf("please input a digital(1-7)\n");
scanf("%d",&choice);
if(choice>=1&&choice<=7)
switch(choice)
{
case 1:plus();break;
case 2:minus();break;
case 3:multiply();break;
case 4:divide();break;
case 5:complementation();break;
case 6:accumulation();break;
case 7:factorial();break;
case 8:factorialSum();break;
default:printf("选项输入错误!\n");
}
else
{
printf("your inputs is error!\n");flag=1;
}
}
getch();
//菜单

}
else
{
    printf("密码错误超过三次\n");
}

}

void plus()
{
double a,b,temp;
printf("请输入以空格分隔的两个运算数:\n");
scanf("%lf %lf",&a,&b);
temp=a+b;
printf("结果是:%lf",temp);
}
void minus()
{
double a,b,temp;
printf("请输入被减数与减数(并用空格隔开):\n");
scanf("%lf %lf",&a,&b);
temp=a-b;
printf("结果是:%f",temp);
}
void multiply()
{
double a,b,temp;
printf("请输入以空格分隔的两个运算数:\n");
scanf("%lf %lf",&a,&b);
temp=a*b;
printf("结果是:%f",temp);
}
void divide()
{
double a,b,temp;
printf("请输入被除数与除数(并用空格隔开):\n");
scanf("%lf %lf",&a,&b);
if(b!=0)
{
temp=a/b;
printf("结果是:%f",temp);
}

else
printf("错误!\n");
}

void complementation()
{
int a,b,temp;
printf("请输入两个用空格隔开的运算数:\n");
scanf("%d %d",&a,&b);
if(b!=0)
{
temp=a%b;
printf("结果是:%d",temp);
}
else
printf("错误!\n");
}
void accumulation()
{
int n,temp;
int a,sum=1;
printf("请输入要求累加的数值:\n");
scanf("%d",&n);
for(a=2;a<=n;a++)
{
sum+=a;
}
temp=sum;
printf("累加和为:%d\n",temp);
}
int factorial()
{
int m;
long ret,temp;
printf("请输入想求的阶乘数:");
scanf("%d",&m);
ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret
if(ret==-1)
printf("输入错误!\n");
else
{
temp=ret;
printf("结果是:%d",temp);
}

return 0;
}
long Fact(int n)//函数的定义(作用:计算输入阶乘数的阶乘,并将结果返回主函数,且当n<0时,返回-1)
{
int i;
long result = 1;
if(n<0)
{
return -1;
}
else
{
for(i = 2;i<=n;i++)
{
result*=i;
}
return result;
}
}
int factorialSum()
{
int m;
long ret,temp;
printf("请输入想求的阶乘和数:");
scanf("%d",&m);
ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret
if(ret==-1)
printf("输入错误!\n");
else
temp=ret;
return 0;
}
long FactSum(int v)//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数,且当n<0时,返回-1)
{
int i;
long result=1,j = 1;
if(v<0)
{
return -1;
}
else
{
for(i = 2;i<=v;i++)
{
j*=i;
result+=j;
}
return result;
}
}
void main()
{
int temp;
password();
printf("运行结束");
}

3个回答

比较直白的写法, 阶乘和阶乘和可以这样写

// 计算机long最大也只能存储10!, 因此递归实现最多调用10次,不会有问题
long Fact(unsigned n) {
    if (n == 0) {
        return 1;
    } else {
        return n * Fact(n - 1);
    }
}

long FactSum(unsigned n) {
    if( n == 0) {
        return Fact(0);
    } else {
        return Fact(n) + FactSum();
    }
}

对于你的代码可以这样改

long FactSum(int v) {
    int i;
    long result=1,j = 1;
    // 因为调用方需要判断返回值-1, 所以可以在调用方factorialSum判断保证 v >= 0 
    if(v<0)
    {
        return -1;
    } else {
        // FactSum(v) = 0! + 1! + 2! + ... + v!
        // 而默认result = 0! = 1
        // 所以i的初始条件应该是1
        for(i = 1;i<=v;i++)
        {
            j*=i;
            result+=j;
        }
        return result;
    }
}
qq_27183003
ysuwood 回复Be in hell: 奖赏高,拿到代码就跑?
大约 2 个月之前 回复
LXR20011008
Be in hell 回复神隐的小蝴蝶: 8和9都不能正常运行
3 个月之前 回复
m0_37954686
神隐的小蝴蝶 回复Be in hell: 怎么个不对法?什么输入?
3 个月之前 回复
LXR20011008
Be in hell 回复神隐的小蝴蝶: 把7改成9可还是不对
3 个月之前 回复
LXR20011008
Be in hell 回复神隐的小蝴蝶: 哦哦,我再试试
3 个月之前 回复
m0_37954686
神隐的小蝴蝶 回复Be in hell: if(choice>=1&&choice<=7) 因为你这个判断吧8排除在外了呀
3 个月之前 回复
LXR20011008
Be in hell 运行出来后,8是异常的
3 个月之前 回复
LXR20011008
Be in hell 还是不对
3 个月之前 回复
#include "stdio.h"
#include "string.h"//字符串函数
#include "stdlib.h"
#include <conio.h>

long Fact(int n);
long FactSum(int v);
//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数
void displaymain()//显示主菜单
{
    printf("*******************\n");
    printf("简易计算器\n");
    printf("*******************\n");
    printf("请选择\n");
    printf("1:加法\n");
    printf("2:减法\n");
    printf("3:乘法\n");
    printf("4:除法\n");
    printf("5:求余\n");
    printf("6:累加\n");
    printf("7:阶乘\n");
    printf("8:阶乘累加\n");
    printf("9:退出系统\n");
}
void password()
{
    int i=0,temp;
    bool login_status=false;
    char password[10]={0}; //声明一个最多有十个元素的数组,并且初始化值为0;
    //for(i=0;i {
    for(i=0;i<3;i++)
    {
        printf("请输入密码:");
        scanf("%s",password);//输入密码(字符串)
        if(strcmp("19491001",password)==0)
        {
            login_status=true;
            break;
        }else printf("密码错误,重新输入");
    }
    if(true==login_status)//strcmp:比较两个字符串是否一样
    {
        printf("登陆成功\n");
        int choice,flag=0;
        void displaymain();
        void plus();
        void minus();
        void multiply();
        void divide();
        void complementation();
        void accumulation();
        int factorial();
        int factorialSum();
        while(flag==0)
        {
            putchar('\n');
            displaymain();
            printf("please input a digital(1-9)\n");
            scanf("%d",&choice);
            if(choice>=1&&choice<=9)//修改
                switch(choice)
            {
                case 1:plus();break;
                case 2:minus();break;
                case 3:multiply();break;
                case 4:divide();break;
                case 5:complementation();break;
                case 6:accumulation();break;
                case 7:factorial();break;
                case 8:factorialSum();break;
                case 9: flag = 1; break;//增加
                default:printf("选项输入错误!\n");
            }
            else
            {
                printf("your inputs is error!\n");flag=1;
            }
        }
        getch();
        //菜单
    }
    else
    {
        printf("密码错误超过三次\n");
    }
}
void plus()
{
    double a,b,temp;
    printf("请输入以空格分隔的两个运算数:\n");
    scanf("%lf %lf",&a,&b);
    temp=a+b;
    printf("结果是:%lf",temp);
}
void minus()
{
    double a,b,temp;
    printf("请输入被减数与减数(并用空格隔开):\n");
    scanf("%lf %lf",&a,&b);
    temp=a-b;
    printf("结果是:%f",temp);
}
void multiply()
{
    double a,b,temp;
    printf("请输入以空格分隔的两个运算数:\n");
    scanf("%lf %lf",&a,&b);
    temp=a*b;
    printf("结果是:%f",temp);
}
void divide()
{
    double a,b,temp;
    printf("请输入被除数与除数(并用空格隔开):\n");
    scanf("%lf %lf",&a,&b);
    if(b!=0)
    {
        temp=a/b;
        printf("结果是:%f",temp);
    }
    else
        printf("错误!\n");
}
void complementation()
{
    int a,b,temp;
    printf("请输入两个用空格隔开的运算数:\n");
    scanf("%d %d",&a,&b);
    if(b!=0)
    {
        temp=a%b;
        printf("结果是:%d",temp);
    }
    else
        printf("错误!\n");
}
void accumulation()
{
    int n,temp;
    int a,sum=1;
    printf("请输入要求累加的数值:\n");
    scanf("%d",&n);
    for(a=2;a<=n;a++)
    {
        sum+=a;
    }
    temp=sum;
    printf("累加和为:%d\n",temp);
}
int factorial()
{
    int m;
    long ret,temp;
    printf("请输入想求的阶乘数:");
    scanf("%d",&m);
    ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret
    if(ret==-1)
        printf("输入错误!\n");
    else
    {
        temp=ret;
        printf("结果是:%ld",temp);
    }
    return 0;
}
long Fact(int n)//函数的定义(作用:计算输入阶乘数的阶乘,并将结果返回主函数,且当n<0时,返回-1)
{
    int i;
    long result = 1;
    if(n<0)
    {
        return -1;
    }
    else
    {
        for(i = 2;i<=n;i++)
        {
            result*=i;
        }
        return result;
    }
}
int factorialSum()
{
    int m;
    long ret;
    printf("请输入想求的阶乘和数:");
    scanf("%d",&m);
    ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret
    if(ret==-1)
        printf("输入错误!\n");
    else
        printf("结果:%ld\n", ret);//修改
    return 0;
}
long FactSum(int v)//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数,且当n<0时,返回-1)
{
    int i;
    long result=1,j = 1;
    if(v<0)
    {
        return -1;
    }
    else
    {
        for(i = 2;i<=v;i++)
        {
            j*=i;
            result+=j;
        }
        return result;
    }
}
void main()
{
    password();
    printf("运行结束!");
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问