鱼C论坛

 找回密码
 立即注册
查看: 2530|回复: 28

[已解决]做个复杂的东西

[复制链接]
匿名鱼油
匿名鱼油  发表于 2023-2-17 17:11:44 |阅读模式
50鱼币
语言:最好是c语言
要求
1.三则加减运算是他的核心  如1+1+2=4 或1+1-1=1 符号不能固定,数字随机
2.前三个数不大于10 结果不能大于20小于0
3无条件循环100个,不能重复
4.询问是否导出,导出放桌面
5.输入答案就显示答案
可以不必全完成
但1.2.3必需完成
最佳答案
2023-2-17 17:11:45
本帖最后由 ExiaGN001 于 2023-2-19 11:10 编辑

我就说下思路。
1.符号用随机数生成,1代表+,0代表-
随机数初始化 srand(time(NULL))调用rand()

2./3.
对于第i次生成,做以下操作:
通过rand()%10得到三个参数的值
通过rand()&1得到两个运算符
根据三个参数和运算符计算表达式,看结果是否满足条件
如果不满足条件,直接continue,i不变
否则遍历答案数组前i-1个个元素,检查是否重复(答案数组是100*6的二维数组,6个位置分别是3个参数,两个运算符和一个(正确的)计算结果)
如果有重复,直接continue,i不变
不然i自增1,将这回的结果计入答案数组

4.
如果导出,首先获取用户名(这个要用到winapi部分的函数)
然后用用户名按照这个格式生成桌面路径(仅限Windows)
C:\Users\[用户名]\Desktop
斜杠不分正反,字母不区分大小写

//如果程序就在桌面不用生成桌面路径,直接fopen([文件名],"r");
利用fopen和fprintf输出上文的答案数组即可
记得fclose

5.预先把答案算出来,和输入值比较即可。
#include<bits/stdc++.h>
#include<windows.h>
#include<shlobj.h>
using namespace std;
int ans[105][6];//最后的结果
int tmp[6];//当前查看的结果
/*
ans 和tmp的存储格式
0                1                2                3                4                5
操作数1        运算符1        操作数2        运算符2 操作数3 结果
*/
int cnt=0;
const int maxnum=10,minnum=0;

inline int create_optr()//生成一个运算符
{
        return rand()%2;//0代表+ 1代表-
}

inline int create_num()//生成一个操作数
{
        return rand()%(maxnum-minnum)+minnum;//maxnum=10 minnum=0
}

string getDesktopPath()//获取桌面位置
{
    LPITEMIDLIST pidl;
    LPMALLOC pShellMalloc;
    char szDir[200];
    if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
    {
        if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl))) {
            // 如果成功返回true
            SHGetPathFromIDListA(pidl, szDir);
            pShellMalloc->Free(pidl);
        }
        pShellMalloc->Release();
    }

    return string(szDir);
}

int get_ans()//根据随机出来的操作数确定答案
{
        int tmpans=tmp[0];
        if(tmp[1])tmpans-=tmp[2];
        else tmpans+=tmp[2];
        if(tmp[3])tmpans-=tmp[4];
        else tmpans+=tmp[4];
        return tmpans;


}
bool check_dupi()//查重/查合法
{
        if(tmp[5]<0||tmp[5]>20)return 0;
        int issame;//is_same是关键字,所以没加下划线
        for(int i=0;i<cnt;i++)
        {
                issame=0;
                for(int j=0;j<6;j++)
                {
                        issame+=(ans[i][j]==tmp[j]);
                }
                if(issame==6)return 0;//只要有一个匹配就返回0
        }
        return 1;
}
void output()//向终端
{
        for(int i=0;i<100;i++)
        {
                printf("%d %c %d %c %d = %d\n",
                        ans[i][0],(ans[i][1]?'-':'+'),
                        ans[i][2],(ans[i][3]?'-':'+'),
                        ans[i][4],ans[i][5]);
        }
}
bool output_desktop()//检查结果
{
        string pth=getDesktopPath();
        char path[275];//Windows系统路径长度上限260,开275足够
        for(int i=0;i<pth.size();i++)path[i]=pth[i];
        path[pth.size()]='\0';
        strcat(path,"\problem.txt");
        cout<<path<<"\n";
        FILE *fp=fopen(path,"w");
        for(int i=0;i<100;i++)
        {
                fprintf(fp,"%d %c %d %c %d = %d\n",
                        ans[i][0],(ans[i][1]?'-':'+'),
                        ans[i][2],(ans[i][3]?'-':'+'),
                        ans[i][4],ans[i][5]);

        }
        fclose(fp);
        char code[314]="start ";
        strcat(code,path);
        system(code);

}

