c++第三次实验

Part 1 画布小球试验

一、了解相关函数用法

1、system()

      system("pause")就是从程序里调用"pause"命令;pause命令的功能:在命令行上输出"按任意键继续······",等待用户按一个键,然后返回。

      system("color xx").第一个为背景色:黑色0  蓝色1  红色4  紫色5  灰色8  淡蓝色9  淡紫色D  淡黄色E。第二个为前景色:绿色2  湖蓝色3  黄色6  白色7  浅绿色A  淡红色C  亮白色F 

       system函数用法:包含头文件<cstdlib>。

                  1、使用system函数调用DOS命令。常见的还有清屏操作:system("cls")

                  2、使用system函数运行可执行文件。例:system("\"C:\\windows······"")

                  3、使用system函数运行批处理文件:例:system("\"c:a.bat\"");

2、string类中成员函数c_str()

        const char *c_str();

        c_str()函数返回一个指向正规c字符串的指针常量,内容与string串相同。为了与c语言兼容,在c中没有string类型,所以必须通过string类对象的成员函数c_str()把string 对象转换成c中字符串的样式。

        例如:char c[20];string s="1234";strcpy(c , s.c_str());

        (参考博客https://blog.csdn.net/Makefilehoon/article/details/80687087)

 

二、选做部分

1、优化简洁代码

       修改部分如下:

       在ball类的声明中添加一行函数声明:void recover(int x0 = 0, int y0 = 0);

Ball::Ball(int x0, int y0):x(x0), y(y0) {
    // 打印y0-1行空行
    for(int line=1; line <= y0-1; line++)
        cout << endl;
    
    // 打印x0-1个空格
    for(int col=1; col <= x0-1; col++) 
        cout << " ";
    
    // 打印小球
    cout << "O" << endl; 
    
}
void Ball::recover(int x0, int y0){
   system("cls");//清屏
    
    Ball(x0, y0);
}

void Ball::left(int step) {
    x = x-step;
    if(x <= 0)
        x=0;
    
    recover(x, y);
}
ball类实现部分的更改
Canvas::Canvas(string bg0, string fg0):bg(bg0), fg(fg0) {
    string color = "color ";
    color += bg0;
    color += fg0;
    system(color.c_str());
} 
void Canvas::changeCanvasBg(string bg0) {
    bg = bg0; // 更新画布背景色 
    
    Canvas(bg,fg);
    
}
Canvas的函数实现部分修改

2、简单增加了换画布的操作

       在canvas类中添加相应函数声明,同时可以利用到gragh中,效果差不多。

void Canvas::inputfg()
{
    cin >> fg;
    changeCanvasFg(fg);
}

void Canvas::inputbg()
{
    cin >> bg;
    changeCanvasBg(bg);
}
Canvas类实现中增添代码

      

(编写通过“a”“s”“d”“w”来操作小球移动没成功)

Part 2 GRAGH

基本draw函数实现

#ifndef GRAPH_H
#define GRAPH_H

// 类Graph的声明 
class Graph {
    public:
        Graph(char ch, int n);   // 带有参数的构造函数 
        void draw();     // 绘制图形 
    private:
        char symbol;
        int size;
};


#endif
graph.h
// 类graph的实现
 
#include "graph.h" 
#include <iostream>
using namespace std;

// 带参数的构造函数的实现 
Graph::Graph(char ch, int n): symbol(ch), size(n) {
} 


// 成员函数draw()的实现
// 功能:绘制size行,显示字符为symbol的指定图形样式 
void Graph::draw() {
    int i, j, m;
    for (i = 1; i <= size ; i++)
    {
        for (j = 1; j <= size - i; j++)
            cout << " ";
        for (m = 1; m <= (2*i - 1); m++)
            cout << symbol;
        for (j = 1; j <= size - i; j++)
            cout << " ";
        cout << endl;
    }

}
gragh.cpp
#include <iostream>
#include "graph.h"
using namespace std;

int main() {
    Graph graph1('*',5);
    graph1.draw();
    
    system("pause");
    system("cls");
    
    Graph graph2('$',7);
    graph2.draw();
    
    return 0; 
} 
main.cpp

 

 

 

Part 3 Fraction 类

#pragma once
class Fraction
{
public:
    Fraction(int num=0,int den=1);
    Fraction(Fraction &p);
    ~Fraction();
    void input();
    void reduction();
    int Gcd(int m,int n);
    void add(Fraction p);
    void substraction(Fraction p);
    void multiply(Fraction p);
    void division(Fraction p);
    void compare(Fraction p);
    void show();
private :
    int numer;//numer是分子
    int denom;//denom是分母
};
Fraction.h
#include "Fraction.h"
#include<iostream> 
#include<stdlib.h>
using namespace std;

Fraction::Fraction(Fraction &p)//复制构造函数
{
    numer = p.numer;
    denom = p.denom;
}

void Fraction::input()
{
    cin >> numer;
    cin >> denom;
    if (denom == 0)
    {
        cout << "Input illdegal.Please input again."<<endl;
        input();
    }
}


int Fraction::Gcd(int m,int n)
{
    int t, r,gcd;
    if (m < n)
    {
        t = m; m = n; n = t;
    }
    while ((m%n) != 0)
    {
        r = m % n;
        m = n;
        n = r;
    }
    gcd = n;
    return gcd;
}

void Fraction::reduction()
{
    int g;
    int a,b;
    a =abs( numer); b =abs( denom);
    g = Gcd(a,b);
    numer = numer / g;
    denom = denom / g;
}

Fraction::Fraction(int num,int den):numer(num),denom(den)//构造函数
{
}

void Fraction::add(Fraction p)//加法
{
    int mc;//gcd为分母的最大公约数,a=gcd/第一个分母,b=gcd/第二个分母
    int c, d,g;//c,d分别表示第一,第二个分数通分后的分子
    int m, n;
    m = abs(denom); n = abs(p.denom);
    g=Gcd(m,n);//操作只改变m,n的值,不改变denom和p.denom的值
    mc = abs(denom)*abs(p.denom) / g;//mc最大公倍数
    c = numer * (mc/abs(denom)); d = p.numer*(mc/abs(p.denom));//p.numer为正则为加法,为负则为减法
    p.numer = c + d;//此时改变了p的分子分母的值
    p.denom = mc;
    p.reduction();
    if (p.numer%p.denom == 0)
        cout << p.numer / p.denom << endl;
    else
        cout << p.numer << "/" << p.denom << endl;
}

void Fraction::substraction(Fraction p)//规定第二个是减数
{
    p.numer = -p.numer;
    add(p);
}

void Fraction::multiply(Fraction p)
{
    p.numer = p.numer*numer;
    p.denom = p.denom*denom;
    p.reduction();
    cout << p.numer << "/" << p.denom << endl;
}

void Fraction::division(Fraction p)
{
    int t;
    t = p.denom;
    p.denom = p.numer;
    p.numer = t;
    multiply(p);
}

void Fraction::compare(Fraction p)
{
    int g,mc;
    int c, d;
    int m, n;
    m = abs(denom); n = abs(p.denom);
    g = Gcd(m,n);
    mc = abs(denom)*abs(p.denom) / g;
    c = numer * (mc / abs(denom)); d = p.numer*(mc / abs(p.denom));
    if (c > d)
        cout << numer << "/" << denom << ">" << p.numer << "/" << p.denom << endl;
    if (c < d)
        cout << numer << "/" << denom << "<" << p.numer << "/" << p.denom << endl;
    if (c == d)
        cout << numer << "/" << denom << "=" << p.numer << "/" << p.denom << endl;
}

void Fraction::show()
{
    cout << numer << "/" << denom << endl;
}

Fraction::~Fraction()
{
}
Fraction.cpp
#include<iostream>
#include<cstdlib>
#include"Fraction.h"
using namespace std;
int main()
{
    Fraction a(1,2),d(5, 6),e(-1,3),f(3,7),g(4,13);
    Fraction b;
    Fraction h(5);
    Fraction c=3;
    b.input();
    b.reduction();
    cout << "b is ";
    b.show();
    cout << "Compare a and b.The result is";
    a.compare(b);//比较
    cout << "a+b=";
    a.add(b);//加法
    cout << "d-c=";
    d.substraction(c);//减法
    cout << "e×f=";
    e.multiply(f);//乘法
    cout << "g÷h=";
    g.division(h);
    system("pause");//程序调试窗口闪退
    return 0;
}
main.cpp

 

1、增加判断分数是否有意义(分母为零)。在input输入函数中的两行代码。

2、约分。见函数reduction。

3、后期评论他人代码时注意到,自己利用公倍数的方法着实不简便。

 

实验总结

1、学习实验了分文件,注意各分文件中所需头文件仍然需要在开头注明。

2、学习了清屏,换颜色等system的用法。

3、本次实验做起来相对是比较通畅的,主要卡壳在按键移动小球?

评论

https://www.cnblogs.com/yfwg/p/10739568.html

 https://www.cnblogs.com/libing-072921/p/10728911.html

https://www.cnblogs.com/qiuqiuwr/p/10739483.html

 

转载于:https://www.cnblogs.com/lovecpp/p/10733377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
预处理是编译器的第一个阶段,主要完成对源程序的预处理工作,包括宏定义和条件编译等。在C语言中,预处理指令都以#开头,例如#define、#include等。 下面是一个简单的C程序示例: ``` #include <stdio.h> #define PI 3.1415926 int main() { double r, s; scanf("%lf", &r); s = PI * r * r; printf("The area of the circle is: %lf\n", s); return 0; } ``` 预处理阶段主要完成以下工作: 1. 将#include指令替换为指定的头文件内容。 在上面的示例中,#include <stdio.h>指令会将stdio.h头文件的内容插入到程序中。 2. 将#define指令替换为指定的宏定义内容。 在上面的示例中,#define PI 3.1415926指令会将程序中所有出现的PI替换为3.1415926。 3. 处理条件编译指令,例如#if、#else、#elif和#endif等。 条件编译指令可以根据不同的条件编译不同的代码段,例如: ``` #define DEBUG ... #ifdef DEBUG printf("Debugging information\n"); #endif ``` 在上面的示例中,如果定义了DEBUG宏,则会输出“Debugging information”,否则不会输出。 4. 处理其他预处理指令,例如#error、#pragma等。 #error指令可以在编译时输出错误信息,例如: ``` #if MAX_SIZE > 1024 #error MAX_SIZE is too large #endif ``` 在上面的示例中,如果MAX_SIZE大于1024,则会输出“MAX_SIZE is too large”。 #pragma指令可以用来控制编译器的行为,例如: ``` #pragma pack(1) struct { char c; int i; } s; ``` 在上面的示例中,#pragma pack(1)指令会将结构体s的对齐方式设置为1字节,而不是默认的4字节。 预处理阶段的输出结果是一个新的C源程序,其中所有的预处理指令都已经被处理完毕。编译器的下一个阶段是编译阶段,将源程序翻译成目标代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值