一、 上机目的和要求
a. 实验四

  1. 掌握指针的定义和使用。
  2. 掌握指针在函数参数传递中的作用。
  3. 掌握引用的作用、定义及使用。
  4. 掌握结构体类型变量、结构体类型指针及结构体数组的定义和使用。
  5. 熟悉联合体的概念与应用,了解联合型、枚举型的定义与使用。
  6. 使用构造类型数据解决实际应用问题,优化程序设计。
    b. 实验五
  7. 掌握类定义的基本格式和类成员的访问控制。
  8. 掌握对象定义和利用构造函数对对象的数据成员进行初始化的方法。
  9. 掌握成员函数的定义与使用。
  10. 理解并掌握静态数据成员和静态成员函数的使用方法。
  11. 理解友元函数的使用方法。
    c. 实验六
  12. 掌握类的概念、定义格式、类与结构的关系、类的成员属性和类的封装性;
  13. 掌握类对象的定义;
  14. 理解类的成员的访问控制的含义,公有、私有和保护成员的区别;
  15. 掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数;

二、 基本知识和原理
a. 实验四
(一)指针

  1. 指针和指针变量
    所谓指针就是变量、数组、函数等的存储地址。
    指针变量就是用于存放指针的变量。
    直接按变量地址存取变量值的方式为直接访问方式。
    将变量地址存放在另一个变量(即指针变量)中,再通过指针变量来存取变量值的方式为间接访问方式。
    指针变量可以存储各类标识符的地址,包括变量、数组、函数、对象,甚至是指针。
    同类型的对象取地址的方式却不尽相同:
    (1) 一般变量的地址,用取地址符“&”加变量名;
    (2) 数组的地址用数组名表示;
    (3) 函数的地址用函数名表示。
  2. 指针变量作为函数参数
    在C++中,有3种类型的指针可以作为函数的参数,它们是:
    (1)一般对象(变量)的指针作为函数的参数;
    (2)数组的指针(字符串的指针)作为函数的参数;
    (3)函数的指针作为函数的参数。
    第一种情况是地址参数。第二种情况是指针作为参数非常多的一种情况,它体现出指针作为参数的优势就是简单、灵活、高效。第三种情况较复杂,主要是为了设计出一个更通用的函数。
    (二)结构体、共用体和枚举
  3. 构造数据类型的定义
    (1) 结构体类型定义的一般形式为:
    struct 结构体类型名
    {
    类型标识符1 成员1;
    类型标识符2 成员2;

    类型标识符n 成员n;
    };
    每个成员名前的类型标识符可以是已经定义了的任意类型,当然也可以是结构体类型标识符,即结构体成员可以是另一个结构体变量。成员也可以是指向本结构体类型的指针变量。
    (2) 联合体和结构体的定义形式相似,使用了union关键字。
    在作用域范围内,结构体对象的每个数据成员都有固定的存储位置,都可以随时被访问,而联合体对象的每个成员都从同一个位置(即对象的首地址)开始存储,在任一时刻只能保存一个数据成员,因而也只有该成员能够被访问,当然在不同的时刻可以用联合体对象存储不同的成员并进行相应的访问。
    (3) 枚举类型和枚举变量的定义形式为:
    enum<枚举类型名>{<枚举表>};

    enum{<枚举表>}<变量名表>;
    枚举类型定义中每个枚举元素代表一个整数值。如果定义时枚举元素未指定值,编译系统按定义顺序取默认值一次为0,1,2,3,……。也可以给枚举值指定对应值。
  4. 构造类型变量的定义及初始化
    (1) 结构体变量的定义及初始化有3种形式:
    ① 结构体类型名定义结构体变量
    [struct] <结构体类型名> <结构体变量名>[={<初始化数据>}|<结构变量名>],…;
    ② 定义结构体类型的同时定义结构体变量,
    struct 结构体类型标识符
    {
    类型标识符1 成员名1;
    类型标识符2 成员名2;

    类型标识符n 成员名n;
    } <结构体变量名>[={<初始化数据>}|<结构变量名>],…;
    ③ 定义无名结构体类型的同时定义结构体变量
    struct
    {
    类型标识符1 成员名1;
    类型标识符2 成员名2;

    类型标识符n 成员名n;
    } <结构体变量名>[={<初始化数据>}|<结构变量名>],…;
    结构体类型变量的各个元素一次占用一块连续的内存空间,结构体变量所占的内存长度等于每个成员长度之和,结构体变量占用的内存大小可以用sizeof计算。
    (2) 联合体变量的定义同结构体变量一样,也有3种形式,但是使用的关键字为union。
    联合体和结构体的定义形式相似,但含义不同,结构体变量所占的内存长度等于个成员所占内存长度之和(即每个成员分别占有自己的内存)。联合体变量所占的内存长度等于最长的成员的长度(即每个成员共享同一段内存)。
    不能直接引用联合体变量,也不能在自定义联合体变量的同时进行初始化,而只能引用联合体变量的成员。
    (3) 枚举类型的变量定义可以有以下形式。
    ① 定义类型时定义,例如:
    enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat} d1,d2,d3;
    ② 直接定义枚举变量,例如:
    enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat} d1,d2,d3;
    ③ 使用枚举类型定义枚举变量,例如:
    enum day d1,d2,d3;

    day d1,d2,d3;
    枚举变量只能取花括号中所列出的标识符,而取其他值都是非法的。
  5. 构造类型成员的访问
    (1) 结构体成员的访问
    直接访问结构体的成员:结构体变量名.成员名。
    间接访问结构体的成员:结构体指针->成员名。
    也可以使用以下形式访问结构体变量:
    (*p).num、(*p).name、(*p).score
    当用“.”和“->”运算符访问嵌套结构体的成员时,先访问外层后访问内层,逐层处理,例如:
    Student1 LiYing,*p=&LiYing;
    LiYing.birthday.year=2003;
    p->birthday.day=26;
    同类型的结构变量可以相互赋值,其运算功能是把右边的变量值复制到左边的变量中,即复制到左边变量对应的存储空间中,运算结果为左边的变量。
    (2) 联合体成员的访问
    直接访问联合体的成员:联合体变量.成员名。
    间接访问联合体的成员:联合体指针->成员名。
    注意:不能直接引用联合体变量,也不能在定义联合体变量时进行初始化,而只能引用联合体变量的成员。
    (3) 枚举元素的引用
    枚举元素的引用不同于结构体成员和联合体成员。它不需要使用“.”和“->”运算符,而是在枚举类型定义之外,可以直接引用。例如:
    enum color {red,yellow,green=3,blue} c1;
    c1=blue; //枚举元素作为整型变量向枚举变量赋值,可以直接引用
    对枚举元素按常量处理,但不能对它们赋值,例如:
    red=0; //错误,不能给枚举常量赋值
  6. 构造体类型变量作为函数参数
    (1) 结构体类型作为函数参数
    结构体是一种类型,它能够使用在允许简单类型使用的所有地方,也允许作为函数参数类型和返回值类型。将一个结构体变量的值传递给另一个函数,有3种办法:
    ① 用结构体变量的成员作实参:将实参值传给形参,属于“值传递”方式,要求实参与形参的类型保持一致。
    如,有函数定义
    void fun(int num);
    则有调用形式
    fun(stu.num);
    其中,stu.num是结构体变量stu的一个成员,其类型为int。
    ② 用结构体变量作实参:采用的是“值传递”方式,将结构体变量所占的内存单元的内容全部顺序传给形参。要求形参也必须是同类型的结构体的变量。
    如,有函数定义
    void fun(student a);
    则有调用形式
    fun(x);
    其中,x是结构体变量,其类型为student。
    ③ 用指向结构体变量(或数组)的指针作实参:将结构体变量(或数组)的地址传给形参,属于传址调用,在函数中对形参的操作实际上是对实参的操作。
    如,有函数定义
    void fun(student *P,int n);
    void fun1(student *S,int n);
    则有调用形式
    fun(&x,n);
    fun1(stu,n);
    其中,x是结构体类型student的结构体变量,stu是结构体类型student的结构体数组名。fun函数调用将结构体变量x的地址传递给形参指针p,然后执行fun的函数体。fun1函数调用将结构体数组stu[]的首地址传递给形参指针s,然后执行fun1的函数体。
    注意:函数也可以返回结构体变量、结构体变量的成员或结构体变量的指针。由于用结构体变量作为函数参数和函数返回结构体变量在时间和空间上的开销都比较大,因此使用较少,多用于指向结构体变量的指针来替代。
    (2) 联合体作为函数的参数
    可以使用联合体变量的成员和指向联合体变量的指针作为函数参数。当使用指向联合体变量的指针时,指针访问的内容视指针指向的成员的类型决定。
    不能把联合体变量作为函数参数,也不能让函数带回联合体变量。
    (3) 枚举作为函数的参数
    枚举元素和枚举变量可以作为函数参数,函数的返回值也可以是枚举类型。枚举类型的作用域与一般变量相同。
    b. 实验五
  7. 类的定义
    在面向对象程序设计中,类(class)就是对现实世界中抽象出的“类”的模拟描述,是用户自己定义的数据类型,它的一般定义格式如下:
    class <类名>
    {
    private:
    <私有数据成员和成员函数>;
    protected:
    <保护数据成员和成员函数>;
    public:
    <公有数据成员和成员函数>;
    };
    <类中各个成员函数的实现>
    2.类成员的访问控制
    类的成员访问权限总体上可分为:公有的(public)、私有的(private)和保护的(protected)三类。若某个成员未作任何访问权限声明,则默认为私有的。
    公有的成员用public来说明,这部分通常是一些操作(即成员函数),作为类与外界的接口,所有公有的成员可以在程序中的任何位置被访问。
    私有的成员用private来说明,这部分通常是一些数据成员,这些成员用来描叙该类中对象的属性的,只有成员函数或经过特殊说明的函数(如友元函数)才可以引用它们,它们是特意被用户隐藏起来的部分,用户在类外其他地方是无法访问它们的。
    保护的成员用protected来说明,它的限定能力介于私有和公有之间,除了类本身的成员函数、友元函数可以访问成员外,只有该类的派生类(子类)可以访问。
    关键字public、private和protected被统称为访问权限修饰符或访问控制修饰符。它们在类体(即一对花括号内)出现的先后顺序没有要求,并且允许多次出现。
  8. 对象的定义
    C++规定:必须先定义类,然后定义对象,用类来定义对象在格式上与普通类型定义变量是完全相同的.
    定义对象的一般形式:
    <类名> <对象名表>;
    4.对象成员的访问方式
    对象成员访问的一般形式是:
    <对象名>.<数据成员名>
    或者
    <对象名>.<成员函数名>([<实参表>])
  9. 构造函数的定义和分类
    构造函数是类的一种特殊的成员函数,它的主要作用于是为对象分配空间和进行初始化工作。除了具有一般成员函数的特征外,还具有以下一些特殊的性质:
    (1) 构造函数的名字必须与类名字相同;
    (2) 构造函数可以有任意类型和任意个数的参数,所以构造函数可以重载,但不能指定返回值类型;
    (3) 构造函数的函数体可以写在类体内,也可以写在类体外;
    (4) 构造函数被声明为公有函数,但它不能像其他成员函数那样被显示的调用,而是在用类声明对象的同时被系统自动调用。
    调用构造函数的一般形式是:
    类名 对象名(参数表);
    构造函数分为4类,分别是普通构造函数、默认构造函数、有缺省参数的构造函数和复制(拷贝)构造函数。
  10. 默认构造函数
    默认构造函数是指没有任何参数的构造函数。如果在设计类时没有定义构造函数,C++编译程序会自动为该类建立一个默认的构造函数。这个默认构造函数没有任何形式参数,并且函数体为空。其格式如下:
    <类名>::<默认构造函数名>() { }
    按构造函数规定,默认构造函数名与类名相同。默认构造函数也可以由程序员直接定义在类体中。另外,如果构造函数的参数具有默认值时,这样的构造函数被称为有缺省参数的构造函数。
    7.拷贝构造函数
    拷贝构造函数是一种特殊的构造函数,用于依据已存在的对象建立一个新对象。其一般形式为:
    class T
    {
    public:
    T(const T & 对象名);
    ……
    }
    T::T(const T &对象名 )
    { 函数体 }
    其中,T代表任何一个类的名字。const是一个类型修饰符,被它修饰的对象是不能被改变的常量.
    拷贝构造函数的拷贝分为浅拷贝和深拷贝。一般来说,只需浅拷贝时最好利用系统自动生成的拷贝函数,这样效率高。若需要在构造函数中开辟新的内存空间,则需要我们自己编写这样的构造函数以完成深拷贝。
    拷贝构造函数主要在下面3种情况中起到初始化作用。
    (1) 声明语句中用一个对象初始化另外一个对象,例如:
    Person student2 (student1);
    (2) 函数的参数是值参数时,若用对象作为函数实参传递给函数形参,这时需要调用拷贝构造函数。
    (3) 当对象作为函数返回值时,如执行return R 时,系统将用对象R来初始化一个匿名对象,这时需要调用拷贝构造函数。
    8.析构函数
    析构函数是类的一种特殊成员函数,其功能是用来释放一个对象的内存空间。它的功能与构造函数正好相反.
    析构函数的特点如下:
    (1)析构函数是成员函数,函数体可以写在类体内,也可以写在类体外;
    (2)析构函数是一个特殊的函数,它的名字是在类名的前面加“~”字符;
    (3)析构函数没有参数,没有返回值,所以不能重载。
    在下面两种情况下,析构函数会被自动调用:
    A.当一个对象的作用域结束时,该对象的析构函数被自动调用。
    B.当一个对象是使用new运算符被动态创建的,那么在使用delete运算符释放它时,delete将会自动调用析构函数。
    9.重载成员函数
    构造函数可以重载,而析构函数不能重载,原因是构造函数可以有参数,析构函数不带任何参数,所以无法重载。可以说,带有不同类型和数量参数的成员函数都可以进行重载。
    10.子对象
    将一个类的对象作为另一个类的成员,该对象就被称为子对象。
    在一个类中出现了子对象时,该类的构造函数就要考虑子对象的初始化问题。在C++中,通常采用初始化列表的方法来初始化子对象。在初始化列表中可以包括对子对象的初始化及对类中其他成员的初始化。
    11.指向对象的指针
    每个对象在声明后都会在内存中占有一定的空间,就会有地址。因此,可以用指针变量来保存这个地址。指向对象的指针(变量)就是用于存放对象地址的变量。声明对象指针的一般形式为:
    <类名><对象指针名>;
    声明对象指针的语法和声明其他数据类型指针的语法相同。使用对象指针时,首先要把它指向一个已创建的对象,然后才能以“间接方式”访问该对象。
    12.this指针
    this指针是一个隐含于每个类的成员函数中的特殊指针。该指针是一个指向正在操作的成员函数的对象。当一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数。
    13.对象数组
    对象数组是指将对象作为数组元素的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义、赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是具有相同类的若干个对象。
    定义一个对象数组的一般形式是:
    <类名><数组名>[<数组长度>];
    定义二维对象数组的一般形式是:
    <类名><数组名>[<第一维数组长度>][<第二维数组长度>];
    14.常对象
    如果在说明对象时用const修饰,则被说明的对象为常对象。常对象的数据成员值在对象的整个生命期内不能改变,常对象的声明形式如下:
    <类名>const<对象名>[(初值)]; 或者
    const<类名><对象名>[(初值)];
    在定义常对象时必须进行初始化,而且常对象不能被更新。
    15.常数据成员
    在类中使用关键字const来说明某个数据成员为常数据成员。如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该数据成员赋值。
    类的常数据成员即可以是常量也可以是常引用,由于必须初始化,因此,类中这些常数据成员必须也只能通过构造函数的成员初始化列表来实现初始化工作。
    16.常成员函数
    在类中使用关键字const说明的函数称为常成员函数,它的一般说明形式是:
    <类型><成员函数名><([参数表])>const;
    const是函数类型的一个组成部分,因此在函数的实现部分也要带关键字const。
    关于常成员函数的说明:
    (1)常成员函数不能调用该类中的普通成员函数,因而也不能更新对象的数据成员;
    (2)如果将一个对象设为常对象,则该对象只能调用它的常成员函数,而不能调用普通的成员函数,这是C++在安全机制上的考虑。
    17.常类型的函数参数传递
    将形参设置为const引用形参或const地址(指针)形参,这样就可以保障安全快捷的传递对象了。将函数形参设为const型引用和指针的一般形式是:
    const<类型说明符>&<引用名>
    const<类型说明符>
    <指针变量名>
    18.静态数据成员
    C++中同一个类定义多个对象时,每个对象都拥有各自的成员,而静态数据成员是类的所有对象中共享的成员,它不因对象的建立而产生,也不因对象的消失而删除,它是类定义的一部分,属于整个类,即属于所有对象。
    由于静态数据成员不专属于任何一个具体对象,但任何一个对象在声明前都需要它提前拥有一个值,因此C++规定:必须对类的静态数据成员初始化,并且它的初始化不能在构造函数中进行。
    静态数据成员初始化的方法一般采用如下形式:
    <类型><类名>::<静态数据成员>=<值>;
    关于静态数据成员初始化的进一步说明:
    (1) 初始化在类体外进行,其前面不加static;
    (2) 初始化时不加该成员的访问权限控制符private、public或protected;
    (3) 即使静态数据成员是私有的,也可以在类外有文件作用域的地方直接初始化,一般在类的定义之后马上初始化。
    在引用公有的静态数据成员时采用下面的形式:<类名>::<静态数据成员>
    19.静态成员函数
    静态成员函数的定义和其他成员函数相同。但它的特点与静态数据成员类似,不专属于任何一个对象,为整个类所共享。静态成员函数的定义方法是在一般成员函数的定义前面加上static关键字。
    关于静态成员函数的说明如下:
    (1) 调用静态成员函数的格式一般采用如下形式:
    <类名>::<静态成员函数名>(<参数表>);
    (2) 静态成员函数只能访问静态数据成员、其他静态成员函数和类以外的函数与数据,不能访问类中的非静态数据成员,因为非静态数据成员只有对象存在时才有意义。
    (3) 静态成员函数不能声明为虚函数。
    20.友元
    友元是一种定义在类外部的普通函数或类,但它需要在类体内声明为“朋友”。友元的作用在于提高程序的运行效率,但是从某种程度上讲,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员,因此在程序设计时应该严格限制使用。
    友元可以是一个函数,称之为友元函数,它也可以是一个类,该类被称为友元类。下面分别介绍这两种友元。
    (1) 友元函数
    为了与该类的成员函数加以区别,在类内说明友元函数时需要在前面加上关键字friend。需要注意的是友元函数不是成员函数,但是它可以访问类中的私有成员。
    定义友元函数的方式是在类定义中用关键字friend说明该函数,其格式如下:
    friend<类型><友元函数名>([<参数表>]);
    说明:友元函数说明的位置可以在类中的任何位置,意义完全一样。友元函数定义则必须在类的外部,一般与类的成员函数定义在一起。声明类的友元函数的目的就是为普通函数提供直接方便的访问该类的所有成员的权限。
    (2) 友元类
    友元也可以是一个类,即将一个类作为另一个类的友元。当一个类作为另一个类的友元时,意味着这个类的所有成员函数都是另一个类的友元函数。
    c. 实验六
    通过建立类及对象,用类的成员函数和对象访问类的成员;
    利用建立类的构造函数,完成类的成员的初始化工作;
    三、 程序算法分析及实现(代码)(或问题解答)
    a. 实验四
    【实例1】 指针变量的定义和使用。