int main()
{
        srand(time(NULL));
        while(cnt<100)
        {
                tmp[0]=create_num();
                tmp[1]=create_optr();
                tmp[2]=create_num();
                tmp[3]=create_optr();
                tmp[4]=create_num();
                tmp[5]=get_ans();
                if(check_dupi())
                {
                        for(int i=0;i<6;i++)
                        {
                                ans[cnt][i]=tmp[i];
                        }
                        cnt++;
                }
        }
        //output();
        cout<<"是否导出(Y/N)?";
        char optr;
        cin>>optr;
        if(optr%32+64=='Y')
                output_desktop();
        else
                ;//啥都不干
        
        return 0;
}


最佳答案

查看完整内容

我就说下思路。 1.符号用随机数生成,1代表+,0代表- 随机数初始化 srand(time(NULL))调用rand() 2./3. 对于第i次生成,做以下操作: 通过rand()%10得到三个参数的值 通过rand()&1得到两个运算符 根据三个参数和运算符计算表达式,看结果是否满足条件 如果不满足条件,直接continue,i不变 否则遍历答案数组前i-1个个元素,检查是否重复(答案数组是100*6的二维数组,6个位置分别是3个参数,两个运算符和一个(正确的)计 ...
回复

使用道具 举报

发表于 2023-2-17 17:11:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ExiaGN001 于 2023-2-19 11:10 编辑

我就说下思路。
1.符号用随机数生成,1代表+,0代表-
随机数初始化 srand(time(NULL))调用rand()

2./3.
对于第i次生成,做以下操作:
通过rand()%10得到三个参数的值
通过rand()&1得到两个运算符
根据三个参数和运算符计算表达式,看结果是否满足条件
如果不满足条件,直接continue,i不变
否则遍历答案数组前i-1个个元素,检查是否重复(答案数组是100*6的二维数组,6个位置分别是3个参数,两个运算符和一个(正确的)计算结果)
如果有重复,直接continue,i不变
不然i自增1,将这回的结果计入答案数组

4.
如果导出,首先获取用户名(这个要用到winapi部分的函数)
然后用用户名按照这个格式生成桌面路径(仅限Windows)
C:\Users\[用户名]\Desktop
斜杠不分正反,字母不区分大小写

//如果程序就在桌面不用生成桌面路径,直接fopen([文件名],"r");
利用fopen和fprintf输出上文的答案数组即可
记得fclose

5.预先把答案算出来,和输入值比较即可。
#include<bits/stdc++.h>
#include<windows.h>
#include<shlobj.h>
using namespace std;
int ans[105][6];//最后的结果
int tmp[6];//当前查看的结果
/*
ans 和tmp的存储格式
0                1                2                3                4                5
操作数1        运算符1        操作数2        运算符2 操作数3 结果
*/
int cnt=0;
const int maxnum=10,minnum=0;

inline int create_optr()//生成一个运算符
{
        return rand()%2;//0代表+ 1代表-
}

inline int create_num()//生成一个操作数
{
        return rand()%(maxnum-minnum)+minnum;//maxnum=10 minnum=0
}

string getDesktopPath()//获取桌面位置
{
    LPITEMIDLIST pidl;
    LPMALLOC pShellMalloc;
    char szDir[200];
    if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
    {
        if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl))) {
            // 如果成功返回true
            SHGetPathFromIDListA(pidl, szDir);
            pShellMalloc->Free(pidl);
        }
        pShellMalloc->Release();
    }

    return string(szDir);
}

