首页 > 编程语言 >习题整理《C++17从入门到精通》第五章-复合类型:数组、指针和引用

习题整理《C++17从入门到精通》第五章-复合类型:数组、指针和引用

时间:2024-06-05 18:31:20浏览次数:22  
标签:p2 p3 const 指向 17 int C++ 习题 指针

                                                        //复习用,如有错误,请指正

1.下面程序的输出是什么?

#include < iostream >

using namespace std;

int main(){

    int x = 10;

    int& ref = x;

    ref = 20;

    cout <<"x = "<< x << endl ;

    x = 30;

    cout <<"ref = " << ref << endl;

    return 0;

}

2.关于下列程序,正确的是:

A.运行时错误 B.编译时错误 C.没问题 D.0

# include < iostream >

using namespace std;

int &fun( ){

    int x = 10;

    return x;

}

int main(){

    fun() = 30;

    cout << fun();

    return 0;

}

答:A

在 fun 函数中,将局部变量 x 的引用返回给了 main 函数。然而,一旦 fun 函数执行完毕,x 变量就会被销毁,这意味着在 main 函数中对其赋值是不安全的。因此,会导致运行时错误。

3.下面哪个定义是非法的?为什么?

(1) int ival=1.01; (2) int &rvall = 1.01;

(3) int &rval2 = ival; (4) int &rval3;

答:

(1) int ival=1.01; 是合法的,虽然浮点数被赋给了整型变量,但会进行隐式类型转换。

(2) int &rvall = 1.01;是非法的,引用必须绑定到一个具体的对象上。在这种情况下,引用 rvall 尝试绑定到字面常量 1.01 上,这是不允许的。只有左值才可以作为引用的初始器,而字面常量是右值,不能直接绑定到引用上。

(3) int &rval2 = ival; 是合法的,引用 rval2 绑定到了 ival 的地址。

(4) int &rval3; 是非法的,引用必须在定义时初始化,否则会导致编译错误。

4.下列代码的输出是什么?

int i,&ri = i;

i= 5;ri = 10;

std::cout < i<< " "<< ri < std::endl;

答:10 10

5.请叙述下面这段代码的作用。

int i = 42;

int *pl = &i;

*pl = *pl * *pl;

答:

int i = 42;:定义一个整型变量 i,并将其初始化为 42。

int *pl = &i;:定义一个整型指针 pl,并将其初始化为指向变量 i 的地址。

*pl = *pl * *pl;:对指针 pl 所指向的变量进行操作。首先,通过 *pl 取得指针所指向的变量 i 的值,然后将此值与自身相乘,最后将结果赋给 i。

因此,这段代码的作用是让变量 i 的值变为原来的值的平方,即 42 的平方,结果为 1764。

6.解释下列语句的含义,并说明错的语句的原因。

int i=0;

A.double* dp= &i;

B.int *ip=i;

C.int *p= &i;

答:

A.double* dp= &i; //i是int型的变量,而dp是指向double型变量的指针

B.int *ip=i;//ip应赋值为i的地址,即&i而不是i的值

C.int *p= &i;//正确,p是指向i的指针

7.下面这段代码中为什么 p 合法而 lp 非法?

int i = 42; 
void *p = &i; 
long *lp = &i;

答:

void *p = &i;:void* 是一种通用的指针类型,可以指向任意类型的对象。所以将 &i(int 类型的地址)赋给 void* 类型的指针 p 是合法的。

long *lp = &i;:虽然 &i 是一个有效的地址,但是将 &i 赋给 long* 类型的指针 lp 是非法的。long* 是一个指向 long 类型对象的指针类型,而 &i 是一个指向 int 类型对象的地址。类型不匹配,无法隐式转换。

8.说明下述变量的类型和值

(1)int* ip,*&r=ip;

(2) int i,*ip= 0;

(3) int* ip,ip2;

答:

(1)int* ip,*&r=ip;//ip是指向int型变量的指针,&r=ip 表示r是一个引用,指向ip所指向的整型数据。r的类型为int,其值为ip所指向的地址。