#include <iostream>
using namespace std;
int main()
{int i=10;int *ip;ip=&i;cout<<"the address of i is"<<ip<<endl;cout<<"the value of i is" <<*ip<<endl;return 0;
}

【实例2】 指针的运算。

#include <iostream>
using namespace std;
int main()
{int a=10,b=20;int *pa,*pb;pa=&a;pb=&b;cout<<"the value in the addres pa"<<*pa<<endl;cout<<"the value in the addres pa+1"<<*(pa+1)<<endl;if(pa!=pb)cout<<"addres pa != addres pb"<<endl;return 0;
}

【实例3】 指向常量的指针变量的使用。

#include <iostream>
using namespace std;
int main()
{const double *ip;double i1=123.456;double i2=234.567;ip=&i1;//*ip=1.25; //错误,该地址的值不能改变ip=&i2;     //正确,对指针重新赋值cout<<*ip<<endl;return 0;
}

【实例4】 用指针法访问一维数组和二维数组。

#include <iostream>
using namespace std;
int main()
{   int i,j,*p,a[5];int (*q)[3],b[3][3]={{1,2,3},{4,5,6},{7,8,9}};char str[]="I love China!";char *r=str;p=a;q=b;cout<<"input five numbers";for(i=0;i<5;i++)cin>>*(p+i);cout<<"One-dimensional array: ";for(i=0;i<5;i++)cout<<*(p+i)<<" ";cout<<endl;cout<<endl;cout<<"Two-dimensional array: "<<endl;for(i=0;i<3;i++){   for(j=0;j<3;j++)cout<<*(*(q+i)+j)<<" ";cout<<endl;}cout<<endl;cout<<"strings: ";while(*r!='\0'){   cout<<*r;r=r+1;}cout<<endl;return 0;
}

