第10周项目1项目填充一的拓展(多次输入计算)

本文介绍了一个简单的四则运算计算器程序,该程序使用C++编写,能够连续计算十个数学表达式,并输出每个表达式的运算结果。

问题及代码:

/* 
*Copyright (c)2014,烟台大学计算机与控制工程学院 
*All rights reserved. 
*文件名称:calculate.cpp 
*作    者:单昕昕 
*完成日期:2014年10月30日 
*版 本 号:v1.0 
* 
*问题描述:输入想要计算的式子及四则运算符。本程序设定计算十个式子。
*程序输出:运算结果。
*/ 
#include <iostream>
using namespace std;
int main()
{
    int a = 100;
    int b = 20;
    int c,m=1;
    char oper;
    while(m<=10)// 限定计算十个式子。
    {

        cin>>a>>oper>>b;
        switch(oper)  //oper即operation,这里表示四则运算符。
        {
        case '+':
            c = a + b;
            ++m;
            cout<<"c="<<c<<endl;
            continue;         
        case '-':
            c = a - b;
            ++m;
            cout<<"c="<<c<<endl;
            continue;
        case '*':
            c = a * b;
            ++m;
            cout<<"c="<<c<<endl;
            continue;
        default :
            if( b==0)
            {
                c = a;
                ++m;
                cout<<"c="<<c<<endl;
            }
            else
                c = a / b;
            ++m;
            cout<<"c="<<c<<endl;
            continue;
        }
    }


    return 0;
}



 

运行结果:

 

知识点总结:

利用continue和while循环语句实现多次计算并输出结果。

 

学习心得:

O(∩_∩)O哈哈~想要算多少式子都行了~~小学低年级同学必备~~

