写自己的项目
前两节课我们讲解了如何创建项目。
这节课就来写几个项目吧!
注:本课将运用一些优化!听不懂的去看基础课吧……
首先,数学很重要。
我们今天就来实现一个关于数学的项目。
之前说过了,项目是可以使用我们的静态库的。
但这里我们一概不提。
首先新建一个项目。(我自然就用昨天那个了)
注:打开项目的流程和打开.cpp文件一样,打开.dev文件就好了。
接着修改一下,变成这样……
好了,接下来我们就可以进行编程了。
首先,我们先说一下我们要做什么。
我们要做一个自己的数学软件生成计算题。
那我们就要用到这个生成随机数的基本框架(基础课里讲过)
头文集:
#include<ctime>
#include<cstdlib>
#include<conio>
#include<windows.h>
#include<cmath>
接下来是板子:
int main()
{
long long int n;
cin >> n;
srand(time(0))
int res = rand() % n + 1;
cout << res << endl;
}
这个板子可以生成1-n的随机数。
好那么我们就想一下,freopen可以干嘛。
众所周知,freopen可以调用文件&生成文件。
所以呢?
先来说一下freopen的语法吧。
#include<stdio.h>
using namespace std;
int main()
{
//1、
freopen("/*文件位置*/", "r", stdin);//读入
//2、
freopen("/*文件位置*/", "w", stdout);//创建文件并输出
//3、
fclose(stdin);//关闭读入流
fclose(stdout);//关闭输出流
}
好那我们就来看一下freopen的应用。
首先先说一个注意事项,time函数用完请手动延时……
srand(time(0));
Sleep(1000);
//hhhhhhhhhhhh
好那我来交大家用项目写一个拥有精美界面的算式生成器。
首先大家准备好刚刚做好的基础框架。
接着加入几个头文件……
#include <bits/stdc++.h>
#include <cmath>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
接着是freopen……
freopen("D:\\mymath.out", "w", stdout);
读入……
int n;
cin >> n;
int x;
cin >> x;
char op;
cin >> op;
分别读入数据范围,题目个数和运算符。
接着随机生成就行了。
for(int i = 1; i <= x; i ++)
{
srand(time(0));
pair<int, int> res;
res.first = rand() % n + 1;
Sleep(1000);
srand(time(0));
res.second = rand() % n + 1;
cout << res.first << ' ' << op << ' ' << res.second << endl;
Sleep(1000);
}
没有优化的完整代码:
#include <bits/stdc++.h>
#include <cmath>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
using namespace std;
int main()
{
freopen("D:\\mymath.out", "w", stdout);
int n;
cin >> n;
int x;
cin >> x;
char op;
cin >> op;
cout << "正在生成中,请耐心等待……" << endl;
for(int i = 1; i <= x; i ++)
{
srand(time(0));
pair<int, int> res;
res.first = rand() % n + 1;
Sleep(1000);
srand(time(0));
res.second = rand() % n + 1;
cout << res.first << ' ' << op << ' ' << res.second << endl;
Sleep(1000);
}
return 0;
}
接下来我们可以考虑制作一个循环器。
刚刚那个我们需要花很多时间对吧,现在我们制作一个时间较少的,生成快的。
首先这一行可以优化。
//原来是:
srand(time(0));
Sleep(1000);
//现在优化成:
srand(i);
//因为i在循环,所以每次i的值都不一样。
下一个srand我们可以自己写一个循环器。
传入两个参数分别为x和i。
srand(xrand(x, i));
其实xrand的套路也很简单……
int xrand(int x, int n)
{
return x + 1 + n;
}
hhhhhh
把x叠加一遍就好了……
第一次优化后的代码:
#include <bits/stdc++.h>
#include <cmath>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
using namespace std;
int xrand(int x, int n)
{
return x + 1 + n;
}
int main()
{
freopen("D:\\mymath.out", "w", stdout);
int n;
cin >> n;
int x;
cin >> x;
char op;
cin >> op;
for(int i = 1; i <= x; i ++)
{
srand(i);
pair<int, int> res;
res.first = rand() % n + 1;
srand(xrand(x, i));
res.second = rand() % n + 1;
cout << res.first << ' ' << op << ' ' << res.second << endl;
}
return 0;
}
测试了一下,如果用这个样例……
用第一个代码需要两万秒……
第二个十几秒就够了。
生成效果……
突然发现这个程序给我这样的xxs生成口算貌似不错?
当然,优化不止如此。
我们还可以把它做成窗口!
这个我们基础课讲过。
总共分3步!
第一步:加入读入读出句柄和窗口启动程序。
HANDLE hOut =GetStdHandle(STD_OUTPUT_HANDLE);
CloseHandle(hOut);
当然那个hOut那里你爱咋写咋写。
以前学习是看网上大佬爱用这个就用这个了……
窗口启动双连如下:
system("mode con cols = 100 lines= 40");//初始化缓冲区大小
SetConsoleTitle("xxx");//设置控制台窗口标题
(写项目您别加第一行,第二行就够了。)
第二步:背景着色
利用system函数。
个人喜欢蓝色。
如果你忘了啥对应啥颜色就写一个:
system("color 10F");
效果如下:
蓝色就是:
system("color 1F");
接着是字体颜色。
字体颜色全部我就直接把基础课的粘上了(明明是你懒!)
蓝色:
void blue_border()
{
WORD blue=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN;//设置字体颜色、背景颜色
SetConsoleTextAttribute(hOut,blue);//字体样式
}
白色:
void white_back()
{
WORD white=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;
SetConsoleTextAttribute(hOut,white);
}
青色:
void cyan_choose()
{
WORD cyan=FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE;
SetConsoleTextAttribute(hOut,cyan);
}
不太好的红色和橙色(其实都是可以自己做的,有兴趣的小伙伴不妨试试):
void red_choose()
{
WORD red=FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE;
SetConsoleTextAttribute(hOut,red);
}
void orange_choose()
{
WORD orange=FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_BLUE;
SetConsoleTextAttribute(hOut,orange);
}
自己做的例子:
void on_Select()
{
WORD select=FOREGROUND_GREEN|FOREGROUND_INTENSITY|BACKGROUND_RED;
SetConsoleTextAttribute(hOut,select);
}
作者:cht
链接:https://www.acwing.com/blog/content/2276/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//上面那行是为了证明真是从基础课里粘贴的!
好了别急,还没搞定!
最后几行:
void pos(int x,int y)
{
COORD posPoint = {x,y}; //设置坐标
SetConsoleCursorPosition(hOut,posPoint);
}
当然pos在这个里面没啥用……
包括咱们加好这些后还可以加一些优化。
完整优化版现在还有些问题,争取明天发!
好了今天的分享就到这里了。
有兴趣的同学可以自己写一下窗口版的数字生成器,明天争取发优化,bye~(300行)
freopen容易句柄无效,建议用ifstream
这里已经n年没更新了qwq
以前发不过去n次停更公告了,说11月回来更新
qwq
system其实就是调用cmd命令行,所以dos命令都可以用
是的~
haha 我i了
~~~~%%%%%%摸摸扎谢谢
%%%%%%%%%%%%%
客气了
$chtnb$
您tql
加油,奥利给!
加油!共勉!