【实例5】 用指针作函数的参数,完成三个整数值的循环交换。

#include <iostream>
using namespace std;
void circlechange(int *x,int *y,int *z);
int main()
{   int a,b,c;cout<<"Please input three integer numbers:"<<endl;cin>>a>>b>>c;cout<<"before calling:"<<"a="<<a<<",b="<<b<<",c="<<c<<endl;circlechange(&a,&b,&c);cout<<"after calling:"<<"a="<<a<<",b="<<b<<",c="<<c<<endl;return 0;
}
void circlechange(int *x,int *y,int *z)
{   int temp;temp=*x;*x=*y;*y=*z;*z=temp;
}

【实例6】 引用的使用。

#include <iostream>
using namespace std;
int main()
{   int a=20,b=40;int &ra=a;              //定义引用ra为a的别名int *p=&b;              //定义指针p指向bint *&rp=p;             //定义引用rp为p的别名cout<<"a="<<ra<<endl;   //ra与a等价cout<<"b="<<*rp<<endl;  //rp与p等价return 0;
}

【实例7】 引用与指针的比较。

//用引用作形参
#include <iostream>
using namespace std;
void swap(int &p1, int &p2)   //引用作形参
{   int p;p=p1;p1=p2;p2=p;
}
int main()
{   int a,b;cout<<"Input two integers:"<<endl;cin>>a>>b;      swap(a,b);          //直接以变量作实参cout<<a<<' '<<b<<endl;return 0;
}
//用指针作形参
#include <iostream>
using namespace std;
void swap(int *p1, int *p2) //指针作形参
{   int p;p=*p1;                  //必须用“*指针变量名”的形式操作目标数据*p1=*p2;*p2=p;
}
int main()
{   int a,b;cout<<"Input two integers:"<<endl;cin>>a>>b;swap(&a,&b);            //必须以变量的地址作实参cout<<a<<' '<<b<<endl;return 0;
}

