单步调试很重要
如果已经定义一个数组那么就不要再此定义
全局变量的特点:
在整个程序结束之前一直有效 同时随着变量值改变而改变
局部变量的特点
只能在某个程序段有效 每次调用从新其所在的函数的时候 变量值从新成为初始值。
静态(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.初始化语句只在第一次循环时起作用 在以后的循环中只有con与ex起作用
6.变量控制范围 即控制域 三个语句都只在for循环里起作用 包括大括号内
7.一旦跳出整个循环变量的值全部失效 即不在存在
8.一但跳回循环 ini便重置
9.如需设置标志flag 则应为全局变量
10.如何跳出循环 重要
基础语句 if break
1) 标志flag放在判断语句里
2)
11.两个条件如何放在一块处理
下面是判断素数的程序的核心代码: (程序里面的i和j全都是全局变量)
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++移到判断素数语句里 (两个条件的组合 判断与终止)
break与if组合的问题
有如下错误的程序段:
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型
求最值问题
例子:
对于两个整数 a,b;求出满足b的n次方小于等于a的最大整数;
通过小于和最大这两个词 可以得到以下语句:
a <= int(pow(b, i)) 并且求出的值还得减1;