(2) int i,*ip= 0;//i是int型的变量,ip是指向int型变量的指针,初始值为0(空指针)

(3) int* ip,ip2;//ip是指向int型变量的指针,ip2是int型的变量

9.下列哪些数组定义有错误? 为什么?

unsigned buf_size = 1024;

(1) int ia[buf size];

(2) int ib[4 * 7-24];

(3) int ic[4 * 7-28];

(4) char st[11] = “hello world";

答:

(1) int ia[buf size]; 这个数组定义是错误的,因为在定义数组时不能使用变量作为数组的大小。应该使用常量来定义数组的大小。

(4) char st[11] = "hello world"; 这个数组定义也是错误的,因为字符串"hello world"有12个字符,但是数组的大小只定义为11,不足以容纳整个字符串。应该将数组大小设置为12,以容纳完整的字符串。

10.找出下列程序中的错误。

int v[] = { 1,2,3,4};

v0= 10.5;

int i = v[3] + 10;

v[2] = v[0] - i;

i = v[4];

答:

v0= 10.5;:这里应该是对数组 v 的第一个元素进行赋值。正确的写法应该是 v[0] = 10.5;。

i = v[4];:数组 v 中只有四个元素(下标从 0 到 3),所以访问 v[4] 越界了。

11.下面哪句是不合法的?原因是什么?

(1) const int buf;

(2) int cnt = 0;

(3) const int sz = cnt;

(4) ++cnt; ++sz;

答:

  (1)   不合法,const对象一旦创建后不能改变,所以const对象必须初始化

(4)不合法,sz是const对象,不能自增。

12.下面哪句是不合法的? 原因是什么?

(1)int i=-1,&r= 0;

(2) const int i2=i,&r2 = i;

(3) const int i3=-i, &r3 = 0;

(4) const int *p1 = &i2;

(5)int * const p2 = &i2;

(6) const int * const p3 = &i2;

(7) const int & const r4;

答:

(1)int i = -1, &r = 0;      // 不合法, r为引用,初始化只能指向一个对象。
(2)int *const p2 = &i2;     // 合法,定义一个int型的常量指针,初始化为i2的地址,之后指针的值不能再改变
(3)const int i = -1, &r = 0;        // 合法, r为引用,const int &r = 0; 是合法的。
(4)const int* const p3 = &i2;       // 合法,p3的值不能改变,*p3也不能改变
(5)const int* p1 = &i2;     // 合法,指针常量,p1指向的值不能被改变
(6)const int& const r2;     // 不合法,引用不能是const
(7)const int i2 = i, &r = i;        // 合法

13.下面代码中哪些语句是错误的? 为什么?

int a[5] ={};

int b[6] ={};

int* x = a;

int* const y = a;

b = x;

x = b;

y = b;

答:

b = x; 这一行是错误的,因为数组名不能被赋值,数组名代表的是数组首元素的地址,它是一个常量指针。

y = b; 这一行也是错误的,因为 y 被声明为一个指向整型常量的指针,因此不能再改变指向其他地址。

14.下面代码中的变量 p1、ci、p2、p3、r 能否被修改?

int i{0};

int *const p1 = &i;

const int ci = 42;

const int *p2 = &ci;

const int *const p3 = p2;

const int &r = ci;

答:

p1 是一个常量指针,指向 i,p1 本身是一个常量,不能被修改,但是可以通过 p1 来修改 i 的值。

ci 是一个常量整数,不能被修改。

p2 是一个指向常量整数的指针,指向 ci,p2 可以通过改变指向的对象来修改 ci 的值,但是 p2 本身是一个常量指针,不能被修改。

p3 是一个指向常量整数的常量指针,指向 p2,p3 本身是一个常量,不能被修改,但是可以通过 p3 来修改 ci 的值。

r 是一个整数的常量引用,不能被修改。

15.在第 14 题的基础上,下面定义的变量有没有错误? 为什么?

int *p = p3;

p2 = p3;