【实例8】 调试下列程序,找出其中的错误,记录并分析出错信息,然后改正并记录运行结果。

#include <iostream>
using namespace std;
int main()
{struct student
{int num;char name[20];int age;}student1;student1={1001,"Li Nan",15};cout<<student1.num<<endl;return 0;
}
#include <iostream>
using namespace std;
int main()
{union Data{   int i;char ch;float f;};Data a={.i=1002};a={.ch='A'};a={.f=2.0};cout<<a.f<<endl;return 0;
}

【实例9】调试并运行以下程序,领会程序设计的基本思路和关键知识点。
程序实现的基本功能如下:
(1)定义结构体类型Student,记录每个学生的数据,包括学号、姓名、3门课的成绩、平均成绩和总成绩。
(2)在主函数中定义结构体数组stu[M],M定义为常量。使用菜单的形式调用函数实现对学生成绩的管理。
(3)调用函数实现从键盘输入n个学生的信息,包括学号、姓名、3门课的成绩。函数原型为:
void input(Student a[],int n);
(4)调用函数实现学生平均成绩和总成绩的运算,函数原型为:
void count(Student a[],int n);
(5) 调用函数实现学生成绩信息的输出,函数原型为:

void output(const Student a[],int n);
#include <iostream>
using namespace std;const int M = 100;struct Student
{int num;char name[20];int first_goal;int second_goal;int third_goal;float average_goal;int count_goal;}stu[M];void input(Student a[],int n);
void count(Student a[],int n);
void output(const Student a[],int n);
int main()
{int n;cout << "input the number " << endl;cin >> n;if(n>0){for (int i = 0; i < n;i++)input(stu,i);count(stu, n);for (int i = 0; i < n;i++)output(stu,i);}return 0;
}
void input(Student a[],int n)
{cout << "input the number " << endl;cin >> a[n].num;cout << "input the name " << endl;cin >> a[n].name;cout << "input the first goal " << endl;cin >> a[n].first_goal;cout << "input the second goal " << endl;cin >> a[n].second_goal;cout << "input the third goal " << endl;cin >> a[n].third_goal;a[n].count_goal = a[n].first_goal + a[n].second_goal + a[n].third_goal;a[n].average_goal = (a[n].count_goal)*1.0 / 3;
}
void count(Student a[],int n)
{float all_average_goal;int all_count_goal=0;for (int i = 0; i < n;i++)all_count_goal += a[i].count_goal;all_average_goal = 1.0 * (all_count_goal) / n;cout << "All students score in total is " << all_count_goal << endl;cout << "All students average score in total is " << all_average_goal << endl;
}
void output(const Student a[],int n)
{cout << "the" << n << "student\n" << endl;cout <<"the number:"<< a[n].num << endl;cout <<"name: "<< a[n].name <<endl;cout <<"first goal: "<< a[n].first_goal << endl;cout <<"second goal: "<< a[n].second_goal <<endl;cout <<"third goal: "<< a[n].third_goal <<endl;cout <<"average goal: "<< a[n].average_goal << endl;cout <<"count goal: "<< a[n].count_goal << endl;
}

