1. 主页
  2. 文档
  3. Level1题解(11-20)
  4. 附.常见编译运行错误

附.常见编译运行错误

近期,Google公司的AdMob全栈工程师Raymond Farias发表评论表示:“以Google工作中最有效率的一个月为例,使用Google的一款内部工具,即可以查看每天的代码增量(包括添加、删除、更改的代码行数),并根据以往的调查证明,一名高效的工程师每天能写100-150行代码。”

所以同学们每天刷1-2道题,基本上能到100行代码。

学习的价值在于思考,而不在于刷题量.

编译错误

从上面第一个错误开始修改

行和列确定错误位置

  1. 链接错误: 
    [Error] ld returned 1 exit status:链接失败- 大多因为执行窗口没有关闭
  2. 头文件错误: 
    [Error] cstdio: No such file or directory 没有这个文件或者目录
  3. 定义错误; 
    [Error] ‘ans’ does not name a type
    int n, sum; ans;
  4. 中文字符错误: 
    [Error] stray ‘\243’ in program ; ; 正确的英文操作符devc++会显示红色 
    关键字是黑色
  5. 变量未声明,直接使用: 
    [Error] ‘c’ was not declared in this scope
  6. 漏写;号: 
    [Error] expected ‘;’ before ‘}’ token 
    for(;) for(,,)
  7. 漏写判断条件 或 括号() {}不匹配 
    [Error] expected ‘(‘ before ‘{‘ token 
    while {}
  8. 字函数声明和定义时类型不一致
  9. 子函数没有定义 
    ‘xxx’was not declared in this scope

运行和逻辑错误

编译时devC++不报错,但是运行时会错误

  1. 超出变量表示范围
无符号字符型 unsigned char 0~255

短整型 short [int] -32768~32767
无符号短整型unsigned short[int] 0~65535

整型 [signed]int -2147483648~+2147483647 --- 2*10^9
无符号整型unsigned[int] 0~4294967295 --- 4* 10^9

(64bit 8Bytes)
long long的最大值:9223372036854775807 --- 10^18
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551616

int = 4字节
char = 1字节
long long = 8字节
128M = 131072KB = 134217728字节

开int型变量的一维数组最多是3千万, long long型1千5百万, char型1亿左右
  1. scanf()读取了错误类型 比如整形读成了字符串
float f;
scanf("%d", &f);//错误类型
  1. if判断中== 写成了 =
  2. 多层条件语句中的if 和 else不配对
  3. 数组越界
  4. 循环语句中,循环控制变量没有修改,造成了死循环
  5. switch 语句漏掉break
  6. 除0

避免错误方法

被虐多了,也就记住了—>多刷题

  1. 数组多定义几个元素,不怕浪费空间
  2. 变量 ijkmn常用做整形,float变量可以f开头,变量命名形成习惯
  3. 所有判断语句中if() while() for(;;)不要使用=,赋值可以放在前面; 这样容易检查出==写成=号的问题
  4. 除了临时使用的变量,其他变量都定义成全局变量(只适用于竞赛),可以避免栈不够用和忘记初始化的问题
  5. 程序复杂了,可以分出来子函数
  6. 避免局部变量覆盖全局变量

常用调试方法

万能的printf
  1. 关键路径上加上printf用于调试
  2. 检查输入读取是否正确
  3. 检查判断条件是否有遗漏
  4. 检查循环次数是否正确 0-n 还是1-n 是小于还是小于等于
  5. 检查输出格式是否正确
#include <cstdio>
using namespace std;

int k, ans=0, num, num_days;

int main()
{
//freopen("coin.in", "r", stdin);
//freopen("coin.out", "w", stdin);

scanf("%d", &k);
num = 1;
num_days = 0;

for(int i = 1; i<=k; i++){
num_days++;

if(num_days <= num) {
ans += num;
//打印出天数 和 当天发的金币数 进行验证
//printf("%d %d\n", i, num);
}

else {
num_days=1;
num++;
ans += num;
//printf("%d %d\n", i, num);
}
}

printf("%d", ans);

return 0;
}

常用调试输出语句:

printf("%d %d\n", a,b)
if(a>b){
printf("enter a>b");
}

int a[100]
for(int i =0; i < 100; i++) {
printf("a[%d]=%d\n", i a[i]);
}

int f(int n) {
printf("calling f(%d)\n", n);
}

例题讲解 之三连击 P1008

  1. 求数字n的每位数字
int m = n; //保留n
int an[20];
int i;
while(m) {
an[i] = m % 10;
i++;
m /= 10;
}
  1. 判断n个元素数组两两不等的方法去判断是1 – 9
int k[10]; 0-9
int flag = 0;
n = 9;//假设是9个数
for(int i = 1; i <= n i++) {
for(int j=i+1; j<=n; j++) {
if(k[i] == k[j]) {
flag = 1;
break;
}

if(flag == 1)
break;

}
}
  1. 集合的方法:
int sum = 0;
int mul = 1;
for(int i =1; i <= n; i++)
{
sum += k[i];
mul *= k[i];
}
if(sum == 1+2+3+4+5+6+7+8+9 && mul == 1*2*3*4*5*6*7*8*9)
{ ... 符合要求...}
  1. 桶的方法
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int num[10];
int a, b,c, i;
int first, second, third;
int main()
{
for(a = 1; a <=3; a++) {
for(b = 1; b <=9; b++){
if (a == b)
continue;
for(c = 1; c <=9; c++) {
if (c == a || c==b)
continue;
first = a*100 + b *10 + c;
second = first *2;
third = first*3;
if (third > 987)
continue;
memset(num, 0, sizeof(num));
num[a]++;
num[b]++;
num[c]++;
num[second%10]++;
num[second/100]++;
num[(second/10)%10]++;
num[third%10]++;
num[third/100]++;
num[(third/10)%10]++;
for (i = 1; i <=9; i++) {
if(num[i] != 1)
break;
}

if (i == 10)
printf("%d %d %d\n", first, second, third);

}
}
}

return 0;
}