p2 = &i;

int &rl = ci;

const int &r2 = i;

答:

int *p = p3;:这行代码是错误的。p3 是一个指向常量整数的常量指针,不能将其赋给一个普通的指针 p。应该改为 const int *p = p3;。

p2 = p3;:这行代码是合法的。p2 是一个指向常量整数的指针,可以通过改变指向的对象来修改 ci 的值,而 p3 也是一个指向常量整数的指针,因此可以将 p3 的值赋给 p2。

p2 = &i;:这行代码是错误的。p2 是一个指向常量整数的指针,不能将 &i(非常量整数的地址)赋给它。应该改为 const int *p2 = &i;。

int &rl = ci;:这行代码是错误的。rl 是一个整数的引用,但 ci 是一个常量整数,不能将一个非常量引用绑定到常量上。应该改为 const int &rl = ci;。

const int &r2 = i;:这行代码是合法的。r2 是一个常量引用,可以将非常量 i 绑定到常量引用上。

16.下面哪句是不合法的?原因是什么?

(1) int i,*const cp;

(2)int *p1,*const p2;

(3) const int ic,&r = ic;

(4) const int *const p3;

(5) const int *p;

答:

const int *const p3;:这句代码是不合法的。声明了一个常量指针 p3,但没有为其初始化,常量指针必须在声明时进行初始化。

17.对于第 16 题中的变量,下面哪句是不合法的?原因是什么?

(1)i= ic;

(2) p1= p3;

(3) p1= ⁣

(4) p3=⁣

(5) p2 = p1;

(6)ic=*p3;

答:

(1)i = ic;:这句代码是合法的。将常量整数 ic 的值赋给非常量整数 i 是允许的。

(2) p1 = p3;:这句代码是合法的。将指向常量整数的指针 p3 赋给指向非常量整数的指针 p1 是允许的。指针类型可以宽松地转换为其他类型的指针。

(3) p1 = ⁣:这句代码是不合法的。p1 是一个指向非常量整数的指针,不能将指向常量整数 ic 的地址赋给它。

(4) p3 = ⁣:这句代码是不合法的。p3 是一个常量指针,它的指向不可以改变。

(5) p2 = p1;:这句代码是合法的。

(6) ic = *p3;:这句代码是不合法的。ic 是一个常量整数,不能修改其值。

18.下面哪句是不合法的? 原因是什么?

int i= 0;

int *const p1 = &i;

const int ci = 42;

const int *p2 = &ci;

const int *const p3 = p2;

const int &r = ci;

int *p = p3;

p2= p3;

p2 = &i;

int &r = ci;

const int &r2 = i;

答:

int i= 0;

int *const p1 = &i; // 合法,p1 是一个指向 int 类型的常量指针,指向 i

const int ci = 42;
const int *p2 = &ci; // 合法,p2 是一个指向常量 int 类型的指针,指向 ci

const int *const p3 = p2; // 合法,p3 是一个指向常量 int 类型的常量指针,指向 p2 所指的对象 ci

const int &r = ci; // 合法,r 是一个对常量 int 的引用,引用了 ci

int *p = p3; // 不合法,p 是一个指向 int 类型的指针,而 p3 是一个指向常量 int 类型的常量指针,类型不匹配

p2= p3; // 合法,p2 是一个指向常量 int 类型的指针,可以将 p3 赋值给它

p2 = &i; // 不合法,p2 是一个指向常量 int 类型的指针,不可以指向 i

int &r = ci; // 不合法,r 是一个对int 的引用,不能引用常量对象 ci

const int &r2 = i; // 合法,r2 是一个对常量 int 的引用,可以引用非常量对象 i

19.说明下列哪些变量是 const 对象,哪些是指向或引用 const 对象的指针或引用.

const int v2 = 0;  

int v1= v2;

int *p1 = &v1,&r1 = v1;

const int *p2 = &v2,*const p3 = &v2,&r2 = v2;

答:

const对象:v2;

指向或引用 const 对象的指针或引用:p2,p3,r2;