【实例10】 完善上述程序,写出实现以下功能的代码并上机调试。
(1)采用冒泡法排序,将学生总成绩按照从大到小的顺序排列。
编程提示:函数的原型为void sort(Student a[],int n),在主函数中将结构体数组及学生人数传递给函数形参s和n,在函数中使用冒泡法排序对总成绩进行排序,注意比较时使用总成绩s[j].sum,交换时使用结构体变量对记录进行整体操作,体会与实现数组排序的区别。函数sort的参考代码为:
void sort(Student s[],int n)
{
int i,j;
Student temp;
for(i=1;i<=n-1;i++)
for(j=0;j<=n-i-1;j++)
if(s[j].sum<s[j+1].sum)
{ temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
cout<<“按总成绩排序完毕!”<<endl;
}
代码实现:
 将函数声明void sort(Student a[],int n);加入到Lab4.h文件中;
 将函数的定义加入到Lab4.cpp文件中;
 在主程序main.cpp中加入调用该函数的代码。
(2)对排序后的数组采用折半查找法,按学号查找到对应的记录,找到后返回找到记录的指针,否则返回0。
编程提示:
用函数来实现,假定函数名为findNum,返回值类型为结构体指针类型(Student *),即被查找的元素的地址。函数参数有3个,分别为结构体指针、数组长度和要查找的学号,函数原型定义为:
Student * findNum(Student s[],int n,int x);
其中,参数x为要查找的学号。此题的查找过程是从已排序的数组s中,采用折半查找,若找到s[i].num的值与x的值相等,就返回当前记录的地址,否则返回NULL。函数findNum的参考代码为:
Student *findNum(Student s[],int n,int x)
{
//按照学号进行由小到大的排序
int low=0,high=n-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(s[mid].numx)
return &s[mid];
else if(s[mid].num<x)
low=mid+1;
else
high=mid-1;
}
return NULL;
}
在主程序中,实现对函数的调用,调用时完成如下功能:输入待查学号,调用函数实现查找,查找结束后,提示是否查找其他学号,回答“Y”,继续输入学号进行查找,回答“N”,返回到主菜单。
根据返回值判断,若为NULL则输出没找到,若找到则输出找到的记录。参考代码如下:
long x;
Student *p;
char ch=‘Y’;
//注意:以上三条语句不可以添加在case 5:中,要添在main函数的开头部分
while(ch
’Y’||ch==‘y’)
{
cout<<“请输入一个待查学生的学号:”;
cin>>x;
p=findNum(stu,n,x);
if(p!=NULL)
{
cout<num<<’,’<name<<’,’;
for(int j=0;j<3;j++)
cout<score[j]<<’,’;
cout<sum<<","<ave<<endl;
}
else
cout<<“没有找到学号为”<<x<<“的记录”<<endl;
cout<<“是否继续查找(Y/N)?”;
cin>>ch;
}
代码实现:
 将函数声明Student *findNum(Student s[],int n,int x);加入到Lab4.h文件中;
 将函数的定义加入到Lab4.cpp文件中;
 在主程序main.cpp中加入调用该函数的代码。
Work.cpp:

#include <iostream>
#include "lab4.h"
using namespace std;void input(Student a[],int n);
void count(Student a[],int n);
void output(const Student a[],int n);
int main()
{int n;cout << "input the number " << endl;cin >> n;if(n>0){for (int i = 0; i < n;i++)input(stu,i);cout << "start sort in goal" << endl;count(stu, n);sort(stu, n);for (int i = 0; i < n;i++)output(stu,i);}return 0;
}
void input(Student a[],int n)
{cout << "input the number " << endl;cin >> a[n].num;cout << "input the name " << endl;cin >> a[n].name;cout << "input the first goal " << endl;cin >> a[n].first_goal;cout << "input the second goal " << endl;cin >> a[n].second_goal;cout << "input the third goal " << endl;cin >> a[n].third_goal;a[n].count_goal = a[n].first_goal + a[n].second_goal + a[n].third_goal;a[n].average_goal = (a[n].count_goal)*1.0 / 3;
}
void count(Student a[],int n)
{float all_average_goal;int all_count_goal=0;for (int i = 0; i < n;i++)all_count_goal += a[i].count_goal;all_average_goal = 1.0 * (all_count_goal) / n;cout << "All students score in total is " << all_count_goal << endl;cout << "All students average score in total is " << all_average_goal << endl;
}
void output(const Student a[],int n)
{cout << "the" << n+1 << "student\n" << endl;cout <<"the number:"<< a[n].num << endl;cout <<"name: "<< a[n].name <<endl;cout <<"first goal: "<< a[n].first_goal << endl;cout <<"second goal: "<< a[n].second_goal <<endl;cout <<"third goal: "<< a[n].third_goal <<endl;cout <<"average goal: "<< a[n].average_goal << endl;cout <<"count goal: "<< a[n].count_goal << endl;
}

