C/C++基础语法

news2024/9/29 23:39:24

C/C++基础语法

文章目录

  • C/C++基础语法
    • 头文件
    • 经典问题
      • 秒数转换
      • 闰年
      • 斐波那契数列
      • 打印n阶菱形
        • 曼哈顿距离
        • 菱形图案的定义
        • 大数计算
    • 输入输出
      • 格式化输入输出
      • `getline()`函数解决`cin`只读入一个单词的问题
    • 运算符
      • 赋值运算符
    • Switch
    • 循环
      • 处理未知数量输入的几种常见方法
      • for-each
    • 字符串String
      • 字符串连接
      • 字符串长度

参考资料:

  • AcWing
  • https://www.w3schools.com/cpp/
  • https://cui-jiacai.gitbook.io/c+±stl-tutorial/

头文件

#include <cmath>

经典问题

秒数转换

输入一个整数,表示时间,单位是秒。输出一个字符串,用”时:分:秒”的形式表示这个时间。

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int t;

    cin >> t;

    int hours = t / 3600;
    int minutes = t % 3600 / 60;
    int seconds = t % 60;

    printf("%d:%d:%d\n", hours, minutes, seconds);

    return 0;
}
  • int hours = t / 3600; 计算总秒数 t 包含多少完整的小时。因为1小时 = 3600秒,所以使用整数除法 t / 3600 可以得到完整小时数。整数除法的结果是去掉小数部分,仅保留整数部分。
  • int minutes = t % 3600 / 60; 首先,t % 3600 计算出除去完整小时后剩余的秒数。然后,将这个剩余的秒数除以60(因为1分钟 = 60秒)得到完整分钟数。这里也使用了整数除法,因此结果是剩余秒数中包含的完整分钟数。
  • int seconds = t % 60;使用取模运算 t % 60 计算出除去完整分钟后剩余的秒数。因为1分钟是60秒,所以这个操作会得到小于60的秒数,即最后剩余的秒数部分。

闰年

判断闰年。闰年有两种情况:
(1) 能被100整除时,必须能被400整除;
(2) 不能被100整除时,被4整除即可。

  1. 输入一个年份,如果是闰年输出yes,否则输出no。
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int year;
    cin >> year;

    if (year % 100 == 0)
    {
        if (year % 400 == 0) cout << "yes" << endl;
        else cout << "no" << endl;
    }
    else
    {
        if (year % 4 == 0) cout << "yes" << endl;
        else cout << "no" << endl;
    }

    return 0;
}
  1. 用一条if语句,判断闰年。
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int year;

    cin >> year;

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        cout << "yes" << endl;
    else
        cout << "no" << endl;

    return 0;
}

斐波那契数列

求斐波那契数列的第n项。f(1) = 1, f(2) = 1, f(3) = 2, f(n) = f(n-1) + f(n-2)。

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;

    int a = 1, b = 1, i = 1;
    while (i < n)
    {
        int c = a + b;
        a = b;
        b = c;
        i ++ ;
    }

    cout << a << endl;

    return 0;
}

打印n阶菱形

输入一个n,打印n阶菱形。n是奇数。

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;

    int cx = n / 2, cy = n / 2;

    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < n; j ++ )
            if (abs(i - cx) + abs(j - cy) <= n / 2)
                cout << '*';
            else cout << ' ';
        cout << endl;
    }

    return 0;
}
曼哈顿距离

理解 abs(i - cx) + abs(j - cy) <= n / 2 这个条件的关键在于理解曼哈顿距离(Manhattan Distance)的概念,以及如何通过这个距离来定义一个菱形(或者说是正方形对角线方向的正方形)图案。

曼哈顿距离是在格点坐标系中,两点在标准的直角坐标系中的绝对轴距总和(只能横行走和纵向走,走到中心点要几步)。对于任意两点 (x1, y1)(x2, y2),它们的曼哈顿距离是 |x1 - x2| + |y1 - y2|