20.对于第 19 题中的变量,下列哪些语句是合法的?哪些是非法的?为什么?

r1 = v2;

p1 = p2;

p2 = p1;

p1 = p3;

p2 = p3;

答:

合法的语句:

- r1 = v2; // 因为 r1 是指向非 const 对象 v1 的引用,可以修改其值。

非法的语句:

- p2 = p1; // p2 是指向 const 对象的指针,不能指向非 const 对象的地址。

- p1 = p3; // p1 是指向非 const 对象的指针,不能指向指向 const 对象的地址。

- p1 = p3; // 因为 p1 是指向非 const 对象的指针,不可以指向const对象v2。

- p2 = p3; // p2 是指向 const 对象的指针,不能指向指向 const 对象的地址。

21.编写程序从键盘输入 10 个整数到一个数组中,并将数组中的元素逆序放入另外一个数组中,最后输出这两个数组中的所有整数。

答:

#include <iostream>

using namespace std;



int main() {

    const int size = 10;

    int arr1[size];

    int arr2[size];



    // 从键盘输入10个整数到arr1数组中

    cout << "请输入10个整数:" << endl;

    for (int i = 0; i < size; i++) {

        cin >> arr1[i];

    }



    // 将arr1数组中的元素逆序放入arr2数组中

    for (int i = 0; i < size; i++) {

        arr2[i] = arr1[size - 1 - i];

    }



    // 输出arr1数组中的所有整数

    cout << "arr1数组中的整数为:" << endl;

    for (int i = 0; i < size; i++) {

        cout << arr1[i] << " ";

    }

    cout << endl;



    // 输出arr2数组中的所有整数

    cout << "arr2数组中的整数为:" << endl;

    for (int i = 0; i < size; i++) {

        cout << arr2[i] << " ";

    }

    cout << endl;



    return 0;

}

22.从键盘输入 10 个整数到一个数组中,然后历数组求出这些整数中的最大值、最小值并输出。

答:

#include <iostream>

using namespace std;



int main() {

    const int size = 10;

    int arr[size];



    // 从键盘输入10个整数到arr数组中

    cout << "请输入10个整数:" << endl;

    for (int i = 0; i < size; i++) {

        cin >> arr[i];

    }



    // 求出这些整数中的最大值和最小值

    int maxNum = arr[0];

    int minNum = arr[0];

    for (int i = 1; i < size; i++) {

        if (arr[i] > maxNum) {

            maxNum = arr[i];

        }

        if (arr[i] < minNum) {

            minNum = arr[i];

        }

    }



    // 输出最大值和最小值

    cout << "最大值为:" << maxNum << endl;

    cout << "最小值为:" << minNum << endl;



    return 0;

}

23.编写程序,输出一个乘法口诀表。

答:

#include <iostream>

using namespace std;



int main() {

    // 输出乘法口诀表

    for (int i = 1; i <= 9; i++) {

        for (int j = 1; j <= i; j++) {

            cout << j << " * " << i << " = " << i * j << "\t";

        }

        cout << endl;

    }



    return 0;

}

24.将下列程序改成用 auto 和 rang for。

#include<iostream>

int main(){

//声明一个 10 x10 的数组

const int numRows = 10;

const int numCols = 10;

int product[numRows][numCols] = {0} ;

//计算乘法表

for (int row = 0; row < numRows; ++row)

for (int col = 0; col < numCols; ++col)

product[row][col] = row * col;

//打印表

for (int row = 1; row < numRows; ++row){

for (int col = 1; col < numCols; ++col)

std::cout<<product[row][col] <"\t";

std::cout<<’\n';

}

return 0;

}

答:

#include <iostream>

int main() {

    // 声明一个 10 x 10 的数组

    const int numRows = 10;

    const int numCols = 10;

    int product[numRows][numCols] = {0};



    // 计算乘法表

    for (auto row=0;row<numRows;++row) {

        for (auto col=0;col<numCols;++col) {

            product[row][col]=row*col;

        }

    }



    // 打印表

    for (auto& row : product) {

        for (auto& col : row) {

            if(col!=0) std::cout << col << '\t';

        }

        std::cout << '\n';

    }

    return 0;

}