Lab4.h

#ifndef _LAB4_H
#define _LAB4_Hconst int M = 100;
struct Student
{int num;char name[20];int first_goal;int second_goal;int third_goal;float average_goal;int count_goal;
}stu[M];void sort(Student s[], int n);
#include "lab4.cpp"
#endif
Lab4.cpp
#include<iostream>
#include "lab4.h"using namespace std;void sort(Student s[],int n)
{int i,j;Student temp;for(i=1;i<=n-1;i++)for(j=0;j<=n-i-1;j++)if(s[j].count_goal<s[j+1].count_goal){   temp=s[j];s[j]=s[j+1];s[j+1]=temp;}cout<<"over! "<<endl;
}

2
Work.cpp

#include <iostream>
using namespace std;
#include "lab4.h"void input(Student a[],int n);
void count(Student a[],int n);
void output(const Student a[],int n);
int main()
{int n;cout << "input the number " << endl;cin >> n;if(n>0){for (int i = 0; i < n;i++)input(stu,i);cout << "start sort in num" << endl;count(stu, n);sort(stu, n);for (int i = 0; i < n;i++)output(stu,i);char Condition;do{cout << "Do you want to find stduent by use number?(Y/N)" << endl;cin >> Condition;if(Condition=='Y' || Condition == 'y'){int x;Student *found_x;cin >> x;found_x = findNum(stu, n, x);if(found_x!=NULL){cout << "the " << x << " student\n" << endl;cout << "the number:" << found_x->num << endl;cout << "name: " << found_x->name << endl;cout << "first goal: " << found_x->first_goal << endl;cout << "second goal: " << found_x->second_goal << endl;cout << "third goal: " << found_x->third_goal << endl;cout << "average goal: " << found_x->average_goal << endl;cout << "count goal: " << found_x->count_goal << "\n" << endl;}elsecout << "404 not found" << endl;}elsebreak;} while (Condition == 'Y' || Condition == 'y');}return 0;
}
void input(Student a[],int n)
{cout << "input the number " << endl;cin >> a[n].num;cout << "input the name " << endl;cin >> a[n].name;cout << "input the first goal " << endl;cin >> a[n].first_goal;cout << "input the second goal " << endl;cin >> a[n].second_goal;cout << "input the third goal " << endl;cin >> a[n].third_goal;a[n].count_goal = a[n].first_goal + a[n].second_goal + a[n].third_goal;a[n].average_goal = (a[n].count_goal)*1.0 / 3;
}
void count(Student a[],int n)
{float all_average_goal;int all_count_goal=0;for (int i = 0; i < n;i++)all_count_goal += a[i].count_goal;all_average_goal = 1.0 * (all_count_goal) / n;cout << "All students score in total is " << all_count_goal << endl;cout << "All students average score in total is " << all_average_goal << endl;
}
void output(const Student a[],int n)
{cout << "the " << n+1 << " student\n" << endl;cout <<"the number:"<< a[n].num << endl;cout <<"name: "<< a[n].name <<endl;cout <<"first goal: "<< a[n].first_goal << endl;cout <<"second goal: "<< a[n].second_goal <<endl;cout <<"third goal: "<< a[n].third_goal <<endl;cout <<"average goal: "<< a[n].average_goal << endl;cout <<"count goal: "<< a[n].count_goal << "\n" << endl;
}

b. 实验五
【实例1】定义一个关于日期的类,然后声明对象,判断该日期是否为闰年并输出。

#include <iostream>
using namespace std;
class TDate
{
public :void SetDate(int y,int m,int d);int isLeapYear();void Print();
private:int year,month,day;
};
void TDate::SetDate(int y,int m,int d)
{year = y;month = m;day = d;
}
int TDate::isLeapYear()
{return (year%4==0&&year%100!=0) || (year%400==0);
}
void TDate::Print()
{cout<<year<<"."<<month<<"."<<day<<endl;
}
int main()
{TDate date1,date2;date1.SetDate(2004,5,4);date2.SetDate(2005,4,9);int leap = date1.isLeapYear();date1.Print();if (leap == 1)cout<<"Yes!"<<endl;elsecout<<"No!"<<endl;date2.Print();return 0;
}

【实例2】编写一个程序,定义一个日期时间类,并在类中定义构造函数和析构函数。

#include <iostream>
using namespace std;
class TDateTime
{
public:TDateTime(int y,int m,int d,int h,int mi,int s);~TDateTime();void Print();
private:int year,month,day,hour,minite,second;
};
TDateTime::TDateTime(int y,int m,int d,int h,int mi,int s)
{year = y;month = m;day = d;hour = h;minite = mi;second = s;cout<<"Constructor called."<<endl;
}
TDateTime::~TDateTime()
{cout<<"Destructor called."<<endl;
}
void TDateTime::Print()
{cout<<year<<"/"<<month<<"/"<<day<<"/"<<hour<<":"<<minite<<":"<<second<<
endl;
}
int main()
{TDateTime Now(2007,10,31,9,30,35);cout<<"Now is ";Now.Print();return 0;
}

【实例3】拷贝构造函数的使用

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Person
{
public:Person(char* pN);Person(Person &p);~Person();
private:char * pName;
};
Person::Person(char *pN)
{cout<<"Constructor:   "<<pN<<endl;pName = new char[strlen(pN)+1];strcpy(pName,pN);
}
Person::Person(Person &p)
{cout<<"copy "<<p.pName<<"to new stack space\n";pName = new char[strlen(p.pName)+1+8];  //8是字符串"Copy of "的长度strcpy(pName,"Copy of ");strcat(pName,p.pName);
}
Person::~Person()
{cout<<"Destructor:  "<<pName<<endl;delete pName;
}
int main()
{Person p1("Jack");Person p2(p1);          //或者Person p2=p1;return 0;
}

【实例4】使用静态数据成员。

