ACM练习——第二天

        今天又是一天课,满课,很累哈,计组真的挺难的,但是多学学还是可以学明白。行吧,继续进入今天的ACM练习,现阶段都是主要练习Java到C++的语言过渡。

        因为今天的题目多半都是昨天的延伸,我就不提供Java的对比代码了。

1.题目一

题目来自牛客网

B-A+B(2)_OJ在线编程常见输入输出练习场 (nowcoder.com)

        呃,有啥疑问,t是多少就循环多少次呗。

然后记住C++的输入输出语句就行

上代码:

#include <iostream>

int main() {
    // 读取数据组数 t
    int t;
    std::cin >> t;

    // 处理每一组数据
    for (int i = 0; i < t; i++) {
        // 读取两个整数 a 和 b
        int a, b;
        std::cin >> a >> b;

        // 计算并输出 a+b 的结果
        std::cout << a + b << std::endl;
    }

    return 0;
}

2.题目二

也是计算a+b

 代码示例:

#include <iostream>

using namespace std;

int main(){
    // 在a和b都是0的时候结束
    while(true){
        int a;
        int b;
        // 给ab赋值
        cin >> a;
        cin >> b;
        // 如果为0,就不输出结果了,然后直接结束循环
        if(a == 0 && b == 0){
            break;
        }
        // 如果至少一方不为0输出结果
        cout << a + b << endl;
    }
    
    return 0;
}

3.题目三

        成功将a+b净化为了a+b+c+...+n

        那就直接展示吧~~学了那么多,这点还是可以拿捏的只是C++的语法不同罢了

代码示例:

#include <iostream>

using namespace std;

int main(){
    // 先将a,b定义出来
    int x;
    // 然后进入死循环,直到遇到0
    while(true){
        int n;
        cin >> n;
        if(n == 0){
            break;
        }
        int result = 0;
        for(int i = 0; i < n; i++){
            // 然后进行每次的累加求和
            cin >> x;   
            result += x;
        }
        cout << result << endl;
        
    }
    
    return 0;
    
}

4.题目四

        分析一下,第一行表示有多少组数据,

        然后每行的第一个数就是这组数据的数量,简单~!~~

        其实就是前几个题目的结合

代码示例:

#include <iostream>

using namespace std;

int main(){
    // 先接收第一行的参数,获得所有的数据组的数量
    int allLine;
    cin >> allLine;
    // 然后就可以进入allLine次数循环
    for(int i = 0; i < allLine ; i++){
        // 然后在这每次的循环中再进行每行的第一个数字次数的循环
        int thisLine;
        cin >> thisLine;
        int result = 0;
        for(int j = 0; j < thisLine; j++){
            int x;
            cin >> x;
            result += x;
        }
        cout << result << endl;
    }
    return 0;
}

5.题目五

        那这就需要自己来判断循环什么时候结束了

        每一行的第一个数是这一行要计算的数据量

        相比如前几个有明确的结束条件,这里的结束条件算是比较的隐蔽,  

但是仔细一点仍然可以发现。

        就是数据数据为Null的时候,就是结束的时候,所以结束条件需要写在前面即可。

代码示例:

#include <iostream>

using namespace std;

int main(){
    // 首先接收开头的第一个数据
    // 若数据为Null则结束循环
    while(true){
        int n;
        if(!(cin >> n)){
            // 为NULL(为0)则结束循环
            break;
        }
        // 走到这里则不为0,而且我们还拿到了每行要取多少个元素相加
        int result = 0;
        for(int i = 0; i < n; i++){
            int x;
            cin >> x;
            result += x;
        }
        // 返回数值,记得添加换行符
        cout << result << endl;
        
    }
    return 0;
    
}

6.题目六

        这里就没有每次很好的判断条件了。

        在Java之中我可以很快的告诉你使用readLine()这个API来解决,但是在C++中我还是查询了一下,

        可以使用std::getline读取一行数据

        `std::getline` 是 C++ 标准库中的一个函数,用于从输入流中读取一行数据。它的基本用法如下:

```cpp
#include <iostream>
#include <string>

int main() {
    std::string line;

    // 逐行读取输入
    while (std::getline(std::cin, line)) {
        // 对读取到的一行数据进行处理
        // ...
    }

    return 0;
}
```

        在上述示例中,`std::getline` 函数被用来从标准输入流 (`std::cin`) 中逐行读取数据,并将每行的内容存储在名为 `line` 的字符串中。循环会继续执行,直到 `std::getline` 遇到文件末尾或者发生了读取错误。

        你可以在循环中对读取到的每一行数据进行进一步处理,比如使用 `std::istringstream` 分割字符串或者进行其他操作。

        如果你想指定一个定界符来分割行内的内容,你可以使用 `std::getline` 的另一个版本,指定第三个参数作为定界符:

```cpp
#include <iostream>
#include <string>
#include <sstream>

int main() {
    std::string line;

    // 逐行读取输入
    while (std::getline(std::cin, line)) {
        std::istringstream iss(line);
        std::string token;

        // 以空格为分隔符,逐个读取字符串
        while (std::getline(iss, token, ' ')) {
            // 对读取到的字符串进行处理
            // ...
        }
    }

    return 0;
}
```

        在这个例子中,`std::getline(iss, token, ' ')` 使用空格作为分隔符,将 `iss` 流中的内容逐个读取到 `token` 字符串中。这样,你就可以逐个处理分隔开的字符串。

        再详细说一下使用std::istringstream处理数据

        `std::istringstream` 是 C++ 标准库中的一个类,用于将字符串当做输入流来处理。它可以从字符串中提取数据,就像 `std::cin` 从标准输入流中提取数据一样。以下是一个简单的示例,演示了如何使用 `std::istringstream`:

```cpp
#include <iostream>
#include <sstream>
#include <string>

int main() {
    // 定义一个字符串
    std::string input_str = "10 20 30 40 50";

    // 使用 std::istringstream 对字符串进行处理
    std::istringstream iss(input_str);

    int num;
    
    // 从 iss 中逐个读取整数并输出
    while (iss >> num) {
        std::cout << "Read: " << num << std::endl;
    }

    return 0;
}
```

        在这个示例中,我们首先定义了一个包含空格分隔整数的字符串 `input_str`。然后,我们使用 `std::istringstream` 类创建了一个字符串流 `iss`,并将字符串 `input_str` 传递给它。接下来,我们使用 `while (iss >> num)` 循环,它会逐个从字符串流中读取整数,并输出到标准输出流中。

        你可以使用类似的方法在你的程序中处理输入字符串。例如,你可以在循环中使用 `iss >> num` 读取整数,然后对这些整数进行累加等操作。

然后又有问题了

这里读取的iss中不是字符串吗,为什么可以直接和整数类型累加呢?

答:
  iss >> num 会从字符串流 iss 中读取一个字符串,并使用 std::stoi 将其转换为整数。这样,你就可以逐个读取字符串并将其转换为整数后进行累加。

还有一点就是,在C++中其实是没有string类型的,你需要使用字符数组替代或者采用标准函数库

#include <string>中的    std::string

代码示例:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main(){
    // 先定义出接收这一行字符串的数据
    string line;
    
    // 开始循环获取
    while(getline(cin, line)){
        istringstream iss(line);
        int num;
        int result = 0;
        
        // 逐个读取整数并且累加
        while(iss >> num){
            result += num;
        }
        
        cout << result << endl;
    }
    return 0;
    
}

完美运行!

然后我问了基地学习C++的负责人又给出了如下代码,也可以完美运行,更实用

#include<bits/stdc++.h>
using namespace std;
    
int main()
{
    int n;
    while(cin >> n)
    {
        int sum = n;
        while(cin.get() != '\n')
        {
            int m;
            cin >> m;
            sum += m;
        }
        cout << sum << endl;
    }
    return 0;
}

结语

今天又学习到了一些C++的语法,和一些很使用的操作,又是收获满满的一天\(^o^)/

ヾ( ̄▽ ̄)Bye~Bye~

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WenJGo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值