25.下面程序的输出是什么?

# include < iostream >

int main(){

int i= 1;

int const& a = i>0?i:0;

i = 2;

std:: cout << i << a;

}

答:2 1

26.关于下面代码,正确的输出是(  )。

A.3

B.0x822222232

C.语法错误

D.不确定

# include < iostream >

int main(int argc,char ** argv){

//假设 x的地址是 0x822222232

int x = 3;

int*& rpx = &x;

std:: cout << rpx << std::endl;

}

答:B

27.解释下列程序

const char *cp = ca;

while( *cp){

cout << * cp << endl;

++cp;

}

答:

首先将字符数组 ca 的首地址赋值给指针 cp。

然后,进入一个循环,条件是 *cp,也就是指针 cp 指向的字符不为 '\0'(空字符)。

在循环体内,首先通过 cout << *cp << endl; 打印指针 cp 指向的字符,然后通过 ++cp; 将指针 cp 向后移动一个位置,指向下一个字符。

这样循环会一直进行,直到遇到空字符 '\0',即字符数组的结尾。循环结束后,所有的字符都被逐个输出到屏幕上。

28.从网上搜索表 5-1 中的 C 风格字符串处理函数的作用,并编写程序学习这些函数的使用。

答:

strlen:用于计算字符串的长度。

strcpy:用于将一个字符串复制到另一个字符串。

strcat:用于将一个字符串连接到另一个字符串的末尾。

strcmp:用于比较两个字符串。

strchr:用于在字符串中查找特定字符的第一次出现。

strstr:用于在字符串中查找子字符串的第一次出现。

#include <stdio.h>

#include <string.h>



int main() {

    char str1[] = "Hello";

    char str2[] = "World";

    char str3[20];

    

    // 计算字符串的长度

    printf("Length of str1: %lu\n", strlen(str1));



    // 复制字符串

    strcpy(str3, str1);

    printf("str3 after strcpy: %s\n", str3);



    // 连接字符串

    strcat(str3, " ");

    strcat(str3, str2);

    printf("str3 after strcat: %s\n", str3);



    // 比较字符串

    if (strcmp(str1, str2) == 0) {

        printf("str1 and str2 are equal\n");

    } else {

        printf("str1 and str2 are not equal\n");

    }



    // 查找字符

    char *ptr = strchr(str3, 'W');

    printf("Character 'W' found at position: %ld\n", ptr - str3);



    // 查找子字符串

    char *sub = strstr(str3, "World");

    printf("Substring 'World' found at position: %ld\n", sub - str3);



    return 0;

}

29.下面的函数 Strlen()是模拟 C风格字符串处理函数 strlen(),请补充其代码,并运行程序测试这个函数

int Strlen(const char * str)(

//编写你的代码

//...

}

#include < iostream >

# include < cstring>

using namespace std;

int main( ){

char *s = "Hello world";

std::cout <<"s 的长度是:"<< Stelen(s)< endl;

//调用自己编写的 Strlen()函数

std::cout <<"s 的长度是:"<< strlen(s)<< endl;

//调用标准库的 strlen()函数

}

答:

#include <iostream>

#include <cstring>

using namespace std;



int Strlen(const char *str) {

    int length = 0;

    while (*str != '\0') {

        length++;

        str++;

    }

    return length;

}



int main() {

    char *s = "Hello world";

    

    // 调用自己编写的 Strlen() 函数

    cout << "s 的长度是:" << Strlen(s) << endl;

    

    // 调用标准库的 strlen() 函数

    cout << "s 的长度是:" << strlen(s) << endl;



    return 0;

}

30.实现并测试简单选择排序算法。

答:

#include <iostream>

using namespace std;