#include <iostream>
using namespace std;
class Static_Myclass    
{
public :static int a;                //静态数据成员a
};
int Static_Myclass::a = 5;      //初始化静态数据成员a
int main()
{Static_Myclass obj1,obj2;obj1.a = 10;                //静态数据成员的引用方法一Static_Myclass::a = 20;     //静态数据成员的引用方法二cout<<obj1.a<<endl;cout<<obj2.a<<endl;cout<<Static_Myclass::a<<endl;return 0;
}

【实例5】使用静态成员函数。

#include <iostream>
using namespace std;
class Myclass
{
private :static int b;
public :int a;static void fun(){//a=5;      //静态成员函数不能直接使用类内的一般数据成员aint a = 5;  //这是在该函数体内的局部变量b = 7;      //可直接使用类的静态数据成员bcout<<"a="<<a<<" the class static member b="<<b<<endl;}
};
int Myclass::b;     //静态数据成员的初始化
int main()
{Myclass::fun(); //不必通过对象操作静态成员函数即可使用Myclass obj;obj.a = 30;obj.fun();      //通过对象操作静态成员函数return 0;
}

【实例6】使用友元函数。

#include <iostream>
#include <math.h>
using namespace std;
class Point
{
public:Point(double i,double j){x = i;y = j;}void Getxy(){cout<<"("<<x<<","<<y<<")"<<endl;}friend double Distance(Point &a,Point &b);
private:double x,y;
};
double Distance(Point &a,Point &b)
{double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx*dx + dy * dy);
}
int main()
{Point p1(3.0,4.0),p2(6.0,8.0);p1.Getxy();p2.Getxy();double d = Distance(p1,p2);cout<<"Distance:"<<d<<endl;return 0;
} 

思考与练习
7:

#include"Lab5_1.h"
int main()
{Student student1,student2;student1.input_data(01,"lilei","man",99);student2.input_data(01,"hanmeimei","woman",99);student1.print_data();student1.print_data();return 0;
}

8:

#include"Lab5_1.h"
int main()
{Student student1,student2;student1.input_data(01,"lilei","man",99);student2.input_data(01,"hanmeimei","woman",99);student1.print_data();student1.print_data();return 0;
}

c. 实验六

 Main.cpp