在这个程序中,(i, j) 表示当前遍历到的网格点的坐标,(cx, cy) 是图案中心点的坐标。abs(i - cx) + abs(j - cy) 计算的就是当前点 (i, j) 到中心点 (cx, cy) 的曼哈顿距离。

在这里插入图片描述

菱形图案的定义

这个条件 abs(i - cx) + abs(j - cy) <= n / 2 用于判断当前点是否在菱形图案内部(包括边界)。这里的 n / 2 实际上定义了菱形的“半径”,即从中心点到边界的最大曼哈顿距离。

  • abs(i - cx) + abs(j - cy) 的值小于或等于 n / 2 时,这意味着当前点 (i, j) 距离中心点的曼哈顿距离在菱形的半径范围内,因此,它位于菱形内部或边界上,程序应该在这个位置打印一个星号 *
  • 当这个距离大于 n / 2 时,当前点 (i, j) 在菱形外部,程序在这个位置打印一个空格
    -在这里插入图片描述
大数计算

计算 2 的 N 次方。N≤10000

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[10000], size = 1, n;
    a[0] = 1;

    cin >> n;
    while (n -- )
    {
        int t = 0;
        for (int i = 0; i < size; i ++ )
        {
            t += a[i] * 2;
            a[i] = t % 10;
            t /= 10;
        }
        if (t) a[size ++ ] = t;
    }

    for (int i = size - 1; i >= 0; i -- ) cout << a[i];
    cout << endl;

    return 0;
}

这段代码是一个计算2N次方的程序,特别适用于处理大数运算,即当N很大时,直接使用常规数据类型(如intlong)无法存储结果的情况。这里N可以达到10000。程序通过模拟手工乘法的方式来计算结果,将每一位数字存储在一个数组a中,数组的每个元素代表结果数的一位,a[0]是结果的最低位,a[size-1]是结果的最高位。

下面是代码的详细解释:

  1. 初始化

    • int a[10000]:定义一个数组a,用于存储计算过程中的每位数字。
    • size = 1:初始化结果数字的大小为1,因为20次方等于1,所以起始时数组只有一位数字1
    • a[0] = 1:将结果的最低位初始化为1
  2. 读取输入

    • cin >> n:从标准输入读取N的值。
  3. 计算2N次方

    • while (n -- ):循环N次,每次循环相当于将当前结果乘以2
    • 在每次循环中,使用变量t来存储进位,初始时进位为0
    • for (int i = 0; i < size; i ++ ):遍历数组的每一位,模拟乘法运算。
    • t += a[i] * 2:当前位乘以2加上前一位的进位(如果有)。
    • a[i] = t % 10:更新当前位的值为新计算结果的个位数。
    • t /= 10:计算新的进位值。
    • 如果最后一位运算完后还有进位(t不为0),则将这个进位作为新的最高位添加到数组的末尾,并增加size
  4. 输出结果

    • 由于数组中存储的是倒序的结果(即最低位在数组的开始位置),因此输出时需要从size - 1开始倒序遍历数组。
    • for (int i = size - 1; i >= 0; i -- ) cout << a[i];:倒序输出数组的每一位,即输出计算得到的2N次方的结果。
    • cout << endl;:在结果后输出换行符。

输入输出

格式化输入输出

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    float b = 3.12345678;
    double c = 3.12345678;

    printf("%.4f\n", b);
    printf("%.3lf\n", c);

  	printf("%5d\n", a);
    printf("%8.4f\n", b);
    printf("%7.3lf\n", c);

 	printf("%-5d!\n", a);
    printf("%-8.4f!\n", b); // 如果整个数字(包括小数点和小数部分)不足8个字符,则在右侧用空格填充,实现左对齐。
    printf("%-7.3lf!\n", c);

	printf("%05d\n", a);
    printf("%08.4f\n", b);
    printf("%07.3lf\n", c);

    return 0;
}
  • float, double等输出保留若干位小数时用:%.4f, %.3lf
  • %8.3f, 表示这个浮点数的最小宽度为8,保留3位小数,当宽度不足时在前面补空格。
  • %-8.3f,表示最小宽度为8,保留3位小数,当宽度不足时在后面补上空格
  • %08.3f, 表示最小宽度为8,保留3位小数,当宽度不足时在前面补上0

