电子工程学院
计算机实习设计报告
班级:姓名:学号:
一、魔方阵
1、设计流程:
第一步:确定实现魔方阵的算法,魔方阵是个很古老的问题,无数优秀的数
学家创造了很多巧妙且高效的算法。魔方阵的实现算法分三个部分:奇数(2n+1)、单偶数(4n-2)、双偶数(4n)(n=1,2,3…)。
(1)奇数幻方算法:布阵规律为:
a、把1放在N*N方阵中的第一行中间一列,即放在位置(1,(N+1)/2);
b、后一个数存放的行数比前一个数存放的行数减1,若这个行数为0,则取行数为N;
c、后一个数存放的列数比前一个数存放的列数加1,若这个列数为N+1,则取
列数为1;
d、如果前一个数是N的倍数,则后一个数存放的列数不变,而行数加1。
(2)单偶数幻方算法:斯特雷奇法
a、把单偶数阶幻方分成A、B、C、D四个小方阵,若按平面直角坐标系来看则第一、二、三、四象限分别为A、C、B、D(请一定注意A、B、C、D的位置!)
b、用连续摆数法(调用void oddmagic(int n,int **magic,int f))将A、
B、C、D填入数字,A方阵用1~a^2,B方阵用(a^2+1)~2a^2,C方阵用(2a^2+1)~3a^2,D用数字(3a^2+1~4a^2)。其中
a=n/2。
c、在A的中间一行左侧第2列起取m个方格(这里m=(n-2)/4),即取((n/4+0.5),2)~((n/4+0.5),(2+m))这几个方格,再取A中其它行的左边m个方格。把这些方格中的数字同D中相应方格中的数字对调。然后在C中各列的从右边起的m-1个方格重的数字同B中对调。这样形成的大方阵就是幻方了。
(3)双偶数幻方算法:采用对称元素交换法。
a、把数1-n^2按行从上至下,从左至右填人方阵的n×n格。 然后,把方阵的所有4 ×4子方阵中的两对角线上位置上的数固定下来不动;
b、所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+ 1-j)的值交换。
第二步:界面设计。我用C语言来实现程序功能,用VC++的MFC来实现视窗
化操作。用户只需输入幻方阶数,敲击回车键,窗口就能显示出该阶数的幻方。交互十分方便,友好。
第三步:完善程序。我通过计算输出的幻方的行和,列和,对角和来检验所
输出的幻方是否正确。而且,我还对边界值做了设定,用户只能输
入3~15之间的整数,一旦输入超出范围或输入其他字符,程序便会报错并清空所有编辑框,提示用户重新输入。
2、源代码:
/**********************************************
交换两个数 以指针方式交换
********************************************/
void swapp(int *m,int *n) {
int t;
t=*m;
*m=*n;
*n=t;
}
/************************************************** 奇数魔方阵生成函数
**************************************************/ void oddmagic(int n,int **magic){
int l=0,c=(n-1)/2,s=1,nn=n*n;
do{
magic[l][c]=s++;
if((s-1)%n==0)l++;
else
{
l--;c++;
}
if(l<0)
l=n-1;
else if(l>=n)
l=0;
if(c<0)
c=n-1;
else if(c>=n)
c=0;
}while(s<=nn);
}
/************************************************** 奇数魔方阵函数重载
在 void sgevenmagic(int n,int **magic) 中会被调用
**************************************************/ void oddmagic(int n,int **magic,int f){
int l=0,c=(n-1)/2,s=f,nn=n*n+f;
do{
magic[l][c]=s++;
if((s-f)%n==0)l++;
else
{
l--;c++;
}
if(l<0)
l=n-1;
else if(l>=n)
l=0;
if(c<0)
c=n-1;
else if(c>=n)
c=0;
}while(s<nn);
}
/************************************************** 双偶数魔方阵生成函数
**************************************************/ void dbevenmagic(int n,int **magic) {
int i=0,j=0,b2s=n*n,s2b=1,mk=1;
for(i=0;i<n/2;i++){
for(j=0;j<n/2;j++){
magic[i][j]=(mk*=-1);
magic[i][j+n/2]=(mk*=-1);
magic[i+n/2][j]=(mk*=-1);
magic[i+n/2][j+n/2]=(mk*=-1);
mk*=-1;
}
mk*=-1;
}
for(i=0;i<n/2;i++)
for(j=0;j<(n);j++){
if(magic[i][j]==-1){
magic[i][j]=b2s--;
magic[n-1-i][n-1-j]=s2b++;
}
else{
magic[n-1-i][n-1-j]=b2s--;
magic[i][j]=s2b++;
}
}
}
void oddmagic1(int n,int **magic,int f){
int l=0,c=(n-1)/2,s=f,nn=n*n+f-1;
do{
magic[l][c]=s++;
if((s-f)%n==0)
l++;
else{
l--;c++;
}
if(l<0)
l=n-1;
else if(l>=n)
l=0;
if(c<0)
c=n-1;
else if(c>=n)
c=0;
}while(s<=nn);
}
/************************************************** 单偶数数魔方阵生成函数
**************************************************/ void sgevenmagic(int n,int **magic) //单偶数魔方阵{ int i,j,me=(n-2)/4;
/*****动态生成二维数组及数组初始化*******/
int **m=new int*[n/2];
for(i=0;i<n/2;i++)
m[i]=new int[n/2];
for(i=0;i<n/2;i++)
for(j=0;j<n/2;j++)
m[i][j]=0;
/******************模块化******************************/ oddmagic1(n/2,m,1);
for(i=0;i<n/2;i++) //////-----A/////////
for(j=0;j<n/2;j++)
magic[i][j]=m[i][j];
oddmagic1(n/2,m,n*n/4+1);
for(i=n/2;i<n;i++) ////------B-----------//// for(j=n/2;j<n;j++)
magic[i][j]=m[i-n/2][j-n/2];
oddmagic1(n/2,m,(n*n/2)+1);
for(i=0;i<n/2;i++) ///////------C//////////// for(j=n/2;j<n;j++)
magic[i][j]=m[i][j-n/2];
oddmagic1(n/2,m,(n*n/4)*3+1);
for(i=n/2;i<n;i++) ////////---------D----------////// for(j=0;j<n/2;j++)
magic[i][j]=m[i-n/2][j];
/************************************************
回收动态数组
************************************************/
for(i=0;i<n/2;i++){
delete[] m[i];
}
delete[] m;
/********************************
交换该交换的
*********************************/
for(i=0;i<=n/2-1;i++){
for(j=0;j<me;j++)
if(i==me)
swapp(&magic[i][j+1],&magic[i+n/2][j+1]);
else
swapp(&magic[i][j],&magic[i+n/2][j]);
}
if(me==1);
else{
for(i=0;i<=n/2-1;i++)
for(j=n-me+1;j<n;j++)
//for(j=n/2-1;j>me;j--)
swapp(&magic[i][j],&magic[i+n/2][j]);
}
}
void CMagicDlg::OnButton_Magic() {
int i=0,j=0,sum_row=0,sum_list=0,sum_diagonal=0;
CString stmp,str="";
char ch[10];
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE);
GetDlgItemText(IDC_EDIT1,ch,10);//获取阶数数据
int n=atoi(ch); //将字符串数组转化为int型
/*判断数据是否符合要求,如果不符合,则刷新对话框并重新输入*/ if(!ch[0]) {
MessageBox("请输入阶数!");
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT2,"");
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT3,"");
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE); SetDlgItemText(IDC_EDIT5,""); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE); SetDlgItemText(IDC_EDIT6,""); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); } else if(n<3||n>15)//边界值判断
{
SetDlgItemText(IDC_EDIT1,str);
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT2,"");
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT3,"");
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT5,"");
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT6,"");
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW);
MessageBox("输入错误,请重新输入!");
}
else{
//***动态生成二维数组及数组初始化*******
int **mm=new int*[n]; // 先创建二维数组mm的行数 for(i=0;i<n;i++) // 再创建二维数组的列数
mm[i]=new int[n]; // mm的每一行都是一个有n个元素的一维数组
for(i=0;i<n;i++) // mm[n][n]初始化,
for(j=0;j<n;j++) // n*n次循环
mm[i][j]=0; //全部置零
// 判断n是奇数、单偶数还是双偶数
if(n%2==1)
oddmagic(n,mm); //n是奇数,就调用对应的函数
else if(n%4==0) //n是双偶数,就调用对应的函数 dbevenmagic(n,mm);
else //n是单偶数,就调用对应的函数 sgevenmagic(n,mm);
/**********************************************
设置幻方输出格式
***********************************************/
if(n<=6)
for(i=0;i<10;i++)
str+="\r\n";
else if(n>=7&&n<=9)
for(i=0;i<7;i++)
str+="\r\n";
else if(n>=10&&n<=12)
for(i=0;i<2;i++)
str+="\r\n";
else if(n>=11&&n<=13)
for(i=0;i<2;i++)
str+="\r\n";
else if(n>13)
str+="\r\n";
for(i=0;i<n;i++){
sum_diagonal=sum_diagonal+mm[i][i];//计算对角和 for(j=0;j<n;j++){
if(j!=n-1)
{
if(mm[i][j]<10)
stmp.Format("%d ",mm[i][j]); else if(mm[i][j]>9&&mm[i][j]<100) stmp.Format("%d ",mm[i][j]); else if(mm[i][j]>99)
stmp.Format("%d ",mm[i][j]); }
else
stmp.Format("%d",mm[i][j]);
str+=stmp;
sum_row=sum_row+mm[i][j];//行和的6倍 }
sum_list=sum_list+mm[i][j-1];//计算列和 str+="\r\n\r\n";
}
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); SetDlgItemText(IDC_EDIT2,str);//输出幻方 stmp="";
stmp.Format("%d",sum_row/n); //输出行和 SetDlgItemText(IDC_EDIT3,stmp);
stmp="";
stmp.Format("%d",sum_list); //输出列和
SetDlgItemText(IDC_EDIT6,stmp);
stmp="";
stmp.Format("%d",sum_diagonal); //输出对角和
SetDlgItemText(IDC_EDIT5,stmp);
}
}
二、设计动画:星际穿越
1、设计流程
第一步:构思动画情节:在某位爱幻想的小朋友的梦中,地球发生紧急情况,
人类需要紧急转移到别的星球。该小朋友和一群人乘坐宇宙飞船飞
离地球,驶向太空。在太空中遭遇陨石带……在历经千辛万苦后,终
于到达一处虫洞,飞船驶入冲动后,小朋友却发现飞船从一个马桶
中钻了出来,而且变成一只苍蝇。
第二步:搜集相关素材,主要是图片,背景音乐和特效音乐。
第三步:使用Flash进行动画制作。主要就是图层的设置,搭配和加入必要
的特效。
2、工程文件
视频原工程文件见源代码文件夹。
三、健康计算器
1、设计流程
第一步:设计界面。根据题目要求:需要根据计算结果来给出适当的提示。
所以设计了三个窗口,主窗口功能是选择需要计算的项目:BMI指
数、体脂率。两个子窗口分别实现BMI指数和体脂率的计算。
第二步:编写代码。我选择用C语言分别在三个窗口按照给定的公式编写
代码,实现相应的功能。
2、源代码
(1)主窗口
void CHCDlg::OnButton_BMI()// 点击BMI按钮,创建BMI模态对话框,并计算BMI {
CBMIdlg dlg;
dlg.DoModal();
}
void CHCDlg::OnButton_BFR()//点击BFR按钮,创建BFR模态对话框,并计算体脂率
{
CBFRdlg dlg;
dlg.DoModal();
}
(2)BMI指数计算窗口:
void CBMIdlg::OnButton_BMI_Calculate ()
{
float weight=0,height=0,BMI=0;
char chw[10],chh[10];
GetDlgItemText(IDC_EDIT1,chw,10);//获得weight数据,并存入chw[]数组 GetDlgItemText(IDC_EDIT2,chh,10);//获得height数据,并存入chh[]数组 weight=atof(chw);//将字符数组转化为float型
height=atof(chh);
if(!chw[0]) /*判断编辑框数据是否为空*/
MessageBox("请输入体重!");
else if(weight<2.5||weight>120) /*判断编辑框数据是否在正常范围内,边界判断*/
{
MessageBox("您输入的数据超出范围,请重新输入");
SetDlgItemText(IDC_EDIT1,"");
}
else if(!chh[0]) /*判断编辑框数据是否为空*/
MessageBox("请输入身高!");
else if(height<0.5||height>2.5) /*判断编辑框数据是否在正常范围内,边界判断*/
{
MessageBox("您输入的数据超出范围,请重新输入");
SetDlgItemText(IDC_EDIT2,"");
}
else
{
BMI=weight/(pow(height,2)); /*BMI数值计算*/
CString str;
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE); //先隐藏BMI编辑框,更新数据后再显示该编辑框
str.Format("%.2f",BMI);
SetDlgItemText(IDC_EDIT3,str);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE); //刷新评估报告编辑框
SetDlgItemText(IDC_EDIT4,"");
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW);
if(BMI<18.5) //根据BMI值,作出评估,
并提出适当的建议
str.Format("评估报告\r\n根据BIM指数,评估出您的体重过低\r\n建议您采用均衡饮食及渐进式的增加食量,均衡的饮食可以使用奶油或其它食用油、果酱、糖类等高油脂、高糖类食物来增加热量,虽然体重增加较为快速,但长期或过量食用避免强迫性的供给,破坏食欲应增加膳食的摄入量,主吃碳水化合物,面食。此外,高蛋白食品,蔬菜和水果一个都不能少!要想增肥,还应保持充足而良好的睡眠,睡得香,才能胃口好!适当运动使人心情愉快,肌肉强壮,体魄健美!");
else if(BMI>=18.5&&BMI<=23.9)
str.Format("评估报告\r\n根据BIM指数,评估出您的体重正常\r\n生命更在于运动!\r\n要继续坚持哦!");
else if(BMI>=24&&BMI<=27.9)
str.Format("评估报告\r\n根据BIM指数,评估出您的体重超重\r\n请注意!!!您已快落入肥胖的魔爪!建议您建议您加强体育锻炼,多参加集体活动,多散步,尤其是游泳,打球等。您还应该培养良好的饮食习惯,比如:适当限制高脂肪、高糖类的食品,多吃蔬菜、水果,少吃零食,餐前不喝甜饮料等");
else
str.Format("评估报告\r\n根据BIM指数,评估出您已达到肥胖级别!\r\n当您的体重超过正常标准的20%时,您就已经被肥胖俘虏了。肥胖形成的原因有多种:遗传、生活方式、缺乏锻炼、医疗和药物的因素等。而且肥胖的危害非常大,例如:呼吸不畅,加重心脏负担,运动伤害等。强烈建议您加强体育锻炼,多参加集体活动,多散步,尤其是游泳,打球等。您还应该培养良好的饮食习惯,比如:适当限制高脂肪、高糖类的食品,多吃蔬菜、水果,少吃零食,餐前不喝甜饮料等");
SetDlgItemText(IDC_EDIT4,str); //将评估结果和建议显示在评估报告框内
}
}
(3)体脂率计算窗口:
void CBFRdlg::OnButton_BFR_Calculate ()
{
float Waistline,Weight,Fat,BFR,a,b;
char chwa[10],chw[10];
CString str,stmp;
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);//刷新评估报告框 SetDlgItemText(IDC_EDIT1,"");
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
int RadioState1= ((CButton *)GetDlgItem(IDC_RADIO_Boy))->GetCheck();//获取单选框返回值判断性别选择
int RadioState2= ((CButton *)GetDlgItem(IDC_RADIO_Girl))->GetCheck(); GetDlgItemText(IDC_EDIT2,chwa,10);//获取Waistline框输入数据
GetDlgItemText(IDC_EDIT3,chw,10);//获取Weight框输入数据
Waistline=atof(chwa);//将字符串数组数据转化为float型数据
Weight=atof(chw);
/*判断数据是否为空*/
if(RadioState1==0&&RadioState2==0)
MessageBox("请选择性别!");
else if(!chwa[0])
MessageBox("请输入腰围!");
else if(Waistline<30||Waistline>100)
{
MessageBox("您输入的数据超出范围,请重新输入");
SetDlgItemText(IDC_EDIT2,"");
}
else if(!chw[0])
MessageBox("请输入体重!");
else if(Weight<2.5|Weight>120)
{
MessageBox("您输入的数据超出范围,请重新输入");
SetDlgItemText(IDC_EDIT3,"");
}
else
{
if (RadioState1) //判断性别为男
{
a=Waistline*0.74; //计算BFR数值
b=Weight*0.082+44.74;
Fat=a-b;
BFR=(Fat/Weight)*100;
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE);
str.Format("%.2f",BFR);
/*根据BFR数值给出评估结果并提出适当建议*/
if(BFR<=18&&BFR>=5)
stmp.Format("评估报告\r\n根据BRF指数,评估出您的体脂率正常\r\n建议您均衡饮食,规律作息\r\n生命更在于运动!\r\n要继续坚持哦!"); else if(BFR<5)
stmp.Format("评估报告\r\n根据BRF指数,评估出您的体脂率过低\r\n可能引起功能失调,请尽快补充脂肪\r\n但是也不要暴饮暴食哦!"); else if(BFR>18)
stmp.Format("评估报告\r\n根据BIM指数,评估出您的体脂率偏高\r\n请注意!!!您已快落入肥胖的魔爪!建议您建议您加强体育锻炼,多参加集体活动,多散步,尤其是游泳,打球等。您还应该培养良好的饮食习惯,比如:适当限制高脂肪、高糖类的食品,多吃蔬菜、水果,少吃零食,餐前不喝甜饮料等");
SetDlgItemText(IDC_EDIT1,stmp);
}
else//判断性别为女
{
a=Waistline*0.74; //计算BFR数值
b=Weight*0.082+34.89;
Fat=a-b;
BFR=(Fat/Weight)*100;
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE);
str.Format("%.2f",BFR);
/*根据BFR数值给出评估结果并提出适当建议*/
if(BFR<=28&&BFR>=15)
stmp.Format("评估报告\r\n根据BRF指数,评估出您的体脂率正常\r\n建议您均衡饮食,规律作息\r\n生命更在于运动!\r\n要继续坚持哦!"); else if(BFR<15)
stmp.Format("评估报告\r\n根据BRF指数,评估出您的体脂率过低\r\n可能引起功能失调,请尽快补充脂肪\r\n但是也不要暴饮暴食哦!"); else if(BFR>28)
stmp.Format("评估报告\r\n根据BIM指数,评估出您的体脂率偏高\r\n请注意!!!您已快落入肥胖的魔爪!建议您建议您加强体育锻炼,多参加集体活动,多散步,尤其是游泳,打球等。您还应该培养良好的饮食习惯,比如:适当限制高脂肪、高糖类的食品,多吃蔬菜、水果,少吃零食,餐前不喝甜饮料等");
SetDlgItemText(IDC_EDIT1,stmp);
}
str=str+"%";
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW); //输出BFR结果 SetDlgItemText(IDC_EDIT4,str);
}
}
四、字符串处理
1、设计流程
第一步:通读题目要求,将该程序主要分为5个功能模块:验错,字符串逆
序输出,统计各个字符出现次数,插入短字符串并输出其出现次数、
位置、输出删除该短字符串的长字符串,插入字符串并输出。此外,
我还添加了重新开始功能,一键清除,重新开始。
第二步:程序界面的排版。由于功能窗口太多,所以我选择用纯色作为背景,
显得更简洁。排版左右三七开,左边是功能按钮,右侧是输入输出
窗口。
第三步:各个功能模块的代码的编写。我采用C语言来编写。兼用一些CString
类的函数,如:MakeReverse。这样使程序显得十分简练,使用也十
分方便。
2、源代码:
/**************************************************
对编辑框内的字符串进行检验,若是数字和字母,则符合要求 程序继续运行,若不如何要求,则刷新整个对话框,并要求重新 输入
***************************************************/ void CStringDlg::OnButton_Error_Checking ()
{
char ch[50]={'!'};
int Char=0,Number=0;
CString str;
GetDlgItemText(IDC_EDIT1,ch,50);
for(int i=0;i<50;i++)
{ if(ch[i]>='0'&&ch[i]<='9')
Number=1;
else if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z')) Char=1;
}
if(Number==1&&Char==1)
{
str="您的输入符合要求!";
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT8)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT9)->ShowWindow(SW_HIDE); SetDlgItemText(IDC_EDIT2,"");
SetDlgItemText(IDC_EDIT3,"");
SetDlgItemText(IDC_EDIT4,"");
SetDlgItemText(IDC_EDIT5,"");
SetDlgItemText(IDC_EDIT6,"");
SetDlgItemText(IDC_EDIT7,"");
SetDlgItemText(IDC_EDIT8,"");
SetDlgItemText(IDC_EDIT9,"");
}
else if(Number==0&&Char==0)
{
str="输入框为空,请输入字母和数字!";
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
} else { }
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT8)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT9)->ShowWindow(SW_HIDE); SetDlgItemText(IDC_EDIT2,""); SetDlgItemText(IDC_EDIT3,""); SetDlgItemText(IDC_EDIT4,""); SetDlgItemText(IDC_EDIT5,""); SetDlgItemText(IDC_EDIT6,""); SetDlgItemText(IDC_EDIT7,""); SetDlgItemText(IDC_EDIT8,""); SetDlgItemText(IDC_EDIT9,""); str="您的输入有误,请重新输入字母和数字!"; GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT8)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT9)->ShowWindow(SW_HIDE); SetDlgItemText(IDC_EDIT1,""); SetDlgItemText(IDC_EDIT2,""); SetDlgItemText(IDC_EDIT3,""); SetDlgItemText(IDC_EDIT4,""); SetDlgItemText(IDC_EDIT5,""); SetDlgItemText(IDC_EDIT6,""); SetDlgItemText(IDC_EDIT7,""); SetDlgItemText(IDC_EDIT8,""); SetDlgItemText(IDC_EDIT9,""); GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT8)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT9)->ShowWindow(SW_SHOW);
MessageBox(str);
}
/*************************************************** 逆序输出字符串
***************************************************/ void CStringDlg::OnButton_String_Reverse()
{
char ch[50];
CString str;
GetDlgItemText(IDC_EDIT1,ch,50);
if(!ch[0])//判断是否输入字符串
MessageBox("输入框为空,请输入符合要求的数字和字母!"); else
{GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
for(int i=0;i<50;i++)
str+=ch[i];
str.MakeReverse(); //字符串逆序 GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); SetDlgItemText(IDC_EDIT2,str); //逆序字符串输出 }
}
/*************************************************** 统计各个字符出现的次数并输出统计结果
***************************************************/ void CStringDlg::OnButton_Char_Count ()
{
char ch[50],CH[36];
int Count[36]={0};//存储字符出现次数
int Location=0,length;
int i=0,j;
CString str,stmp,Strch;
GetDlgItemText(IDC_EDIT1,ch,50);
if(!ch[0]) //判断是否输入字符串 MessageBox("输入框为空,请输入符合数字和字母!"); for(i=0;i<50;i++)
Strch+=ch[i];
length=Strch.GetLength();//获取字符串长度
CH[0]=ch[0];
Count[Location]=1;/*统计各个不同的字符串出现次数*/ for(i=1;i<length;i++)
{ j=0;
while(j<=Location)
{if(CH[j]==ch[i])
{ Count[j]++;
break;}
++j;
}
if(j>Location)
{
++Location;
CH[Location]=ch[i];
Count[Location]++;}
}
str=stmp="";
for(i=0;i<Location-1;i++) //输出统计结果
{
stmp.Format("字符: %c 出现次数:%d ",CH[i],Count[i]);
str+=stmp;
}
SetDlgItemText(IDC_EDIT3,str);
}
/***************************************************
在第一次输入的长字符串中查找现在输入的短字符串,并输出它在长字符串中出现的位置
***************************************************/
void CStringDlg::OnButton_String_Seek ()
{
char CH[50],ch[10];
int i;
int Location[10]={0},Count=0,location=0,length=0,LENGTH=0;
CString str,STR,stmp;
GetDlgItemText(IDC_EDIT1,CH,50);//获取长字符串
GetDlgItemText(IDC_EDIT7,ch,10);//获取短字符串
if(!CH[0]) //判断长字符串是否为空
MessageBox("长字符串输入框为空,请输入符合数字和字母!");
else if(!ch[0])
{ MessageBox("请输入要查找的单词!");
GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE);//刷新输入框
SetDlgItemText(IDC_EDIT7,"");
GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW);
}
else{
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT8)->ShowWindow(SW_HIDE);
for(i=0;i<50;i++)/*分别统计长、短字符串的实际长度*/
{ STR+=CH[i];
if((CH[i]>='a'&&CH[i]<='z')||(CH[i]>='A'&&CH[i]<='Z')||(CH[i]>='0'&&CH[i]<='9')) LENGTH++;//长字符串实际长度
}
for(i=0;i<10;i++)
{ str+=ch[i];
if((ch[i]>='a'&&ch[i]<='z')||(ch[i]>='A'&&ch[i]<='Z')||(ch[i]>='0'&&ch[i]<='9')) length++;//短字符串实际长度
}
LPSTR p=str.GetBuffer(0);//短字符串指针
while(1)//循环结构中统计短字符串在长字符串中出现的位置和次数,每循环一次,就查找一个位置,并将开始查找的位置后移
{if(STR.Find(p,location)<0)
break;
Location[Count]=STR.Find(p,location);
location=Location[Count]+length;
++Count;//短字符串在长字符串中出现的次数
};
/*************************************
输出统计结果
**************************************/
stmp.Format("%d",Count);
GetDlgItem(IDC_EDIT8)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT8,stmp);
if(length*Count==LENGTH)
{ stmp.Format("空字符串!");
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT4,stmp);
str=stmp="";
for(i=0;i<Count;i++)
{stmp.Format("第%d次出现在第%d位\r\n",i+1,Location[i]+1);
str+=stmp;
}
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT5,str);
}
else if(Count!=0)
{STR.Delete(Location[0],length);
for(i=1;i<Count;i++)
STR.Delete(Location[i]-length,length);
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT4,STR);
str=stmp="";
for(i=0;i<Count;i++)
{stmp.Format("第%d次出现在第%d位\r\n",i+1,Location[i]+1);
str+=stmp;
}
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT5,str);
}
else
{ stmp.Format("字符串里没有所给单词!");
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT5,stmp);
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT4,STR);
}
}
}
/***************************************************
输入要插入到长字符串的短字符串,如果长字符串的长度n是偶数
就插入到第n/2的字符后面,如果n为奇数,就插入到第(n-1)/2个字符之后***************************************************/
void CStringDlg::OnButton_String_Insert ()
{
char CH[50],ch[10];
int i,LENGTH=0;
CString str,STR;
GetDlgItemText(IDC_EDIT1,CH,50);//获取长字符串
GetDlgItemText(IDC_EDIT9,ch,10);//获取要插入的短字符串
if(!CH[0]) //验证是否为空
MessageBox("输入框为空,请输入符合数字和字母!");
else if(!ch[0])
MessageBox("请输入要插入的单词!");
else
{
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE);
for(i=0;i<50;i++)
{ STR+=CH[i];
if((CH[i]>='a'&&CH[i]<='z')||(CH[i]>='A'&&CH[i]<='Z')||(CH[i]>='0'&&CH[i]<='9')) ++LENGTH;//长字符串实际长度
}
for(i=0;i<10;i++)
str+=ch[i];
LPSTR p=str.GetBuffer(0); //待插入的短字符串的指针
if((LENGTH%2)==0) /*确定要插入的位置*/
STR.Insert((LENGTH)/2,p); //插入字符串
else
STR.Insert((LENGTH-1)/2,p); //插入字符串
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_EDIT6,STR); //输出插入短字符串之后的长字符串 }
}
/***************************************************
清除所有数据并刷新对话框
***************************************************/
void CStringDlg::OnButton_Restart ()
{
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT8)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT9)->ShowWindow(SW_HIDE);
SetDlgItemText(IDC_EDIT1,"");
SetDlgItemText(IDC_EDIT2,"");
SetDlgItemText(IDC_EDIT3,"");
SetDlgItemText(IDC_EDIT4,"");
SetDlgItemText(IDC_EDIT5,"");
SetDlgItemText(IDC_EDIT6,"");
SetDlgItemText(IDC_EDIT7,"");
SetDlgItemText(IDC_EDIT8,"");
SetDlgItemText(IDC_EDIT9,"");
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT8)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT9)->ShowWindow(SW_SHOW);
}
六、函数作图器
1、设计流程
第一步:设计界面。根据题目要求,设计了类似计算器界面,将数字及运
算符分别放置。
第二步:编写代码。我选择用C语言分别按照公式编写代码,实现相应的
功能。
2、关键代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include "math.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
int oj = 0;
int lalala=0;
void MainWindow::on_pushButton_clicked()
{
ui->label->setText("y=");
ui->label_2->setText("sin");
ui->label_3->setText("x");
oj = 1;
}
void MainWindow::on_pushButton_2_clicked()
{
ui->label->setText("y=");
ui->label_2->setText("cos");
ui->label_3->setText("x");
oj = 2;
}
void MainWindow::on_pushButton_3_clicked()
{
ui->label->setText("y=");
ui->label_2->setText("tan");
ui->label_3->setText("x");
oj = 3;
}
void MainWindow::on_pushButton_4_clicked()
{
ui->label_3->setText("");
ui->label->setText("y=");
ui->label_2->setText("x^");
oj = 4;
}
void MainWindow::on_pushButton_5_clicked() {
ui->label->setText("y=");
ui->label_2->setText("*");
ui->label_3->setText("^x");
oj = 5;
}
void MainWindow::on_pushButton_6_clicked() {
ui->label->setText("y=");
ui->label_2->setText("log");
ui->label_3->setText("x");
oj = 6;
}
void MainWindow::on_pushButton_7_clicked() {
update();
}
void MainWindow::paintEvent(QPaintEvent *) {
int i;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); painter.drawLine(300,400,550,400); painter.drawLine(300,400,50,400);
painter.drawLine(300,400,300,150); painter.drawLine(300,400,300,650); painter.drawLine(550,400,547,397); painter.drawLine(550,400,547,403); painter.drawLine(300,150,297,153); painter.drawLine(300,150,303,153); for (i=0;i<50;i++)
{
if(i%5==0)
{
painter.drawLine(50+10*i,400,50+10*i,394); painter.drawLine(300,150+10*i,306,150+10*i); }
else
{
painter.drawLine(50+10*i,400,50+10*i,397);
painter.drawLine(300,150+10*i,303,150+10*i);
}
}
QString stra,strb,strxf,stryf,c;
float a,b,xf,yf,temp,c1;
bool ok;
int gg;
a=1;b=1;
xf=1;yf=1;
c1=0;
stra = ui->lineEdit->text();
strb = ui->lineEdit_2->text();
c=ui->lineEdit_5->text();
stryf = ui->lineEdit_3->text();
strxf = ui->lineEdit_4->text();
gg=1;
if (stra!="") a=stra.toFloat(&ok);
if (strb!="") {b=strb.toFloat(&ok);gg=strb.toInt(&ok);}
if (strxf!="") xf = strxf.toFloat(&ok);
if (stryf!="") yf = stryf.toFloat(&ok);
if (c!="")c1=c.toFloat(&ok);
switch (oj)
{
case 1:
for (i=0;i<2500;i++)
{painter.drawLine(300-0.1*i,400+(a*sin(b*i*xf/100))/yf*10-c1,300-0.1*(i+1),400+(a*sin(b*(i+1)*xf/100))/yf*10-c1);
painter.drawLine(300+0.1*i,400-(a*sin(b*i*xf/100))/yf*10-c1,300+0.1*(i+1),400-(a*sin(b*(i+1)*xf/100))/yf*10-c1);
}
break ;
case 2:
for (i=0;i<2500;i++)
{
painter.drawLine(300-0.1*i,400-(a*cos(b*i*xf/100))/yf*10-c1,300-0.1*(i+1),400-(a*cos(b*(i+1)*xf/100))/yf*10-c1);
painter.drawLine(300+0.1*i,400-(a*cos(b*i*xf/100))/yf*10-c1,300+0.1*(i+1),400-(a*cos(b*(i+1)*xf/100))/yf*10-c1);
}
break ;
case 3:
for (i=0;i<2500;i++)
{
if((a*tan(b*i*xf/100))/yf*10<250)
{
painter.drawLine(300-0.1*i,400+(a*tan(b*i*xf/100))/yf*10-c1,300-0.1*(i+1),400+(a*tan(b*(i+1)*xf/100))/yf*10-c1);
painter.drawLine(300+0.1*i,400-(a*tan(b*i*xf/100))/yf*10-c1,300+0.1*(i+1),400-(a*tan(b*(i+1)*xf/100))/yf*10-c1);
}
}
break ;
case 4:
for (i=0;i<2500;i++)
{
painter.drawLine(300+0.1*i,400-(a*pow(i*xf/100,b))/yf*10-c1,300+0.1*(i+1),400-(a*pow((i+1)*xf/100,b))/yf*10-c1);
if(gg==1&&gg%2!=0)
{
painter.drawLine(300-0.1*i,400+(a*pow(i*xf/100,b))/yf*10-c1,300-0.1*(i+1),400+(a*pow((i+1)*xf/100,b))/yf*10-c1);
}
else
{
painter.drawLine(300-0.1*i,400-(a*pow(i*xf/100,b))/yf*10-c1,300-0.1*(i+1),400-(a*pow((i+1)*xf/100,b))/yf*10-c1);
}
}
break ;
case 5:
if (b<0) ui->label_6->setText("");
else
{
for (i=0;i<2500;i++)
{
painter.drawLine(300+0.1*i,400-(a*pow(b,i*xf/100))/yf*10-c1,300+0.1*(i+1),400-(a*pow(b,(i+1)*xf/100))/yf*10-c1);
painter.drawLine(300-0.1*i,400-(a*pow(b,0-i*xf/100))/yf*10-c1,300-0.1*(i+1),400-(a*pow(b,0-(i+1)*xf/100))/yf*10-c1);
}
}
break ;
case 6:
b=2;
strb=ui->lineEdit_2->text();
b=strb.toFloat(&ok);
if(b<0||b==1) ui->label_6->setText(");
else
{
for (i=1;i<2500;i++)
{
painter.drawLine(300+0.1*i,400-(a*log(i*xf/100)/log(b))/yf*10-c1,300+0.1*(i+1),400-(a*log((i+1)*xf/100))/log(b)/yf*10-c1);
}
}
break ;
}
}
设计总结:
在刚开始拿到实习的题目时,脑袋完全是一片空白的,不知从何入手。因为是第一次真正的将自己所学的编程知识用于实践,所以用起来很是生疏,而且题目要求的好多知识我们都尚未学习,这给我按时完成实习任务带来了很大的难度和挑战。为了顺利完成此次计算机实习,我开始看相关教程视频,去图书馆查找相关资料,学习相关软件的操作等。功夫不负有心人,最终,我总算顺利完成了此次实习。此外,我个人也得到了不少收获,一方面加深了我对理论知识的理解,另一方面也提高了我将知识用于实践的能力。