鱼C论坛

 找回密码
 立即注册
查看: 3381|回复: 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.预先把答案算出来,和输入值比较即可。

  1. #include<bits/stdc++.h>
  2. #include<windows.h>
  3. #include<shlobj.h>
  4. using namespace std;
  5. int ans[105][6];//最后的结果
  6. int tmp[6];//当前查看的结果
  7. /*
  8. ans 和tmp的存储格式
  9. 0                1                2                3                4                5
  10. 操作数1        运算符1        操作数2        运算符2 操作数3 结果
  11. */
  12. int cnt=0;
  13. const int maxnum=10,minnum=0;

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

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

  22. string getDesktopPath()//获取桌面位置
  23. {
  24.     LPITEMIDLIST pidl;
  25.     LPMALLOC pShellMalloc;
  26.     char szDir[200];
  27.     if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
  28.     {
  29.         if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl))) {
  30.             // 如果成功返回true
  31.             SHGetPathFromIDListA(pidl, szDir);
  32.             pShellMalloc->Free(pidl);
  33.         }
  34.         pShellMalloc->Release();
  35.     }

  36.     return string(szDir);
  37. }

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


  46. }
  47. bool check_dupi()//查重/查合法
  48. {
  49.         if(tmp[5]<0||tmp[5]>20)return 0;
  50.         int issame;//is_same是关键字,所以没加下划线
  51.         for(int i=0;i<cnt;i++)
  52.         {
  53.                 issame=0;
  54.                 for(int j=0;j<6;j++)
  55.                 {
  56.                         issame+=(ans[i][j]==tmp[j]);
  57.                 }
  58.                 if(issame==6)return 0;//只要有一个匹配就返回0
  59.         }
  60.         return 1;
  61. }
  62. void output()//向终端
  63. {
  64.         for(int i=0;i<100;i++)
  65.         {
  66.                 printf("%d %c %d %c %d = %d\n",
  67.                         ans[i][0],(ans[i][1]?'-':'+'),
  68.                         ans[i][2],(ans[i][3]?'-':'+'),
  69.                         ans[i][4],ans[i][5]);
  70.         }
  71. }
  72. bool output_desktop()//检查结果
  73. {
  74.         string pth=getDesktopPath();
  75.         char path[275];//Windows系统路径长度上限260,开275足够
  76.         for(int i=0;i<pth.size();i++)path[i]=pth[i];
  77.         path[pth.size()]='\0';
  78.         strcat(path,"\problem.txt");
  79.         cout<<path<<"\n";
  80.         FILE *fp=fopen(path,"w");
  81.         for(int i=0;i<100;i++)
  82.         {
  83.                 fprintf(fp,"%d %c %d %c %d = %d\n",
  84.                         ans[i][0],(ans[i][1]?'-':'+'),
  85.                         ans[i][2],(ans[i][3]?'-':'+'),
  86.                         ans[i][4],ans[i][5]);

  87.         }
  88.         fclose(fp);
  89.         char code[314]="start ";
  90.         strcat(code,path);
  91.         system(code);

  92. }

  93. int main()
  94. {
  95.         srand(time(NULL));
  96.         while(cnt<100)
  97.         {
  98.                 tmp[0]=create_num();
  99.                 tmp[1]=create_optr();
  100.                 tmp[2]=create_num();
  101.                 tmp[3]=create_optr();
  102.                 tmp[4]=create_num();
  103.                 tmp[5]=get_ans();
  104.                 if(check_dupi())
  105.                 {
  106.                         for(int i=0;i<6;i++)
  107.                         {
  108.                                 ans[cnt][i]=tmp[i];
  109.                         }
  110.                         cnt++;
  111.                 }
  112.         }
  113.         //output();
  114.         cout<<"是否导出(Y/N)?";
  115.         char optr;
  116.         cin>>optr;
  117.         if(optr%32+64=='Y')
  118.                 output_desktop();
  119.         else
  120.                 ;//啥都不干
  121.        
  122.         return 0;
  123. }
复制代码



最佳答案

查看完整内容