void selectionSort(int arr[], int n) {

    for (int i = 0; i < n - 1; i++) {

        int min_idx = i;

        for (int j = i + 1; j < n; j++) {

            if (arr[j] < arr[min_idx]) {

                min_idx = j;

            }

        }

        // Swap the found minimum element with the first element

        int temp = arr[min_idx];

        arr[min_idx] = arr[i];

        arr[i] = temp;

    }

}



int main() {

    int arr[] = {64, 25, 12, 22, 11};

    int n = sizeof(arr) / sizeof(arr[0]);

    

    cout << "原始数组为:" << endl;

    for (int i = 0; i < n; i++) {

        cout << arr[i] << " ";

    }

    cout << endl;



    selectionSort(arr, n);



    cout << "排序后的数组为:" << endl;

    for (int i = 0; i < n; i++) {

        cout << arr[i] << " ";

    }

    cout << endl;



    return 0;

}

31.完善学生成绩分析程序,用动态内存分配存储所有学生的多门成绩,并根据每门成绩占总成绩的百分比计算总评成绩,分析期末成绩或总评成绩的平均分,分距(最高分减去最低分),不同分数区间(不及格、及格、中等、良好,优秀)的百分比等。要求:学生的成绩、每门成绩占总成绩的百分比都从键盘输入。

答:

#include <iostream>

using namespace std;



// 结构体存储学生信息和成绩

struct Student {

    string name;

    int numScores;

    double *scores;

};



// 计算总评成绩

double calculateTotalScore(const Student &student, const double *scorePercentages) {

    double totalScore = 0.0;

    for (int i = 0; i < student.numScores; i++) {

        totalScore += student.scores[i] * scorePercentages[i];

    }

    return totalScore;

}



int main() {

    int numStudents, numSubjects;

    cout << "请输入学生人数: ";

    cin >> numStudents;

    cout << "请输入科目数: ";

    cin >> numSubjects;



    // 动态内存分配存储所有学生的多门成绩

    Student *students = new Student[numStudents];

    for (int i = 0; i < numStudents; i++) {

        cout << "请输入第 " << i + 1 << " 个学生的姓名: ";

        cin >> students[i].name;

        students[i].numScores = numSubjects;

        students[i].scores = new double[numSubjects];

        cout << "请输入 " << students[i].name << " 的各科成绩: " << endl;

        for (int j = 0; j < numSubjects; j++) {

            cin >> students[i].scores[j];

        }

    }



    // 接受每门成绩占总成绩的百分比

    double *scorePercentages = new double[numSubjects];

    cout << "请输入每门成绩占总成绩的百分比: " << endl;

    for (int i = 0; i < numSubjects; i++) {

        cout << "科目 " << i + 1 << " 的百分比: ";

        cin >> scorePercentages[i];

    }



    // 计算总评成绩及其他相关统计信息

    double totalTotalScore = 0.0;

    double minTotalScore = 1000.0;

    double maxTotalScore = 0.0;

    int numPass = 0, numFail = 0, numMiddle = 0, numGood = 0, numExcellent = 0;



    for (int i = 0; i < numStudents; i++) {

        double totalScore = calculateTotalScore(students[i], scorePercentages);

        totalTotalScore += totalScore;



        if (totalScore < minTotalScore) {

            minTotalScore = totalScore;

        }

        if (totalScore > maxTotalScore) {

            maxTotalScore = totalScore;

        }



        if (totalScore < 60) {

            numFail++;

        } else if (totalScore >= 60 && totalScore < 70) {

            numPass++;

        } else if (totalScore >= 70 && totalScore < 80) {

            numMiddle++;

        } else if (totalScore >= 80 && totalScore < 90) {

            numGood++;

        } else {

            numExcellent++;

        }

    }



    // 输出统计信息

    cout << "总评成绩的平均分: " << totalTotalScore / numStudents << endl;

    cout << "分距: " << maxTotalScore - minTotalScore << endl;

    cout << "不及格百分比: " << numFail * 100.0 / numStudents << "%" << endl;

    cout << "及格百分比: " << numPass * 100.0 / numStudents << "%" << endl;

    cout << "中等百分比: " << numMiddle * 100.0 / numStudents << "%" << endl;

    cout << "良好百分比: " << numGood * 100.0 / numStudents << "%" << endl;

    cout << "优秀百分比: " << numExcellent * 100.0 / numStudents << "%" << endl;



    // 释放动态分配的内存

    for (int i = 0; i < numStudents; i++) {

        delete[] students[i].scores;

    }

    delete[] students;

    delete[] scorePercentages;



    return 0;

}

