关于c++常犯的错误

单步调试很重要

如果已经定义一个数组那么就不要再此定义

全局变量的特点

在整个程序结束之前一直有效 同时随着变量值改变而改变

局部变量的特点

只能在某个程序段有效 每次调用从新其所在的函数的时候 变量值从新成为初始值。

静态(static)变量具备两种变量的特点

Eg

int a[m][n] = { 0 };

     int i=1, j=0;

    int a[i][j] = 1, a[i][i] = 1;此处的int会报错

 

关于数组按着输出呈递增规则输出(例如杨辉三角

代码如下:

for (int i = 1; i < m; i++) {

         for (int j = 0; j < i+1; j++)

(关键在于此必须为二维数组 通过两个for循环控制 两个变量进行控制 控制语句即j>i)

 

关于for循环和数组如何控制

1) 错误代码:杨辉三角每行其他数是上一排两个数之和)

for (i = 1; i < m; i++)

     for (int j = 0; j < n; j++) {

          a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

          }

(原因:j=0,j-1<0,数组角标不存在负数 导致溢出)

正确代码如下:

for (int i = 0; i < m; i++) {

         a[i][0] = 1, a[i][i] = 1;(注意此处关于初值定义位置)

         for (int j = 1; j < i; j++)

             a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

    }

 

. 题目:将字符串s2复制到s1后面且\0也要复制(想用指针 结果做错了)

错误代码如下:(代码输出不了任何结果)

char s1[200],s2[200];

    cin >> s1 >> s2;

    char *p = &s1[0];

    for (int i = 0; s1[i] = '\0'; i++)

         p++;

    for (int i = 0; s2[i] = '\0'; i++) {

         p = &s2[i];

         p++;

上面的代码错误分析:

1) for循环里面条件判断语句不对=应该为!=

2) p=&s2[i]不能给p赋值

改完后发生了下面的问题 在输出后结果产生了乱码 不知如何解决

出现乱码的原因已经找到 因为最后一个字符没有复制 即‘\0’没有复制。

char *p = &s1[0];

    for (int i = 0; s1[i] != '\0'; i++)

         p++;

    for (int i = 0; s2[i] != '\0'; i++) {

         *p = s2[i];

         p++;

    }

    *p = '\0';

 

在打倒三角形时 出现了以下错误结果:(红色部分与要求不符)

ABCDEDCBA

 ABCEDCBA

  ABEDCBA

   AEDCBA

    EDCBA

控制红色部分代码如下: 问题是啥呢

for ( j = 5; j >=1; j--)

             cout << char('A' + j - 1);

分析错误原因:

整个循环的j初始值都是5;而不会减少;

如下为正确代码:

只想着改变for循环中的判断语句 也可以改初始语句 还有要知道变量之间能有啥联系

for ( j =6-i ; j >=1; j--)

             cout << char('A' + j - 1);

 

for (int j = 0; j < n; j++) {

         for ( k = 2; k < i; k++) {

             if ((i+j) / k == 0)

                  t=k;

         }

         if (i > t)

             cout << i << " ";

    }

通过单步调试 发现t=k无法赋值 原因未知

(留给错误分析)

 

 

 

现在for循环还是没有理解透

1.      二重循环 可以通过两个变量的关系 来打印三角形 实现二重循环的东西

2.for循环与if判断组合

3.多个分支循环语句 变量之间的关系

4.for语句结构 for(初始化(ini)语句;循环(con)条件;循环(ex)语句)

5.初始化语句只在第一次循环时起作用 在以后的循环中只有conex起作用

6.变量控制范围 即控制域 三个语句都只在for循环里起作用 包括大括号内

7.一旦跳出整个循环变量的值全部失效 即不在存在

8.一但跳回循环 ini便重置

9.如需设置标志flag 则应为全局变量

10.如何跳出循环 重要

基础语句 if  break

1) 标志flag放在判断语句里

2)  

11.两个条件如何放在一块处理

下面是判断素数的程序的核心代码: (程序里面的ij全都是全局变量)

for (i = 2; i < 1000; i++) {

         for (j = 2; j <= i; j++) {

             if (i%j == 0)

                  break;

         }

         if (i == j)

             cout << i << '\t';}

 

 

 

 

if与标志语句的问题

下面有段错误(未能实现要求 )的代码

要求:输入两个数字 i n

      i开始输出素数 一共输出n

for (i; i < 1000; i++) {

             for (j = 2; j <= i; j++) {

                  if (i%j == 0)

                      break;

             }

             if (i == j)

                  cout << i << '\t';

               flag++;

             if (n<=flag)

                  break;

               cout << flag;

         }

这段代码只能输出部分素数

原因分析:通过输出函数得到以下信息 flag一次循环中加的过多

Flag加的过多的原因是因为素数与合数一起算上了

改正代码如下:

将flag++移到判断素数语句里 (两个条件的组合 判断终止

 

 

breakif组合的问题

有如下错误的程序段:

if (a >= pow(b, n))

             cout << n,break;

编译器无法编译 原因未知

解决方案:分开写

if (a <= pow(b, n))

             cout << n;

         if(a<=pow(b,n))

             break;

 

pow()相关问题

其原型为double pow( double x, double y )vc
pow()产生的数据为double 

在除余的时候会报错 因为只能整型才能除余

解决方案:强制转换为int

 

求最值问题

例子:

对于两个整数 ab;求出满足bn次方小于等于a最大整数;

通过小于和最大这两个词 可以得到以下语句:

a <= int(pow(b, i))  并且求出的值还得减1

转载于:https://www.cnblogs.com/lnzhangsong/p/5093260.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值