实验四、循环语句实验

实验四、循环语句实验

一、实验目的

  1. 掌握新的选择语句switch和循环结构
  2. 掌握do…while、for语句实现循环结构
  3. 理解for、while、do…while三者的区别
  4. 掌握转向语句break、continue
  5. 掌握循环语句实现延时的原理和方法

二、实验原理

三、实验内容

  1. 实现1到n的阶乘和

    #include<windows.h>
    #include<iostream>
    using namespace std;
    long long fun(int n) {
        if (n == 1) return 1;//递归初始值为1
        else return n * fun(n - 1);//每次返回n乘下一项的返回值
    }
    int main() {
        int n;
        long long sum = 0;//用longlong存防止n值取的过大导致超过int类型的精度
        while (1) {
            cin >> n;
            //if (n == EOF) break; 尝试完成输入ctrl z结束循环,但失败了
            for (int i = 1; i <= n; i++) {
                sum += fun(i);//从1开始累加
            }
            cout << sum << endl;//输出累加的值
        }
        
    }
    

    代码出错,每次循环未能将sum重置为0,

    #include<windows.h>
    #include<iostream>
    using namespace std;
    long long fun(int n) {
        if (n == 1) return 1;//递归初始值为1
        else return n * fun(n - 1);//每次返回n乘下一项的返回值
    }
    int main() {
        int n;
        while (1) {
            long long sum = 0;//用longlong存防止n值取的过大导致超过int类型的精度
            cout<<"输入n的值为:"<<endl;
            cin >> n;
            //if (n == EOF) break; 尝试完成输入ctrl z结束循环,但失败了
            for (int i = 1; i <= n; i++) {
                sum += fun(i);//从1开始累加
            }
            cout << "1到n的阶乘累加和为:"<<sum << endl;//输出累加的值
        }
    }
    

    实验结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bAFEMuY-1679500637762)(C:\Users\15989\AppData\Roaming\Typora\typora-user-images\image-20230322211204326.png)]

  2. 别碰方块游戏

    按照ppt内容,分为以下板块:

    • 问题分析
    • 方块的绘制和移动
    • 按空格键控制小球起跳
    • 小球和方块的碰撞判断
    • 随机方块的速度和高度
    • 得分的计算和显示
    • 避免空中起跳

    代码如下:

    #include<iostream>
    #include<ctime>
    #include<conio.h>
    #include<graphics.h>
    using namespace std;
    int main() {
    	//游戏画面的建立
    	float width, height, gravity;//游戏画面的宽、高、重力加速度
    	float ball_x, ball_y,ball_vy, radius;//小球圆心坐标、y方向速度、半径
    	int score=0,flag=1;//设置分数,flag标志位
    	int isBOnF = 1;//标志位,判断小球是否在地面
    	width = 600;//游戏画面宽度
    	height = 400;//游戏画面高度
    	gravity = 0.6;//重力加速度
    	initgraph(width, height);//新建画布
    	//小球的初始化
    	radius = 20;//小球半径
    	ball_x = width / 4;//小球x位置
    	ball_y = height - radius;//小球y位置
    	ball_vy = 0;//小球初始y速度为0
    	//方块的绘制和移动
    	float rec_l_x, rec_t_y, rec_width, rec_height, rec_vx;//方块的参数
    
    	rec_vx = -3;//初始速度为-3;
    	rec_height = 100;//方块高度
    	rec_width = 20;//方块宽度
    	rec_t_y = height - rec_height;//方块顶部y坐标
    	rec_l_x = width * 3 / 4;//方块左边x坐标
    	srand(time(NULL));//通过系统时间来随机设置随机种子
    	while (1) {
    		if (_kbhit()) {//当按键时
    			char input = _getch();//获得输入字符
    			if (input == ' ' && isBOnF == 1) {//当按空格并且小球在地面时
    				ball_vy = -17;//将小球速度置为-17
    				isBOnF = 0;//地面标志位置为0
    			}
    			//if (input == ' ') {//当按下空格
    				//ball_vy = -16;//可更改,下落速度
    			//}
    		}
    		ball_vy += gravity;//根据重力加速度更新小球y方向速度
    		ball_y += ball_vy;//根据小球y方向速度更新其y坐标
    		if (ball_y >= height - radius) {//如果落在地面上
    			ball_vy = 0;//y速度为0
    			ball_y = height - radius;//规范其y坐标,避免落到地上
    			isBOnF = 1;
    		}
    		if (ball_y <= radius) ball_y = radius;//规范其y坐标,避免超过画面顶部
    		//移动方块
    		if (rec_l_x <= -20) {//方块右边线走到最左边时
    			rec_l_x = width;//将方块置于最右边
    			rec_height = rand() % int(height / 4) + height / 4;//随机高度
    			rec_vx = rand() / float(RAND_MAX) * 4 - 7;//随机速度
    			if (flag == 1) {//如果flag位为1,则加分数,如果flag位为0,说明该方块被碰撞,不加分
    				score++;//加分
    			}
    			else flag = 1;//flag标志位置1
    		}
    		rec_l_x += rec_vx;
    		if ((rec_l_x <= ball_x + radius) && (rec_l_x + rec_width >= ball_x - radius) && (height - rec_height <= ball_y + radius)) {
    			Sleep(100);//慢动作效果
    			score = 0;//清零
    			flag = 0;//标志位置0
    		}
    		cleardevice();
    		TCHAR s[20];//定义字符串数组
    		swprintf_s(s, _T("%d"), score);//不兼容_sprintf函数,改用swprintf_s,用来将score转换为字符串
    		settextstyle(40, 0, _T("宋体"));//设置文字大小、字体
    		outtextxy(50, 30, s);//输出得分文字
    		fillcircle(ball_x, ball_y, radius);//画圆
    		fillrectangle(rec_l_x, height - rec_height, rec_l_x + rec_width, height);//画方块
    		Sleep(10);//延迟10ms
    	}
    	closegraph();//关闭画布
    
    }
    

    改进的点:

    1. 添加flag符号位,碰到过的方块不会计入分数
    2. 添加了随机数种子,获得真正随机数
    3. 修改了_sprintf()函数

    实验结果放在压缩包内。

  3. 简单计算器的实现

    • 设计一个简单计算器,实现两个数加减乘除取余运算。
    • 给出菜单选择

    改进的点:

    1. 添加flag符号位,碰到过的方块不会计入分数
    2. 添加了随机数种子,获得真正随机数
    3. 修改了_sprintf()函数

    实验结果放在压缩包内。

  4. 简单计算器的实现

    • 设计一个简单计算器,实现两个数加减乘除取余运算。
    • 给出菜单选择

四、实验心得体会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mighty-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值