我就说下思路。 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.预先把答案算出来,和输入值比较即可。

  1. #include<bits/stdc++.h>
  2. #include<windows.h>
  3. #include<shlobj.h>
  4. using namespace std;
  5. int ans[105][6];//最后的结果
  6. int tmp[6];//当前查看的结果
  7. /*
  8. ans 和tmp的存储格式
  9. 0                1                2                3                4                5
  10. 操作数1        运算符1        操作数2        运算符2 操作数3 结果
  11. */
  12. int cnt=0;
  13. const int maxnum=10,minnum=0;

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

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

  22. string getDesktopPath()//获取桌面位置
  23. {
  24.     LPITEMIDLIST pidl;
  25.     LPMALLOC pShellMalloc;
  26.     char szDir[200];
  27.     if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
  28.     {
  29.         if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl))) {
  30.             // 如果成功返回true
  31.             SHGetPathFromIDListA(pidl, szDir);
  32.             pShellMalloc->Free(pidl);
  33.         }
  34.         pShellMalloc->Release();
  35.     }

  36.     return string(szDir);
  37. }

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


  46. }
  47. bool check_dupi()//查重/查合法
  48. {
  49.         if(tmp[5]<0||tmp[5]>20)return 0;
  50.         int issame;//is_same是关键字,所以没加下划线
  51.         for(int i=0;i<cnt;i++)
  52.         {
  53.                 issame=0;
  54.                 for(int j=0;j<6;j++)
  55.                 {
  56.                         issame+=(ans[i][j]==tmp[j]);
  57.                 }
  58.                 if(issame==6)return 0;//只要有一个匹配就返回0
  59.         }
  60.         return 1;
  61. }
  62. void output()//向终端
  63. {
  64.         for(int i=0;i<100;i++)
  65.         {
  66.                 printf("%d %c %d %c %d = %d\n",
  67.                         ans[i][0],(ans[i][1]?'-':'+'),
  68.                         ans[i][2],(ans[i][3]?'-':'+'),
  69.                         ans[i][4],ans[i][5]);
  70.         }
  71. }
  72. bool output_desktop()//检查结果
  73. {
  74.         string pth=getDesktopPath();
  75.         char path[275];//Windows系统路径长度上限260,开275足够
  76.         for(int i=0;i<pth.size();i++)path[i]=pth[i];
  77.         path[pth.size()]='\0';
  78.         strcat(path,"\problem.txt");
  79.         cout<<path<<"\n";
  80.         FILE *fp=fopen(path,"w");
  81.         for(int i=0;i<100;i++)
  82.         {
  83.                 fprintf(fp,"%d %c %d %c %d = %d\n",
  84.                         ans[i][0],(ans[i][1]?'-':'+'),
  85.                         ans[i][2],(ans[i][3]?'-':'+'),
  86.                         ans[i][4],ans[i][5]);

  87.         }
  88.         fclose(fp);
  89.         char code[314]="start ";
  90.         strcat(code,path);
  91.         system(code);

  92. }

  93. int main()
  94. {
  95.         srand(time(NULL));
  96.         while(cnt<100)
  97.         {
  98.                 tmp[0]=create_num();
  99.                 tmp[1]=create_optr();
  100.                 tmp[2]=create_num();
  101.                 tmp[3]=create_optr();
  102.                 tmp[4]=create_num();
  103.                 tmp[5]=get_ans();
  104.                 if(check_dupi())
  105.                 {
  106.                         for(int i=0;i<6;i++)
  107.                         {
  108.                                 ans[cnt][i]=tmp[i];
  109.                         }
  110.                         cnt++;
  111.                 }
  112.         }
  113.         //output();
  114.         cout<<"是否导出(Y/N)?";
  115.         char optr;
  116.         cin>>optr;
  117.         if(optr%32+64=='Y')
  118.                 output_desktop();
  119.         else
  120.                 ;//啥都不干
  121.        
  122.         return 0;
  123. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2023-2-17 18:48:15 | 显示全部楼层
呃……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-17 19:45:47 | 显示全部楼层
3 做不到
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int randbetween(int n, int m) {
  5.     // n下限,m上限,n<=随机数<m
  6.     return rand() % (n - m) + m;
  7. }
  8. int randnum() {
  9.     return randbetween(0, 11)
  10. }
  11. int calc(int n1, int fh, int n2) {
  12.     if (fh == 0) // 加法
  13.         return n1 + n2;
  14.     else // 减法
  15.         return n1 - n2;
  16. }
  17. int main() {
  18.     srand((unsigned)time(NULL));
  19.     for (int i=0; i<100; i++) {
  20.         int f1 = randbetween(0, 2) // 符号
  21.         char s1, s2;
  22.         if (f1 == 0) s1 = '+';
  23.         else s1 = '-';
  24.         if (f2 == 0) s2 = '+';
  25.         else s2 = '-';
  26.         int f2 = randbetween(0, 2) // 符号2
  27.         int a = randnum();
  28.         int b = randnum();
  29.         int c = randnum();
  30.         int c1 = calc(a, f1, b);
  31.         int c2 = calc(c1, f2, c2);
  32.         if (c2 < 21) && (c2 > -1)
  33.             printf("%d %c %d %c %d = %d", a, s1, b, s2, c, c2);
  34.     }
  35.     return 0;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-17 19:47:57 | 显示全部楼层
////抛砖引玉
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5. {
  6.     int a[101],b[101],c[101],sg,sum[101],d,ct=0,i,j;
  7.     srand(time(0));
  8.     for(i=0,ct=0;i<100;)
  9.     {
  10.         sum[100]=-1;
  11.         while(sum[100]<0||20<=sum[100])
  12.         {
  13.             a[100]=rand()%11;
  14.             sg=rand()%3;
  15.             b[100]=(rand()%11)*(sg?1:-1);
  16.             sg=rand()%3;
  17.             c[100]=(rand()%11)*(sg?1:-1);
  18.             sum[100]=a[100]+b[100]+c[100];
  19.         }
  20.         for(j=0;j<ct;j+=1)
  21.         {
  22.             if(a[j]==a[100]&&b[j]==b[100]&&c[j]==c[100])break;
  23.         }
  24.         if(ct==j)
  25.         {
  26.             a[ct]=a[100],b[ct]=b[100],c[ct]=c[100],sum[ct]=a[ct]+b[ct]+c[ct];
  27.             ct+=1;
  28.             i+=1;
  29.         }
  30.     }


  31.     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]);
  32. //    scanf("%d",&d);
  33. //    if(d==sum[i])printf("yes");
  34. //    else printf("no");
  35.     return 0;
  36. }
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://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四选二如何

再等等
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-19 10:00:45 | 显示全部楼层
自己的作业自己做,自己的屁股自己擦,让别人写作业还不让别人知道自己是谁?见不得人?
小甲鱼最新课程 -> https://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项已经好了,第五项说的再详细些行吗
小甲鱼最新课程 -> https://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
沐雨尘枫

是你吧

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

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

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

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

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

使用道具 举报

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

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

恕我直言,我说话可能不太好听,50育碧根本没有实际意义,只是论坛里有一些大佬不图这些,也乐于助人,给你写了。这要放在一些群里,肯定是收费解决的
小甲鱼最新课程 -> https://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均失效(
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 07:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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