之前改程序的时候,不仅是单单的头疼,而是已经到了厌恶和恐惧的地步。
今年改观了,因为读《傅盛认知三部曲》给了我一些启发:对计算机的认知决定了你在计算机领域的成就。所以不再把他看成折磨你的恶魔,而是看成一个需要了解的朋友,在遇到问题的时候,心里的抗拒就会少很多。
步入正题,改代码收获:
1、用new创建二维数组的方法及其配套的delete
char **a=new char *[n]//创建二维数组
For(int i=0;i<n;;i++)
{
a[i]=new char[10];
}
For(int i=0;i<n;i++)//配套的delete
{
Delete[] a[i];
}
Delete[] a;
之前在做数据结构实验的时候,保存一组商品或其他事物的名称真的很让我头秃,没想到今年补休C++就把我的问题给轻松解决了!!!
菜鸟的快乐总是如此简单~
这也是成长的礼物吧。
2、刚刚上手new总会遇到各种各样的问题,像这一个:
用new定义了一个数组,总是会有数组越界的提示,查了查发现:
程序有时判断是否越界访问,会在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。所以,声明的时候多一个,就可以吧这个问题轻松解决了!。(这个是一个输入商品和对应的价格来找出最低价商品和最高价商品的代码)
#include <iostream>
#include<stdio.h>
//#pragma warning(disable:4996)//使scanf可以使用
using namespace std;
int qiumax(float *p, int n) {
int i;
int m=0;
float max = p[0];
for (i = 0; i < n; i++) {
if (p[i] > max)
{
max = p[i];
m = i;
}
}
return m;
}
int qiumin(float *p, int n) {
int i;
int m = 0;
float min = p[0];
for (i = 0; i < n; i++) {
if (p[i]<min)
{
min = p[i];
m = i;
}
}
return m;
}
int main() {
int n;int d, x;
int i;
cin >> n;
char ** aa = new char*[n+1];//定义一个可以存储名字的二维数组
for (i = 0; i < n+1; i++)
{
aa[i] = new char[10]; //每个行指针有column个容量
}
float *b = new float[n+1];
for (i = 0; i < n; i++) {
getchar();
//scanf("%s", aa[i]);
cin.get(aa[i], 31);
//cin.get(aa[i], 10);
//getchar();
getchar();
cin >> b[i];
}
d = qiumax(b, n);
x = qiumin(b, n);
cout << "highest price:";
printf(" %.1f",b[d] );
cout << ", ";
printf("%s", aa[d]);
cout << endl;
/*for (i = 0; aa[i] != '\0'; i++)
{
cout << aa[d][i];
}*/
cout << "lowest price:";
printf(" %.1f", b[x]);
cout << ", ";
printf("%s", aa[x]);
//cout << "," << aa[x];
for (i = 0; i < n+1; i++)
{
delete[] aa[i];
}
delete[] aa;
delete[] b;
return 0;
}
肝代码第一天,记录一下,也提醒自己:程序出现问题,一定要先跟着数据走一遍,这样才会全面的查找自己的思维漏洞。VS的提示只是语法相关的,真正深层而准确的原因就要靠自己啦。