<think> 我们正在讨论MATLAB中矩阵多次寻址拓展(也称为线性索引或下标索引的拓展使用)的方法和原理。 在MATLAB中,矩阵的索引(寻址)非常灵活,除了常规的行列下标索引(如A(i,j))外,还可以使用线性索引(单下标索引)以及逻辑索引等。 多次寻址拓展通常指的是通过个索引向量(或者矩阵)来次性获取矩阵中的多个元素。这包括: 1. 使用下标向量进行索引:例如,A([1,3,5], [2,4]) 会返回个3×2的矩阵,其元素是A的第1、3、5行与第2、4列交叉位置的元素。 2. 使用线性索引:MATLAB实际上在内存中按列存储矩阵,因此可以将矩阵视为个长的列向量。线性索引就是使用单个下标(可以是标量或向量)来访问元素。例如,对于个3×3的矩阵A,A(5)表示第2列第2行的元素(因为第1列有3个元素,第2列的第个元素就是第4个,所以第5个就是第2列第2行)。 3. 使用逻辑索引:通过个与矩阵同样大小的逻辑矩阵(元素为true或false)来索引,返回逻辑矩阵中为true的位置对应的元素。 用户询问的是多次寻址拓展,重点在于“多次”和“拓展”,即如何通过次索引操作获取多个元素,以及些高级的索引技巧(如线性索引的拓展使用)。 方法: 1. 使用向量索引:可以同时使用行向量和列向量来获取子矩阵。例如: A = magic(3) % 假设我们想要第1行和第3行的第2列和第3列 B = A([1,3], [2,3]) 2. 线性索引:我们可以用个线性索引向量来获取多个元素,这些元素会被拼成个列向量(按列的顺序)。例如: A = magic(3) ind = [1,3,5]; % 线性索引位置 C = A(ind) % 返回个包含A(1), A(3), A(5)的列向量 3. 逻辑索引:例如: A = magic(3) mask = A>5; % 创建个逻辑矩阵,找出A中大于5的元素 D = A(mask) % 返回所有大于5的元素,按列顺序排列 原理: - MATLAB的矩阵在内存中按列存储,即先存储第列,再存储第二列,依此类推。因此,线性索引就是按照这个顺序从1开始编号。 - 当使用多个下标向量进行索引时,MATLAB会取行向量和列向量的笛卡尔积所对应的元素。例如,行向量[r1,r2]和列向量[c1,c2]会得到四个元素:A(r1,c1), A(r1,c2), A(r2,c1), A(r2,c2),并按行向量和列向量的顺序排列成个矩阵(行数为行向量的长度,列数为列向量的长度)。 - 逻辑索引则是将逻辑矩阵中为1(true)的位置对应的元素取出,并按列优先顺序排列成个列向量。 此外,MATLAB还支持使用end关键字、冒号运算符(:)等来生成索引向量。 拓展:有时我们可能需要将多个索引向量组合使用,例如同时使用行索引和列索引,但各自都是向量。MATLAB也支持使用单个索引向量(线性索引)来获取多个元素,或者使用sub2ind函数将行列下标转换为线性索引。 例如,如果我们有行下标向量rows和列下标向量cols,我们可以使用线性索引来获取这些位置的元素: ind = sub2ind(size(A), rows, cols); E = A(ind); 注意:使用线性索引时,索引向量可以是任意形状,但结果总是个列向量(除非你使用reshape改变形状)。而使用两个下标向量时,结果是个矩阵。 下面通过个例子来演示: 例:创建个4×4的矩阵,然后进行多次寻址。 A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]; 1. 取第1行和第3行,第2列和第4列: B = A([1,3], [2,4]) % 结果是个2×2矩阵:[2,4; 10,12] 2. 使用线性索引取第1,3,6,8,9个元素: C = A([1,3,6,8,9]) % 结果是个列向量:[1;9;6;8;?] % 注意:第1个元素是A(1,1)=1,第3个元素是A(3,1)=9,第6个元素是A(2,2)=6,第8个元素是A(4,2)=14?不对,我们重新计算: % 按列存储:第1列:1,5,9,13;第2列:2,6,10,14;第3列:3,7,11,15;第4列:4,8,12,16。 % 所以第1个:1,第3个:9,第6个:10(因为第1列4个,第2列第2个是第6个位置),第8个:14(第2列第4个,即第8个位置),第9个:3(第3列第1个)。 % 因此,C = [1;9;10;14;3] 3. 使用逻辑索引取大于10的元素: D = A(A>10) % 返回大于10的元素:11,12,13,14,15,16(按列顺序) 另外,MATLAB还支持使用“:”运算符来生成所有行或列,例如: E = A(:, [1,3]) % 所有行的第1列和第3列 总结:MATLAB提供了多种灵活的索引方式,可以高效地提取矩阵中的多个元素。掌握这些索引方式对于编写高效、简洁的MATLAB代码非常重要。 注意:索引向量中的元素不能超出矩阵的维度范围,否则会报错。为了避免错误,可以使用size函数获取矩阵的大小,然后确保索引在有效范围内。 如果用户需要更具体的应用场景或进步的说明,可以继续提问。 根据要求,生成相关问题: 1. MATLAB中如何将行列下标转换为线性索引? 2. 逻辑索引在矩阵操作中有哪些优势? 3. 在MATLAB中如何安全地使用索引以避免越界错误? </think> 在MATLAB中,矩阵多次寻址拓展(也称为高级索引或多重下标索引)是种高效访问和操作矩阵元素的强大技术。其核心原理是通过**索引向量或矩阵**次性获取多个元素,避免循环操作。以下是具体方法和原理分析: --- ### **、基础方法** #### 1. **行列双向量索引** 通过行索引向量 `R` 和列索引向量 `C` 直接提取子矩阵: ```matlab A = [1 2 3; 4 5 6; 7 8 9]; R = [1, 3]; % 选择第1行和第3行 C = [1, 2]; % 选择第1列和第2列 B = A(R, C) % 输出: [1 2; 7 8] ``` - **原理**:MATLAB将索引视为笛卡尔积,生成所有 `(R_i, C_j)` 组合对应的元素。 #### 2. **线性索引转换** 使用 `sub2ind` 将行列下标转为线性索引(按列优先存储): ```matlab rows = [1, 3, 2]; cols = [2, 1, 3]; lin_idx = sub2ind(size(A), rows, cols); % 转为线性索引:[4, 3, 8] values = A(lin_idx) % 输出:[2, 7, 6] ``` - **原理**:MATLAB在内存中按列存储矩阵,线性索引计算公式为: $$ \text{index} = (c-1) \times m + r $$ 其中 `m` 为行数,`r` 为行下标,`c` 为列下标。 #### 3. **逻辑索引** 通过逻辑矩阵筛选元素: ```matlab mask = A > 5; % 生成逻辑掩码:[0 0 0; 0 0 1; 1 1 1] result = A(mask) % 输出按列展开的元素:[7;8;6;9] ``` - **原理**:逻辑索引返回所有 `true` 位置对应的元素,结果始终为列向量。 --- ### **二、高级拓展技巧** #### 1. **重复索引** 索引向量允许重复值,实现元素复制: ```matlab idx = [1, 1, 3, 2]; B = A(idx, :) % 复制第1行两次,再取第3、2行 ``` 输出: ``` 1 2 3 1 2 3 7 8 9 4 5 6 ``` #### 2. **高维数组索引** 对三维数组使用多维索引: ```matlab C = rand(3,3,2); % 3×3×2数组 D = C([1,3], [2,3], :) % 提取第1&3行、第2&3列的所有页 ``` #### 3. **索引赋值** 通过索引直接修改多个元素: ```matlab A([1,3], [1,2]) = [10, 20; 30, 40]; % 结果:A = [10 20 3; 4 5 6; 30 40 9] ``` --- ### **三、底层原理与性能** 1. **内存访问优化** MATLAB通过**单次内存块操作**完成索引,比循环逐元素访问效率更高(尤其对大矩阵)。 2. **向量化计算支持** 索引结果可直接参与向量运算,例如: ```matlab mean_value = mean(A(A > 5)); % 计算所有大于5元素的均值 ``` 3. **维度自动扩展** 若索引向量维度不匹配,MATLAB自动进行广播(Broadcasting): ```matlab A([1,2], 3) = [100; 200] % 修改第3列的第1、2行 ``` --- ### **四、工程注意事项** 1. **避免索引越界** 使用 `size(A)` 动态获取矩阵维度,确保索引在有效范围内: ```matlab max_row = size(A,1); valid_rows = R(R <= max_row); % 过滤越界索引 ``` 2. **预分配结果矩阵** 对大规模索引操作,预分配内存避免动态扩容开销: ```matlab result = zeros(length(R), length(C)); % 预分配 result(:) = A(R, C); % 填充数据 ``` 3. **逻辑索引优化** 复杂条件优先用逻辑索引替代 `find` 函数,减少中间变量: ```matlab % 推荐方式(直接逻辑索引) values = A(A > 5 & A < 9); % 非推荐(find生成额外索引向量) idx = find(A > 5 & A < 9); values = A(idx); ``` --- ### **应用场景示例** 1. **批量修改图像像素** 通过逻辑索引调整RGB图中满足条件的像素值: ```matlab img = imread('image.jpg'); mask = img(:,:,1) > 200; % 红色通道>200的区域 img(mask) = 255; % 设为纯白 ``` 2. **稀疏矩阵操作** 提取非零元素并重构矩阵: ```matlab [rows, cols, vals] = find(S); % S为稀疏矩阵 new_S = sparse(rows, cols, vals.^2); % 对非零元素平方 ``` --- **
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值