C/C++基础语法

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;elsecout << "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://xiahunao.cn/news/2812240.html

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

相关文章

【Java EE初阶二十五】简单的表白墙(一)

1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

【嵌入式学习】QT-Day4-Qt基础

简单实现闹钟播报&#xff0c;设置时间&#xff0c;当系统时间与设置时间相同时播报语音5次&#xff0c;然后停止。如果设置时间小于当前系统时间&#xff0c;则弹出消息提示框&#xff0c;并清空输入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

远程控制APP,高效生活的秘诀!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

C++ //练习 9.5 重写上一题的函数,返回一个迭代器指向找到的元素。注意,程序必须处理未找到给定值的情况。

C Primer&#xff08;第5版&#xff09; 练习 9.5 练习 9.5 重写上一题的函数&#xff0c;返回一个迭代器指向找到的元素。注意&#xff0c;程序必须处理未找到给定值的情况。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 3工具&#xff1a;vim 代码块 …

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week01

Advanced Learning Algorithms Week 01 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learning-in…

Kafka源码搭建以及系统架构

Kafka源码分析环境搭建 使用截止目前为止Kafka的最新版本3.3.1版本的源码进行环境搭建 Kafka源码下载 从kafka官网下载kafka-3.3.1版本的源码 http://kafka.apache.org/downloads 解压(要放到英文目录&#xff0c;不然会报一些奇怪的错误) Scala安装 因为在源码中配置的sc…

什么是SSH端口转发?

目录 前言&#xff1a; 一、SSH端口转发的概念 二、SSH端口转发的类型 2.1 本地端口转发 2.2 远程端口转发 2.3 动态端口转发 三、SSH端口转发的用途 3.1 安全远程访问 3.2 跨越网络限制 3.3 加密流量传输 3.4 跨越 NAT 网络 3.5 安全代理 四、总结 前言&#xff…

AI:138-开发一种能够自动化生成艺术品描述的人工智能系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

时间序列分析实战(六):ARIMA乘法(疏系数)模型建模及预测

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

多模态表征—CLIP及中文版Chinese-CLIP:理论讲解、代码微调与论文阅读

我之前一直在使用CLIP/Chinese-CLIP&#xff0c;但并未进行过系统的疏导。这次正好可以详细解释一下。相比于CLIP模型&#xff0c;Chinese-CLIP更适合我们的应用和微调&#xff0c;因为原始的CLIP模型只支持英文&#xff0c;对于我们的中文应用来说不够友好。Chinese-CLIP很好地…

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

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

PyQt6的开发流程(密码生成小程序为例)

PyQt6的开发流程&#xff08;密码生成小程序为例&#xff09; 文章目录 PyQt6的开发流程&#xff08;密码生成小程序为例&#xff09;一、流程介绍与概览1. 界面与逻辑分离的开发流程2. PyQt6的开发流程 二、打开 designer.exe 创建文件三、用QT设计师绘制界面保存成ui1. QT常用…

Nginx之rewrite重写功能

一、rewrite概述 1、rewrite功能 访问重写 rewrite 是 Nginx HTTP 请求处理过程中的一个重要功能&#xff0c;它是以模块的形式存在于代码中的&#xff0c;其功能是对用户请求的 URI 进行 PCRE 正则重写&#xff0c;然后返回 30 重定向跳转或按条件执行相关配置。 Nginx服务…

大语言模型推理加速技术:模型压缩篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;模型压缩篇 - 知乎 目录 简介 量化(Quantization) LLM.int8() GPTQ SmoothQuant AWQ 精简Attention 共享Attention参数 Multi-Query Attention Grouped-Query Attention 稀疏Attention Sliding Window Attenti…

Android自定义View实现数字密码锁

最近项目上用到一个密码加锁功能&#xff0c;需要一个数字密码界面&#xff0c;就想着封装成一个View来方便管理和使用。 废话不多说&#xff0c;先上最终效果图&#xff1a; 思路 整体可分为2个部分来实现&#xff0c;1.顶部是4个密码位的填充&#xff1b;2.数字键盘部分。整…

ssm747普通话培训信息管理系统设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm普通话培训信息管…

服务质量目标:SLI,SLO,SLA

如果你要面试运维专家岗/运维架构师/运维经理/运维总监&#xff0c;面试中必然会问到的一个问题就是&#xff1a;“你能保障什么样的SLA&#xff1f;如何去实现你所保障的SLA&#xff1f;” SLA,SLO大家也许也都听说过&#xff0c;也知道几个9的含义&#xff0c;但是细致的去了…

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

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