语法基础课 笔记
7 - 10
return 0 ;
标记何时结束
读取到时就退出程序
7-9 LeetCode 大雪莱公交车问题
for (int i = 0 , j = 0 ; j < 2 ; i ++)
机器语言和人类语言同样是可以读的
但机器语言更加简洁且优美
小芝士:在写笔记的时候注意到了MarkDown语法中选中文字斜体是无法在不同行的,倘若我希望两行必须每行单独选中
662
if (!x && !y)
如果非x成立且非y成立
1通0闭 即其否命题为当x为0时为成立
通过这种方法来判断是否条件成立能简化过程
719 连续奇数的和
还没有学算法基础课,因为c++还没有听完,做的题啰里啰唆没有新思路。消耗大量的时间但如果不做只是听课的话这样又学不进去了,学校讲的糊里糊涂,却把Web讲完了,总是感觉赶不上,总结下来就是学的东西太少,也只好慢慢来吧
判断奇数 if( i % 2 )
而我做的是 if( b[i] % 2==0) b[i]++;
来控制奇数,显而易见的非常 le se
对于数据,给出了七个数据(而且是不可控制的!) 我是先把所有数据存到两个数组数据存到两个数组(!我申请了100个位置!)里面,
-
数量可变
-
数量已给出
需要边输入边输出循环控制
while (n -- )
{
int x, y;
cin >> x >> y;
if (x > y) swap(x, y);
int s = 0;
for (int i = x + 1; i < y; i ++ )
if (i % 2)
s += i;
cout << s << endl;
}
只需一套输入输出对应多组数据
对于此题,求奇数的和,不需必须约束循环开始为奇数(用来每次增2),约束计数的条件不如判断条件后再计数,就比如用五个粗管子不如五个细管子对同样10个出水口中的五个出水口。
用来好几个循环思路清晰但是简单到没有动脑子
713 区间2
do
{
b++;
cin>>t;
if(t>=10&&t<=20) i++;
else j++;
}while(b<a);
对于已知输入数量的输入新增加了一个变量来判断何时结束输入
但是,如标示
while (n -- )
{
int t;
cin >> t;
if (t >= 10 && t <= 20) x ++ ;
else y ++ ;
}
这差距就明显了
控制循环的语句是可以写多句话的
while( cin>> n , n <= 0 )
而不用
do{ cin >> n } while( n < 0 )
——————————
721 递增序列
——————————
死循环使用
while( 1 / true )
且使用if语句来控制程序结束
if ( !x ) break;
输入直到输入为零
while ( cin >> n && n)
输入且输入n不为零
while (cin >> x && x)
{
for (int i = 1; i <= x; i ++ ) cout << i << ' ';
cout << endl;
}
一边输入一边输出的典型案例
循环时不必定义变量和结束条件必须有关
for (int i=0 ; str[i] ; i ++)
return 0;
循环记字母
cnt[str[i] - ‘a’] ++
——————————
字符串
——————————
结尾是 “\0” 等价于 0 (逻辑)
if(str[i])判断句子结束 (字符串内部元素直接加上下标就可以是首地址)
若从地址第几位开始读取 str + 1
不确定和随机是两个意思 后者是会变的 如果跨域
输入字段 没有空格
cin
scanf("%s",str)
有空格
getline()
cin.getline
fgets()
puts
库文件在某种程度上相关
string.h
cstring
——————————
常量储存
——————————
循环时调用函数会增加运算成本
且 循环初始条件仅仅执行一次
strlen()
strlen()不是属性
而是一段代码
abc def 比较的是每个字母的阿斯玛
栈外空间无限制
栈内约束函数空间有限制
char str[100010]
过滤读取字符时会读入回车符
scanf("\n%c",&c) //字符串输入时不需要加入取地址符
——————————
字符数组
——————————
——————————
string 库
——————————
string 和 字符串str 是两个概念
string库 好处
可拼接字符串
动态分配数组空间
string s1 = "yaha";不是赋值 而是副本
//同样体现了string 的直接复制
仅scanf不可用 printf("%s",str.c_str());
puts();
string 的读入一行 getline(cin,s1);
str 读入一行 cin.getline(s1.1000);
str.empty()布尔值 空真1 c++
str.size()返回逻辑长度 abc 3;
而且这个方法是一个类属性
不像strlen()需要循环一遍,这是非常快的;
string 比较大小 直接使用运算符且 按字典序
支持相加和累加 加字符
str s3 = “hello” + “!” 报错 都是普通字符串不是string
for (char c : s) cout<< c << endl;
c 是读取过来的 不能改变原数组
字母循环
c = (c - ‘a’ + 1) %26 + ‘a’;
第一段 字符相对于a的偏移量
第二段 完成超过字母重新开始 环状
第三段 完成偏移
if else 是一句话 在循环的时候 特别突出
string str[i] 结尾加的是 ‘\0’
表现为0 ,逻辑为假
故 str[i] 可作为 结束条件
if(str[i]) 即 如果结束
while(~scanf(“%c”,&c) len++;
直到输入失败 输入为空
结束循环
判断错误以及自我诊断
对于str类型的
if(len == 11 ) printf(“%d\n”, str[len -1];
if判断第几位 printf则是输出 该字符代表的十进制数字
对照 ascii码 用来排查输入或输出错误
printf(“—%c—“,10) 用来高亮某个字符
printf(“%d”,’\n’);
破案了 fgets 会把回车读写进来 gets 会过滤掉回车 这样会造成长度的改变
在一句话中 一行话中 使用str判断数字个数
判断与语句不能直接使用数字 而是使用 ‘数字’
数字针对于字符来讲 数字本身的值和计算机中储存的值是不相同的
枚举 for(auto c : a) str1 = str1 + c + ‘ ‘; 这里不能自增 因为自增时后面都是字符不是string
b.pop_back(); 删除字符串最后一个字符 最后一个会多出来一个空格
评测器是在后面多出来空格都算对的
剪刀石头布 映射 石头 赢剪刀 布赢石头 剪刀赢布
0 1 2
x y
1 > 0 2 > 1 0 > 2
映射 if x = (y + 1)%3
妙啊