32.用动态内存分配来表示二维矩阵,编写一个函数实现初始化一个矩阵、根据下标读写矩阵元素、两个矩阵相加或相乘、输出一个矩阵的功能。

答:

#include <iostream>



using namespace std;



// 定义矩阵类

class Matrix {

private:

    int rows;

    int cols;

    int **data;



public:

    // 构造函数

    Matrix(int r, int c) {

        rows = r;

        cols = c;

        // 动态分配内存

        data = new int*[rows];

        for (int i = 0; i < rows; ++i) {

            data[i] = new int[cols];

        }

    }



    // 析构函数

    ~Matrix() {

        // 释放内存

        for (int i = 0; i < rows; ++i) {

            delete[] data[i];

        }

        delete[] data;

    }



    // 初始化矩阵

    void initialize() {

        cout << "Enter matrix elements:" << endl;

        for (int i = 0; i < rows; ++i) {

            for (int j = 0; j < cols; ++j) {

                cin >> data[i][j];

            }

        }

    }



    // 读取矩阵元素

    int getElement(int i, int j) {

        return data[i][j];

    }



    // 设置矩阵元素

    void setElement(int i, int j, int val) {

        data[i][j] = val;

    }



    // 矩阵相加

    Matrix add(Matrix& m) {

        Matrix result(rows, cols);

        for (int i = 0; i < rows; ++i) {

            for (int j = 0; j < cols; ++j) {

                result.data[i][j] = data[i][j] + m.data[i][j];

            }

        }

        return result;

    }



    // 矩阵相乘

    Matrix multiply(Matrix& m) {

        Matrix result(rows, m.cols);

        for (int i = 0; i < rows; ++i) {

            for (int j = 0; j < m.cols; ++j) {

                result.data[i][j] = 0;

                for (int k = 0; k < cols; ++k) {

                    result.data[i][j] += data[i][k] * m.data[k][j];

                }

            }

        }

        return result;

    }



    // 输出矩阵

    void print() {

        for (int i = 0; i < rows; ++i) {

            for (int j = 0; j < cols; ++j) {

                cout << data[i][j] << " ";

            }

            cout << endl;

        }

    }

};



int main() {

    int rows, cols;

    cout << "Enter number of rows and columns for matrix 1: ";

    cin >> rows >> cols;



    // 创建矩阵1

    Matrix matrix1(rows, cols);

    matrix1.initialize();



    cout << "Enter number of rows and columns for matrix 2: ";

    cin >> rows >> cols;



    // 创建矩阵2

    Matrix matrix2(rows, cols);

    matrix2.initialize();



    // 输出矩阵1

    cout << "Matrix 1:" << endl;

    matrix1.print();



    // 输出矩阵2

    cout << "Matrix 2:" << endl;

    matrix2.print();



    // 计算矩阵相加

    Matrix sum = matrix1.add(matrix2);

    cout << "Sum of matrices:" << endl;

    sum.print();



    // 计算矩阵相乘

    Matrix product = matrix1.multiply(matrix2);

    cout << "Product of matrices:" << endl;

    product.print();



    return 0;

}

标签:p2,p3,const,指向,17,int,C++,习题,指针
From: https://blog.csdn.net/Kethy__/article/details/139418533