getline()函数解决cin只读入一个单词的问题

cin 将空格(空格、制表符等)视为终止字符,这意味着它只能存储单个单词(即使您键入许多单词)

在处理字符串时,我们经常使用 getline() 函数来读取一行文本。它以 cin 作为第一个参数,字符串变量作为第二个参数:

string fullName;
cout << "Type your full name: ";
getline (cin, fullName);
cout << "Your name is: " << fullName;

运算符

赋值运算符

这些赋值运算符是C++(以及C和其他语言)中的复合赋值运算符,它们将算术或位运算和赋值操作结合在一起。每个运算符的作用如下:

  1. &= (按位与赋值运算符)
  • 语法: x &= 3
  • 等效于: x = x & 3
  • 作用: 将 x3 进行按位与操作,然后将结果赋值给 x。按位与操作对应位都为1时结果为1,否则为0。
  1. |= (按位或赋值运算符)
  • 语法: x |= 3
  • 等效于: x = x | 3
  • 作用: 将 x3 进行按位或操作,然后将结果赋值给 x。按位或操作对应位有一个为1时结果为1,都为0时结果为0。
  1. ^= (按位异或赋值运算符)
  • 语法: x ^= 3
  • 等效于: x = x ^ 3
  • 作用: 将 x3 进行按位异或操作,然后将结果赋值给 x。按位异或操作对应位不同为1,相同为0。
  1. >>= (右移赋值运算符)
  • 语法: x >>= 3
  • 等效于: x = x >> 3
  • 作用: 将 x 的二进制表示向右移动 3 位,然后将结果赋值给 x。右移操作会将高位丢弃,对于无符号数,低位补0;对于有符号数,低位补充依赖于具体实现(通常是补符号位,即算术右移)。
  1. <<= (左移赋值运算符)
  • 语法: x <<= 3
  • 等效于: x = x << 3
  • 作用: 将 x 的二进制表示向左移动 3 位,然后将结果赋值给 x。左移操作会在低位补0,高位丢弃,相当于将 x 乘以 2 的移动位数次方(这里是 2^38)。

二进制位移操作解释

Switch

int day = 4;
switch (day) {
  case 1:
    cout << "Monday";
    break;
  case 2:
    cout << "Tuesday";
    break;
  case 3:
    cout << "Wednesday";
    break;
  case 4:
    cout << "Thursday";
    break;
  case 5:
    cout << "Friday";
    break;
  case 6:
    cout << "Saturday";
    break;
  case 7:
    cout << "Sunday";
    break;
}
// Outputs "Thursday" (day 4)

循环

处理未知数量输入的几种常见方法

  1. while(cin >> x)
    在C++中,cin >> x 尝试从标准输入(通常是键盘输入或重定向的文件输入)读取一个值到变量 x 中。如果读取成功,表达式的值为 true;如果遇到输入结束(如文件结束或遇到不匹配类型的输入),表达式的值为 false。因此,while(cin >> x) 循环会持续读取输入直到遇到输入结束。

  2. while(scanf("%d", &x) != -1)while(~scanf("%d", &x))
    在C语言中,scanf("%d", &x) 尝试从标准输入读取一个整数到变量 x 中。scanf 函数返回成功读取的项目数量。如果读取成功,返回 1;如果遇到输入结束(EOF),返回 -1

  • while(scanf("%d", &x) != -1) 循环会持续读取输入,直到 scanf 返回 -1,即遇到输入结束。
  • while(~scanf("%d", &x)) 利用了位运算符 ~(按位取反)。在大多数系统上,EOF(即 -1)按位取反后的结果是 0,而 0 是逻辑假。因此,这个循环同样会持续读取输入,直到遇到输入结束。这是一种更为简洁的写法。
  1. while(cin >> x && x)while(cin >> x, x)
    这两种形式都用于处理当读入的最后一个值为 0 且这个 0 不需要处理的情况。
  • while(cin >> x && x) 循环会持续读取并处理非零的输入。如果 x0 或遇到输入结束,循环停止。
  • while(cin >> x, x) 使用了逗号运算符,该运算符执行其两边的表达式,并返回右侧表达式的结果。这里先尝试从输入读取一个值到 x,然后通过逗号运算符返回 x 的值作为 while 循环的条件。这个用法较为少见,且可能引起混淆,其效果与 while(cin >> x && x) 相同。

