c语言制表符_溢出与双重循环 |C语言程序设计学习攻略第七期

45ca2e6269cf621a278bbf981e0870b6.png

1

溢出

溢出 是程序调试过程中一个非常难以捕捉的bug

好好的代码跑着跑着变量的值就飞了

只留下红红的WA和一片万脸懵逼

咋回事呢?

真正理解溢出

首先要理解C语言中 变量的存储形式

以下将涉及到一些naive的 计算机组成原理知识

非战斗人员 请撤离!!!

拿我们最常用的char,short, int,

long, long long举例

在我们测试环境(win32)下

它们对应的字节长度如下表所示:

类型名称

字节数

取值范围(十进制)

signed char

1

-128~127

short

2

-32768~32767

int

4

-2147483648~2147483647

long

4

-2147483648~2147483647

long long

8

-922337203685477588~922337203685477587

聪明的你应该已经看出规律了

一个字节对应8个位

而取值的上限是:2^(总位数-1)-1

下限是:-2^(总位数-1)

当运算过程中超过对应数据类型的界限时

就会发生 溢出

然后就会出现不符合思维逻辑的计算

(实际上是先取反码再取补码)

3070cf46ea6ba9f33c290969bc7389c6.png

floatdouble这类浮点数采用特殊的编码机制

在这里不做进一步展开了

只要知道double的精度比float高即可

所以在上机的过程中能用double就不用float

同理,能用longlong就不用int

92f55ee701d6d21a8e0b8be1a265c142.png

2

双重循环

咳咳,听说有同学不喜欢写 双重循环

那你怕不怕限定答题不允许用循环?

(正在进行的阿里校招就出了这种丧心病狂的题目)

所以双重循环还是要学会使用的嘛

我们举个简单的栗子:

for(int i=0;i {for(int j=0;j     {
        a[i][j] = 0;
    }
}

这是一段数组初始化的代码

将一个大小为nxn的二维数组中的所有元素都设为0

也是数组常用的操作之一

它的逻辑是先执行内部的循环

对数组的第i行进行初始化

然后再初始化第i+1行,以此类推

双重循环还有一个经典的使用场景是打印如下图形:

*
**
***
****
*****

代码如下:

for(int i =0;i<5;i++)
{for(int j=0;j1;j++)
    {
        printf("*");
    }
    printf(*\n");
}

相信你现在已经可以打印出任意的规律图形了!

(去年期末考试第一题就是这个哦)

22ce4637bb33a02bf0e4c2dc731e4d29.png

3

学长小课堂

学长,我看隔壁的小雨敲代码好快好快啊......时常为自己单身19年的手速担忧

f9ae59eb2d35533c1afaa29e76defd12.png 236438d70122c2e5f9e85cf7c4edb5f7.png

学弟

嘤嘤嘤

f9ae59eb2d35533c1afaa29e76defd12.png 236438d70122c2e5f9e85cf7c4edb5f7.png

学弟

236438d70122c2e5f9e85cf7c4edb5f7.png f9ae59eb2d35533c1afaa29e76defd12.png 236438d70122c2e5f9e85cf7c4edb5f7.png

学弟

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

叮~,您的快捷键大礼包已到账,请查收!

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

 ctrl+c 复制

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

ctrl+v 粘贴

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

 ctrl+a 全选 

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

ctrl+s 保存

随手保存很重要!!!

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

ctrl+z 撤销

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

选择多行后tab 向右缩进

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

选择多行后shitf + tab 向左缩进

55d5c8fb69c5ddc672d479405ab95b3e.png

学长

4845adae30168b11c587a6b1989f747f.png

DEV-C++中:

ctrl+/ 单行注释

ctrl+d 删除整行

ctrl+n 新建源代码

ctrl+w 关闭当前源代码

fdb596d7d9820ad3a3b13cd7b3f6c350.png

4

上机大礼包

最重要的一点当然是仔细看题!!!

如果对题意有不理解的

可以及时询问在场的老师或者助教

题意问题在考试的时候也是允许提问

当你仔细的读完题后

不一定要急着写,除非说你有很大的把握

通常可以先自己构造一些测试数据来帮助自己完善思路

而不是写着写着发现有问题没有解决又要去修bug

举个栗子:

题目描述

为了补偿被WA,TLE,REG……等折磨得痛苦不堪的同学们,lx决定出一道大水题。
 读入若干字符,统计这些字符里含有的单词数。这里对单词的定义比较宽松,它是其中不包含空格、制表符(\t)或换行符(\n)的字符序列。

输入

若干字符,可能包含空格、制表符或换行符。

输出

一行。一个整数,表示单词数。

输入样例

This is a test.

输出样例

4

读完这个题后,应该明确的是单词在这个题中的定义:

不包含空格、制表符(\t)或换行符(\n)的字符序列

也就是说这个单词可能看起来非常的奇怪:

"%&(*@#%#$is_a_legal_word

那么两个单词之间的字符只能是

空格,制表符或换行符

那么可能会出现什么情况呢?

word1(多个空格/空格+制表符/多个制表符/...)word2

有了这些之后

在想这个题的时候是不是就能更清楚一些了呢?

最后,讲一下怎么将数据复制到运行框中。

a04e24242b7748969e35d02f89151886.png

右键单击运行框的 顶部 编辑 粘贴

有时候你可能会看到

你的输出出现在你输入的数的中间

但这是正常的

在评测的时候我们只会检查你的输出

有兴趣的同学也可以去学习一下文件操作。

a1700d987dc9ab0f0779fbfa9d6b807a.png

排版 | 朴恩广

内容 | 陈天宇

肖思炀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值