相关文章

  • c++类中初始化列表的优点以及顺序问题
    1.使用初始化列表的好处效率:使用初始化列表可以避免不必要的拷贝操作,直接在对象构造时初始化成员变量,提高代码的执行效率。(因为变量的初始化分为初始化阶段和赋值阶段,在{}里面初始化属于赋值阶段)常量成员初始化:可以在初始化列表中对常量成员或引用的对象进行初始化,且只能在初......
  • C++PrimerPlus第十一章类的使用 :练习7 复数类的实现和重载运算符对复数做运算----本
    复数有两个部分组成:实数部分和虚数部分。复数的一种书写方式是:(3.0,4.0),其中,3.0是实数部分,4.0是虚数部分。假设a=(A,Bi),c=(C,Di),则下面是一些复数运算。加法:a+c=(A+C,(B+D)i)。减法:a-c=(A-C,(B-D)i)。乘法:ac=(AC-BD,(AD+B*C)i)。乘法::xc=(xC,x*Di),其中x为实数。......
  • C++PrimerPlus第十一章类的使用 :练习6 关系运算符的重载
    6.重新编写Stonewt类(程序清单11.16和程序清单11.17),重载全部6个关系运算符。运算符对pounds成员进行比较,并返回一个bool值。   编写一个程序,它声明一个包含6个Stonewt对象的数组,并在数组声明中初始化前3个对象。然后使用循环来读取用于设置剩余3个数   组元素的......
  • C++PrimerPlus第十一章类的使用 :重写练习七,解决重复造轮子的问题
    在第十一章练习七中,为解决重复造轮子的问题。我们先看一下代码的实现#include"pe11_7.h"#include<iostream>usingnamespacestd;Complex::Complex(doublea,doublebi){ this->a=a; this->bi=bi; SetComplex();}voidComplex::SetComplex(void){ this->co......
  • C++Primer Plus第十二章程序清单12.1~12.3一个失败的例子分析
    12.1.2特殊成员函数StringBad类的问题是由特殊成员函数引起的。这些成员函数是自动定义的,就StringBad而言,这些函数的行为与类设计不符。具体地说,C++自动提供了下面这些成员函数:1,默认构造函数,如果没有定义构造函数;2,默认析构函数,如果没有定义;3,复制构造函数,如果没有......
  • C/C++ 引用和指针的区别及使用场景
    C和C++中的引用(reference)和指针(pointer)都是用于间接访问变量的工具,但它们之间存在一些关键的区别和使用场景。一、什么是引用(Reference)?引用是只有在C++中才存在的概念,C语言是没有引用的。定义:引用是变量的别名,换句话说,就是为其起一个外号。一旦引用被初始化为一个变量,就......
  • C++学习笔记(8):指针
      指针的作用:指针保存数据的地址,可以通过指针间接访问内存。1.指针的定义和使用指针的定义语法:数据类型*指针变量名使用:*指针变量名,通过*操作指针指向内存,可以对内存中的数据进行访问和读写。示例:#include<iostream>usingnamespacestd;intmain(){ inta=......
  • 【C++小知识】为什么C语言不支持函数重载,而C++支持
    为什么C语言不支持函数重载,而C++支持编译链接过程函数名修饰过程总结在了解C++函数重载前,如果对文件的编译与链接不太了解。可以看看我之前的一篇文章,链接:文件的编译链接想要清楚为什么C语言不支持函数重载而C++支持,有俩个过程:1.编译链接。2.函数名修饰过程。编译......
  • c++ 运算符重载、线程安全实现单例
    一、运算符重载namespaceCalcRect{ structRect { Rect(intposX=0,intposY=0,intw=0,inth=0) { x=posX; y=posY; width=w; height=h; } voidoperator=(constRect&other) { x=other.x; y=other.y; width=ot......
  • P4003 [清华集训 2017] 无限之环 解题报告
    oj:https://gxyzoj.com/d/gxyznoi/p/P93它要判断什么时候不漏水,就是需要建一种图,使得原图的最大流是答案因为是网格图,考虑黑白染色,可以将\((i+j)\)对2取模的结果作为颜色,将所有颜色为1的点向源点连边,颜色为0的点向汇点连边接下来考虑如何判断是否漏水,因为有四个方向,考虑拆点将......