#include"computer.h"int main()
{COMPUTER computer1;   
}Computer.cpp
#include"computer.h"
void CPU::cpu_run()
{cout << "frequency:" << CPU_frequency << "voltage " << CPU_voltage << "rank " <<p1 << endl;
}
void CPU:: cpu_stop()
{CPU::~CPU();
}
CPU::~CPU()
{cout<<"cpu stop working"<< endl;
}
Computer.h
#ifndef _COMPUTER_H
#define _COMPUTER_H#include<iostream>
using namespace std;class CPU
{public:void cpu_run();void cpu_stop();~CPU();private:int CPU_frequency;float CPU_voltage;enum CPU_Rank{p1 = 1,p2,p3,p4,p5,p6,p7};
};class RAM
{public:void ram_run();void ram_stop();private:int ram_capacity;
};class CDROM
{public:void cdrom_run();void cdrom_stop();private:int cdrom_capacity;
};class COMPUTER
{public:void computer_run();void computer_stop();private:CPU cpu;RAM ram;CDROM cdrom;
};
#include "computer.cpp"
#endif
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 网络相关--常用协议

    文章目录TCP的三次握手四次挥手常见面试题HTTPHTTPS TCP的三次握手四次挥手 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等…...

    2024/5/4 15:44:54
  2. Linux系统搭建本地yum

    1、搭建软件仓库mkdir /yum2、将镜像文件挂载到 /yummount -t iso9660 -o loop /dev/cdrom /yum3、配置yum删除 /etc/yum.repos.d/* rm -rf /etc/yum.repos.d/*写配置文件 /etc/yum.repos.d/localyum.repovim /etc/yum.repos.d/localyum.repo[server] name=server baseurl=fi…...

    2024/5/1 12:01:08
  3. UBOOT的命令体系分析

    命令体系基本概述:uboot启动后进入命令行模式,即可输入命令 uboot会进行命令接收,命令解析,命令执行操作 uboot的命令体系实现代码在uboot/common/cmd_xx.c中(command.c 和main.c也和命令相关) 每个命令都对应一个函数 有些命令支持传参(和main参数传参差不多),使用ar…...

    2024/5/1 12:35:45
  4. 【NLP CS224N笔记】Lecture 1 - Introduction and Word Vectors

    本次梳理基于Datawhale 第12期组队学习 -CS224n-预训练模块 详细课程内容参考(2019)斯坦福CS224n深度学习自然语言处理课程 1. 写在前面 自然语言处理( NLP )是信息时代最重要的技术之一,也是人工智能的重要组成部分。NLP的应用无处不在,因为人们几乎用语言交流一切:网络搜索…...

    2024/5/1 21:44:48
  5. Python语音识别系统(自己的语音)

    参考一篇博客:https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/106846014 自己的想法: 先配置好环境,采用conda安装 conda create -n yuyin python=3.6.5 conda install numpy pandas matplotlib scikit-learn scipy tensorflow-gpu==2.0.0 pip install -i https…...

    2024/5/5 1:00:31
  6. 关于js中隐式转换的笔记

    JS隐式转换隐式转换的含义 js中运算符两边数据类型不统一,js会对其自动转换,这种转换方式编译器会自己完成,不需要程序员手动操作。++,–,+,-,*,/,%,>,<,>=,<=,,!=,=,!==等运算符会将参数转化为number型if中的表达式或逻辑运算(如合取,析取,非,同或)…...

    2024/5/4 15:04:56
  7. 洛谷:质因数分解(P1075)

    题目描述 已知正整数nnn是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 一个正整数nnn。 输出格式 一个正整数ppp,即较大的那个质数。 输入输出样例 输入 #1 21 输出 #1 7 #include<iostream> using namespace std; bool isprime(int x){ //判断是…...

    2024/4/14 20:49:54
  8. 复习java反射

    粗略的使用 import com.po.User;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class ReflectionStudyTest {public static void main(String[] args) throws Exception {/*1.源代码阶段使用Class类的静态方…...

    2024/4/20 0:47:51
  9. 阿里云七天实践训练营之ACA学习笔记[day2]

    阿里云七天实践训练营之ACA学习笔记[day2] 1.阿里云简介2.阿里云基础应用架构介绍前台逻辑:SLB——负载均衡,流量入口ECS——运行应用,高可用,机构化数据类型:云RDS数据库非结构化:oss对象存储[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh…...

    2024/4/30 2:24:16
  10. 正误问题(栈stack)

    Descriptionuncle-lu迷上了逻辑值运算。但uncle-lu算的头都晕了,也没算出个所以然。他只好找到你,让你帮他解决这个问题。Input一个字符串(串长小于255)表达逻辑式子,内只包含true,false,or,and,not和空格,(不包含括号和xor),优先级同pascal.(not->and->or),同级左…...

    2024/4/25 0:04:21
  11. 体渲染论文阅读训练 继续回到论文源码 二 随机数

    全部论文训练计划章节 见 论文训练计划通过:const Vec2f UV = Vec2f(X, Y) + RNG.Get2();得到一个像素内的随机点。HOD Vec2f Get2(void){return Vec2f(Get1(), Get1());}该函数调用两次Get1():HOD float Get1(void){*m_pSeed0 = 36969 * ((*m_pSeed0) & 65535) + ((*m_p…...

    2024/4/25 0:04:19
  12. git http方式鉴权

    git的鉴权方式分为 ssh 和 https,ssh 需要使用 ssh 秘钥,这样就可以在不输入用户名和密码的情况下安全地传输数据;而http协议来说是不可能的 —— 每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作…...

    2024/4/28 2:01:21
  13. 从简单实例开始,学会写Makefile(二)

    五、.d文件,解决文件间的相互引用1、自动生成依赖关系在前文的项目基础上,考虑一下这种情况:如果我们在w1.h文件里包含了头文件w2.h以及w3.h并且用到其中定义的函数。第一次编译没有遇到问题,但是如果后续的开发过程中修改了w2.h或者w3.h文件中的内容,再执行gmake命令的时…...

    2024/4/25 0:04:20
  14. 完善复数类

    #ifndef _COMPLEX_H_ #define _COMPLEX_H_class Complex {double a;double b; public:Complex(double a = 1, double b = 2);//函数声明时指定默认值,定义则不需要double getA();double getB();double getModuls();Complex operator + (const Complex& c);Complex operato…...

    2024/4/30 12:25:39
  15. MAVEN本地环境搭建

    1.下载maven3.5.0并解压安装 安装成功后文件目录如下:2.配置MAVEN环境变量 【1】选择此电脑->鼠标右键->属性->高级环境设置->环境变量-系统变量框下新增变量名MAVEN_HOME,值为D:\TOOLS\apache-maven-3.5.0 【2】编辑变量Path的值,在变量值最前面加上“%MAVEN_H…...

    2024/4/24 8:57:53
  16. 中国央行数字货币的设计机制及潜在影响研究——基于央行数字货币专利申请的分析

    随着央行确认数字货币采取与纸币并行共存、中心化系统、双层投放体系架构,已有文献尚未能根据上述特征深入分析数字货币的设计演变、具体使用场景和潜在影响。鉴于此,朱太辉、张皓星两位学者系统梳理了中国人民银行数字货币研究所(以下简称数字货币研究所)在国家知识产权局…...

    2024/4/29 15:32:59
  17. 在抖音找罗永浩干掉辣条

    撰稿|吴俊宇 代餐与辣条,原本是两个世界的产物,然而它们却成为了“对标”的产品。 我们所处的商业世界,不断发生的跨界正在改变人们的思维模式,重构现有商业秩序。互联网的传播和打发让不同领域的产品不断跨界、博弈。 在美团点评研究院出炉的《闪购时代,快意生活》中讲述…...

    2024/4/29 15:56:33
  18. 数字化时代10:从我国经济建设目标看社会产品形态的变化

    摘要:从我国经济建设目标看产品的形态变化,从物质到精神,从实体到虚拟,物体到人自身,看到财富形态变化的端倪。未来,随着物质产品的极大丰富,物质产品的新的价值,不在物质本身,即不是在物质产品原先的、固有的使用价值,而是在于他作为某种精神产品的物质承载者,没有…...

    2024/5/4 0:16:24
  19. Android开发前景怎么样?

    Java 基础;搭建Android 开发环境;了解Android 运行原理以及一个工程项目结构;如何系统学习Android;推荐一些实用的资源总结-------------------------------------------------------------------------------------------------首先呢?当然要有Java 基础;  我大学的专业就是…...

    2024/5/4 1:50:33
  20. 系统架构师考试知识点mp3资料免费下载

    场景 系统架构设计师考试,属于全国计算机技术与软件专业技术资格考试(简称计算机软件资格考试)中的一个高级考试。 系统架构设计师考试,考试不设学历与资历条件,不论年龄和专业,考生可根据自己的技术水平,选择合适的级别合适的资格,但一次考试只能报考一种资格。 实现 …...

    2024/4/25 0:04:11

最新文章

  1. 基于MQTT通信开发的失物招领小程序

    项目架构设计 这个项目采用前后端分离的方式&#xff0c;重新设计了两条链路来支撑程序的信息获取和传递 前端的小程序页面再启动页面渲染时&#xff0c;直接通过DBAPI从后端数据库获取信息&#xff0c;直接渲染在小程序中项目中给DBAPI的定位是快速从后端获取信息&#xff0…...

    2024/5/5 6:30:54
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 图像处理相关知识 —— 椒盐噪声

    椒盐噪声是一种常见的图像噪声类型&#xff0c;它会在图像中随机地添加黑色&#xff08;椒&#xff09;和白色&#xff08;盐&#xff09;的像素点&#xff0c;使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题&#xff0c;例如损坏的像素或传输过程中的干扰。 椒…...

    2024/5/3 19:03:59
  4. Django实现的登录注册功能

    1 前言 在Web开发中&#xff0c;用户登录和注册是最基本且必不可少的功能。Django&#xff0c;作为一个高级的Python Web框架&#xff0c;为我们提供了强大的工具和库来快速实现这些功能。下面&#xff0c;我将详细介绍如何使用Django来实现用户登录和注册功能。 2 功能介绍 …...

    2024/5/1 13:23:09
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57