以上这些方法提供了在未知数量输入的情况下从标准输入读取数据的有效手段,以及如何根据特定条件(如输入的值为 0)结束输入的方式。

for-each

“for-each 循环”(在 C++ 版本 11 (2011) 中引入,专门用于循环数组(或其他数据集合)中的元素

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i : myNumbers) {
  cout << i << "\n";
}

字符串String

字符串连接

使用+号或者append()

string firstName = "John";
string lastName = "Doe";
string fullName = firstName + " " + lastName;
fullName = firstName.append(lastName);
cout << fullName;

字符串长度

使用length()size()

string txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
cout << "The length of the txt string is: " << txt.length();
cout << "The length of the txt string is: " << txt.size();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dell Vestro 7500 Realtek ALC236 耳机插入无效无声音 解决

查了很多&#xff0c;试了很多。 最终还下是重启设备来得最简单有效。 无效方式&#xff1a; 安装最新驱动&#xff1a;没有236这个芯片&#xff0c;找不到官方驱动使用旧驱动&#xff1a;问题依旧使用驱动程序中的禁用设备&#xff0c;启用后还是没有&#xff08;以前好像也…

Kubernetes部署及运用

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…

2024程序员容器化上云之旅-第4集-Ubuntu-WSL2-Windows11版:夺取宝剑

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker和K8s。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统&#xff0c;并打算将其用Docker容器化后用K8s上云。 6 夺取宝剑 &#x1f525;阅读Nigel…

【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(下)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

二叉树进阶oj练习

目录 1. 根据二叉树创建字符串 1&#xff09;思路 2&#xff09;代码实现 2. 二叉树前序非递归遍历实现 1&#xff09;思路&#xff1a; 2&#xff09;代码实现 3. 二叉树中序非递归遍历实现 1&#xff09;思路&#xff1a; 2&#xff09;代码实现&#xff1a; 4. 二…

Programming Abstractions in C阅读笔记:p303-p305

《Programming Abstractions in C》学习第74天&#xff0c;p303-p305总结&#xff0c;总计3页。 一、技术总结 1.时间复杂度分类(complexity classes) ClassNotationExampleconstantO(1)Returning the first element in an arraylogarithmicO(logN)Binary search in a sorte…

三菱plc控制双控电磁阀(从接线到程序)

目录 硬件设备 电磁阀的类型&#xff08;下图为例&#xff09; 三菱plc的类型&#xff08;西门子控正COOM接接正极&#xff0c;三菱控负COM接负极&#xff09; 气缸图 三菱plc与双控电磁阀接线 输出接线图&#xff08;COOM输出的公共端&#xff0c;三菱控负COM接负极&#x…

大学生课程|统计基础与python分析6|主流的评估方法:ROC曲线和KS曲线(免费下载所有课程材料)

目录 1 ROC曲线 2.查看混淆矩阵 3.实战评估股票客户流失预警模型 4.阈值的取值方法 5.KS曲线与KS值 6.获取KS值对应的阈值 7.获取KS值 对于二分类模型来说&#xff0c;主流的评估方法有ROC曲线和KS曲线两种方法 1 ROC曲线 之前已经获得了模型的准确度为79.77%&#xf…

【USENIX论文阅读】Day2

Birds of a Feather Flock Together: How Set Bias Helps to Deanonymize You via Revealed Intersection Sizes&#xff08;"物以类聚&#xff1a;集合偏差如何帮助去匿名化——通过揭示交集大小&#xff09; Xiaojie Guo, Ye Han, Zheli Liu, Ding Wang, Yan Jia, Jin L…