int get_ans()//根据随机出来的操作数确定答案
{
        int tmpans=tmp[0];
        if(tmp[1])tmpans-=tmp[2];
        else tmpans+=tmp[2];
        if(tmp[3])tmpans-=tmp[4];
        else tmpans+=tmp[4];
        return tmpans;


}
bool check_dupi()//查重/查合法
{
        if(tmp[5]<0||tmp[5]>20)return 0;
        int issame;//is_same是关键字,所以没加下划线
        for(int i=0;i<cnt;i++)
        {
                issame=0;
                for(int j=0;j<6;j++)
                {
                        issame+=(ans[i][j]==tmp[j]);
                }
                if(issame==6)return 0;//只要有一个匹配就返回0
        }
        return 1;
}
void output()//向终端
{
        for(int i=0;i<100;i++)
        {
                printf("%d %c %d %c %d = %d\n",
                        ans[i][0],(ans[i][1]?'-':'+'),
                        ans[i][2],(ans[i][3]?'-':'+'),
                        ans[i][4],ans[i][5]);
        }
}
bool output_desktop()//检查结果
{
        string pth=getDesktopPath();
        char path[275];//Windows系统路径长度上限260,开275足够
        for(int i=0;i<pth.size();i++)path[i]=pth[i];
        path[pth.size()]='\0';
        strcat(path,"\problem.txt");
        cout<<path<<"\n";
        FILE *fp=fopen(path,"w");
        for(int i=0;i<100;i++)
        {
                fprintf(fp,"%d %c %d %c %d = %d\n",
                        ans[i][0],(ans[i][1]?'-':'+'),
                        ans[i][2],(ans[i][3]?'-':'+'),
                        ans[i][4],ans[i][5]);

        }
        fclose(fp);
        char code[314]="start ";
        strcat(code,path);
        system(code);

}

