北邮计算机实习报告

时间:2024.5.9

电子工程学院

计算机实习设计报告

班级:姓名:学号:

一、魔方阵

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 ;

}

}

设计总结:

在刚开始拿到实习的题目时,脑袋完全是一片空白的,不知从何入手。因为是第一次真正的将自己所学的编程知识用于实践,所以用起来很是生疏,而且题目要求的好多知识我们都尚未学习,这给我按时完成实习任务带来了很大的难度和挑战。为了顺利完成此次计算机实习,我开始看相关教程视频,去图书馆查找相关资料,学习相关软件的操作等。功夫不负有心人,最终,我总算顺利完成了此次实习。此外,我个人也得到了不少收获,一方面加深了我对理论知识的理解,另一方面也提高了我将知识用于实践的能力。

更多相关推荐:
北邮计算机实习报告

北京邮电大学计算机实习指导教师方莉北京邮电大学信息与通信工程学院计算机实习计划书信息与通信工程学院20xx级20xx年暑期第1页北京邮电大学计算机实习指导教师方莉1教学目标北京邮电大学信息与通信工程学院20xx...

北邮计算机实习报告

计算机实习报告班级:姓名:学号:日期:小学期计算机实习实验报告一.功能说明1.1总体功能说明主要实现俄罗斯方块游戏,添加了音乐文件1.2用户界面这两个界面可以实现显示分数,当前等级,以及下一个将会出现的图形如果…

北邮计算机实习报告

北京邮电大学20xx年计算机实习报告20xx211205王旋北京邮电大学计算机实习报告学院电子工程学院班号20xx211205学号20xx210986姓名王旋北京邮电大学20xx年计算机实习报告20xx2112...

北京邮电大学电子工程学院计算机实习报告,题目基本历年都一样

暑期实习报告1由数字信号处理原理可知计算有限长数字序列线性卷积的公式为xn0nN1若xnelse0则ynnhn0nM1hn0elsem0xmhnm0nNM105n0nN2hn0else10nN1取xnelse0...

北邮电子工艺实习报告

北京邮电大学实习报告北京邮电大学电子工艺实习报告附页1焊接工艺11焊接工艺的基本知识焊接是通过加热或加压力或两者并用使被焊金属原子之间互相溶解与扩散使分离的金属材料牢固地连结在一起的工艺方法111电烙铁简介外热...

北京邮电大学实习报告封面格式

北京邮电大学实习报告

北京邮电大学实习报告

北京邮电大学实习报告北京邮电大学实习报告集20xx20xx学年实习题目指导教师学院班计算机学院班级范围日期范围20xx年月日到20xx年月日

北京邮电大学大三实习报告模版

北京邮电大学实习报告

北京邮电大学实习报告模版

北京邮电大学实习报告

北邮电子工艺实习报告

北京邮电大学实习报告附页:实习中总结任务要求:根据所给的小车电路和所给的器件进行智能小车的制作,首先根据电路图以及电路板进行小车所需的元器件的焊接,要求焊接点要符合要求,不能虚焊,焊接完成之后再安装小车的一些基…

北邮电子电子工艺实习报告

北京邮电大学实习报告电子工艺实习报告孙月鹏20xx210876电子工程学院电子信息科学与技术专业3班在大三的全新生活开始之际我们迎来了分班后的第一项课业任务电子工艺实习在连续两周的学习中我们克服了种种困难将一堆...

北邮 计算机实习 贪吃蛇游戏编写报告

20xx年计算机实习报告计算机实习报告姓名班级学号小班序号指导老师题目贪吃蛇小游戏邮箱20xx年9月120xx年计算机实习报告贪吃蛇小游戏实验报告一功能说明11总体功能说明该软件主要实现的是贪吃蛇的基本功能达到...

北邮计算机实习报告(24篇)