高级光线传播与高级外观建模

一.高级光线传播 1、无偏的 ①有偏VS无偏 蒙特卡洛估计出的结果的期望永远是对的 eg&#xff1a;PT中不管有多少样本&#xff0c;期望都是定积分的值 有偏的&#xff1a;估计出的结果的期望和积分的值不一样 一个特殊情况&#xff08;一致的&#xff09;&#xff1a;极限定…

【web APIs】1、(学习笔记)有案例!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、概念二、使用步骤1.获取DOM对象2.操作元素内容3.属性修改3.1.常用属性修改3.2.控制样式属性3.3.操作类名(className) 操作CSS3.4.操作表单元素属性3.5.自定…

Mysql常见函数和用法(重点)

where子句中经常使用的运算符 -- 查询总分大于200分的所有同学 select * from student2 where (chineseenglishmath)>200; -- 查询math大于60 并且(and)id大于4的学生成绩 select * from student2 where math>60 and id>4; -- 查询英语成绩大于语文成绩的同学 select …

面试总结之JVM入门

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;你为什么要学习JVM&#xff1f;&#x1f380;JVM的作用 &#x1f380;JVM的构成&#xff08;5大类&#xff09;&#x1f3e8;1.类加载系统&#x1f415;类什么时候会被加…

《Docker 简易速速上手小册》第2章 容器和镜像(2024 最新版)

文章目录 2.1 理解 Docker 容器2.1.1 重点基础知识2.1.2 重点案例&#xff1a;使用 Docker 运行 Python 应用2.1.3 拓展案例 1&#xff1a;Docker 中的 Flask 应用2.1.4 拓展案例 2&#xff1a;Docker 容器中的数据分析 2.2 创建与管理 Docker 镜像2.2.1 重点基础知识2.2.2 重点…

k8s(5)

目录 使用Kubeadm安装k8s集群&#xff1a; 初始化操作&#xff1a; 每台主从节点&#xff1a; 升级内核&#xff1a; 所有节点安装docker &#xff1a; 所有节点安装kubeadm&#xff0c;kubelet和kubectl&#xff1a; 修改了 kubeadm-config.yaml&#xff0c;将其传输给…

网络攻防之网络扫描

目录 1、进行ping扫描 2、进行TCP SYN扫描 3、进行TCP全连接扫描 4、进行FIN扫描 5、进行UDP扫描 6、进行操作系统扫描 7、进行主机全面扫描 8、对网络号进行扫描 环境配置拓扑图&#xff1a; 实验前准备 查看kali和靶机的ip地址信息&#xff1a; 查看两台主机是否能互…

vue中循环多个li(表格)并获取对应的ref

有种场景是这样的 <ul><li v-for"(item,index) in data" :key"index" ref"???">{{item}}</li> </ul> //key值在项目中别直接用index&#xff0c;最好用id或其它关键值const data [1,2,3,4,5,6]我想要获取每一个循环并…

数据结构知识点总结-线性表(3)-双向链表定义、循环单链表、、循环双向链表、静态链表、顺序表与链表的比较

双向链表定义 单链表结点中只有一个指向其后继的指针&#xff0c;这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点&#xff08;插入、删除操作时&#xff09;&#xff0c;只能从头开始遍历&#xff0c;访问后继结点的时间复杂度为 O(1) &#xff0c; …

详解java类型转换

✨✨ 所属专栏&#xff1a; Java基石&#xff1a;深入探索Java核心基础✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 引言 在Java编程中&#xff0c;类型转换是将一个数据类型的值转换为另一个数据类型的过程。Java中的类型转换主…

Django学习笔记-ModelForm使用(完全依赖)

1.创建模型 ,code,name,sex,entrydate 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建模型表单,继承forms.ModelForm,Meta:元数据,models需引入,fields填写引用的模型变量 4.创建testModelForm.html,添加urls 5.views编写testmodelfo…