int main()
{
        srand(time(NULL));
        while(cnt<100)
        {
                tmp[0]=create_num();
                tmp[1]=create_optr();
                tmp[2]=create_num();
                tmp[3]=create_optr();
                tmp[4]=create_num();
                tmp[5]=get_ans();
                if(check_dupi())
                {
                        for(int i=0;i<6;i++)
                        {
                                ans[cnt][i]=tmp[i];
                        }
                        cnt++;
                }
        }
        //output();
        cout<<"是否导出(Y/N)?";
        char optr;
        cin>>optr;
        if(optr%32+64=='Y')
                output_desktop();
        else
                ;//啥都不干
        
        return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-17 17:13:54
完成4.5的有其他东西
4.度盘不限速
5.编程类书籍合计(电子)
5一部随机阿里盘的电影
回复

使用道具 举报

发表于 2023-2-17 18:48:15 | 显示全部楼层
呃……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-17 19:45:47 | 显示全部楼层
3 做不到
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randbetween(int n, int m) {
    // n下限,m上限,n<=随机数<m
    return rand() % (n - m) + m;
}
int randnum() {
    return randbetween(0, 11)
}
int calc(int n1, int fh, int n2) {
    if (fh == 0) // 加法
        return n1 + n2;
    else // 减法
        return n1 - n2;
}
int main() {
    srand((unsigned)time(NULL));
    for (int i=0; i<100; i++) {
        int f1 = randbetween(0, 2) // 符号
        char s1, s2;
        if (f1 == 0) s1 = '+';
        else s1 = '-';
        if (f2 == 0) s2 = '+';
        else s2 = '-';
        int f2 = randbetween(0, 2) // 符号2
        int a = randnum();
        int b = randnum();
        int c = randnum();
        int c1 = calc(a, f1, b);
        int c2 = calc(c1, f2, c2);
        if (c2 < 21) && (c2 > -1)
            printf("%d %c %d %c %d = %d", a, s1, b, s2, c, c2);
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-17 19:47:57 | 显示全部楼层
////抛砖引玉
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int a[101],b[101],c[101],sg,sum[101],d,ct=0,i,j;
    srand(time(0));
    for(i=0,ct=0;i<100;)
    {
        sum[100]=-1;
        while(sum[100]<0||20<=sum[100])
        {
            a[100]=rand()%11;
            sg=rand()%3;
            b[100]=(rand()%11)*(sg?1:-1);
            sg=rand()%3;
            c[100]=(rand()%11)*(sg?1:-1);
            sum[100]=a[100]+b[100]+c[100];
        }
        for(j=0;j<ct;j+=1)
        {
            if(a[j]==a[100]&&b[j]==b[100]&&c[j]==c[100])break;
        }
        if(ct==j)
        {
            a[ct]=a[100],b[ct]=b[100],c[ct]=c[100],sum[ct]=a[ct]+b[ct]+c[ct];
            ct+=1;
            i+=1;
        }
    }


    for(i=0;i<100;i+=1)printf("%d%s%d%s%d=%d\n",a[i],b[i]<0?"-\b":"+",b[i],c[i]<0?"-\b":"+",c[i],sum[i]);
//    scanf("%d",&d);
//    if(d==sum[i])printf("yes");
//    else printf("no");
    return 0;
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
沐雨尘枫 + 5 + 5 + 3 c语言,我喜欢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-17 22:11:40

运行不了,有点问题
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-18 12:13:07
ExiaGN001 发表于 2023-2-18 10:13
我就说下思路。
1.符号用随机数生成,1代表+,0代表-
随机数初始化 srand(time(NULL))调用rand()

1小时了,请问好了吗,对啦既然你是svip,换一个好了,听歌软件ios+win+andriod+web四选二如何
回复

使用道具 举报

发表于 2023-2-19 09:47:13 | 显示全部楼层
匿名者 发表于 2023-2-18 12:13
1小时了,请问好了吗,对啦既然你是svip,换一个好了,听歌软件ios+win+andriod+web四选二如何

再等等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-19 10:00:45 | 显示全部楼层
自己的作业自己做,自己的屁股自己擦,让别人写作业还不让别人知道自己是谁?见不得人?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:00:25
Mike_python小 发表于 2023-2-19 10:00
自己的作业自己做,自己的屁股自己擦,让别人写作业还不让别人知道自己是谁?见不得人?

不是作业,

你请我愿的,我也付出鱼碧了
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:04:34
Mike_python小 发表于 2023-2-19 10:00
自己的作业自己做,自己的屁股自己擦,让别人写作业还不让别人知道自己是谁?见不得人?


编程我都是自己学得,时间本来就不多,五天在学校,在家里还有我弟,我学校都不上信息课的,哪来的作业,要有也是python,怎么可能是c,匿名是因为不好意思,技术差,麻烦不要自以为事,不要随意搞我心态
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:06:17
回复

使用道具 举报

发表于 2023-2-19 13:11:59 | 显示全部楼层

1~4项已经好了,第五项说的再详细些行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-19 13:26:04 | 显示全部楼层
本帖最后由 Mike_python小 于 2023-2-19 13:30 编辑
匿名者 发表于 2023-2-19 13:04
编程我都是自己学得,时间本来就不多,五天在学校,在家里还有我弟,我学校都不上信息课的,哪来的作业 ...


https://fishc.com.cn/space-uid-1030543.html
沐雨尘枫

是你吧

匿名是因为不好意思,没有作业

那你写这个程序是为了什么呢?

你自己一点代码都没有,哪怕有一点错误的代码代表了你有思考都行

我自以为是?我哪句话说我自己为是了?

是作业就自己承认,没必要躲躲藏藏,不是作业就自己先思考,放出自己的思考过程
不会的再问大家,这样谁都乐意为你解决的问题,而不是看着你那要求,跟完成任务一样为你解决你的问题或作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-19 13:29:08 | 显示全部楼层
匿名者 发表于 2023-2-19 13:00
不是作业,

你请我愿的,我也付出鱼碧了

恕我直言,我说话可能不太好听,50育碧根本没有实际意义,只是论坛里有一些大佬不图这些,也乐于助人,给你写了。这要放在一些群里,肯定是收费解决的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:42:41
Mike_python小 发表于 2023-2-19 13:26
https://fishc.com.cn/space-uid-1030543.html
沐雨尘枫

只是单纯的需要
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:43:12
Mike_python小 发表于 2023-2-19 13:29
恕我直言,我说话可能不太好听,50育碧根本没有实际意义,只是论坛里有一些大佬不图这些,也乐于助人,给 ...

这点我赞同
回复

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2023-2-19 13:46:29
回复

使用道具 举报

发表于 2023-2-19 13:56:25 | 显示全部楼层
本帖最后由 ExiaGN001 于 2023-2-19 13:58 编辑


1,3均失效(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表