本文共 4570 字,大约阅读时间需要 15 分钟。
10技术部副部就是本人呐。。。
应邀发技术贴,高手勿喷。。。
之前写的6篇比较水,不发了,直接给第7篇
原文链接
正文
10月3日第七次更新
好啦,前边很煽情地说终点就是起点的,现在正式重开啦!!!
不过九月到十月学了很多东西的,现在都杀到结构和类这边厢了……中间具体哪天干什么我就记不得了,直接上一些在ACM培训课上学的,以后整理——
2010年9月23日
中秋节还上课的飘过
今天虽然讲课简单,但是题比较难的说……提供一道——
【习题】对一个n元素数组赋值,然后将元素后移m位,第n-m+1个数换在开头第1个,第n-m+2个数放在第2个……以此类推
一个n元素数组……看来非要用动态不可了。写了一个,可惜乱到连自己都觉得应该有错……先放上来,以后再改:
#include
using namespace std;
int main()
{ int n,m,*p,i,*t,a;
cout <<
"输入整数个数";
cin>>n;
cout <<
"输入后移个数";
cin>>m;
p=new int[n];
for (i=0;i
p[i]=i+100;
for (i=0;i
cout<
";
cout<
for (t=p;t
{if (t
cout<
";
else
{a=t-p;
cout<
";}
}
delete p;
return 0;
}
这个可读性不是一般差我承认,不过这里提供另外一种思路(俊杰的):建立两个一样的动态数组(i=0,j=i+3),再建两个循环,第一个将第i位赋给第j位;第二个将第n-m+1位赋予第1位等等(其实i不用中断一直数就好,j在第n-m+1位改为从0开始)。这个很好很强大啊,学下来~~~这些移位的还是用两个数组简单易懂。
中秋节的其他没记下来……
10月1日
数组的基本课,今天早上
之前自习过,讲课再次表示无压力……
不过题目还是不错的,发一下:
【习题】要求:定义一个长度为10的整数数组a
输入:初始化数组(a[i]=i),然后分别输入十个整数
输出:每输入一个整数替代掉数组中最小的数,并把数组进行降序输出
#include
using namespace std;
int main()
{int i,a[10],j,t,temp;
for(i=0;i<10;i++)
a[i]=i;
cout<
for(i=0;i<10;i++)
cout << a[i]
<< " ";
cout<
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(a[j]>a[i])
{temp=a[j];
a[j]=a[i];
a[i]=temp;} //先作排序,之后比较方便
cout<
for(i=0;i<10;i++) //要输入十个整数的说
{cout <<
"继续输入:";
cin >>
t; //保存a[9]
if(t>=a[9]) //替代掉数组中最小的数
{a[9]=t; for(j=0;j<10;j++) //前边已经排好,现在要做的是插入
if(a[9]>a[j]) //发现目标a[j]
{temp=a[9];
for(t=8;t>=j;t--) //a[j]后边元素后移先
a[t+1]=a[t];
a[j]=temp; //放心插入
} cout<
for(j=0;j<10;j++) // 插入后每次都要降序输出
cout << a[j]
<
cout<
} }
return 0;}
出现了出现了,动态数组——new和delete的应用
【概念】new 运算符动态分配堆内存
使用形式: 指针变量 = new 类型(常量);
指针变量 = new 类型[表达式];
作用:从堆分配一块“类型”大小的存储空间,返回首地址
其中:“常量”是初始化值,可缺省
创建数组对象时,不能为对象指定初始值
【概念】delete 运算符释放已分配的内存空间
使用形式: delete 指针变量 ;
delete [] 指针变量 ;
其中:“指针变量”必须是一个 new 返回的指针
还是有个题——
【习题】输入:输入一个整数n(n>=2)
输出:输出n行,每一行有2*n-1个数(前n个数逐个递增,后n个数逐个递减)
要求:使用动态数组实现
例如如果输入是n=3,则
输出:1
1 2 1
1 2 3 2 1
难点在于三角形的变量关系和动态数组的使用,很容易搞错
#include
using namespace std;
int main()
{int n,i,j,t;
int*p=NULL;
cout <
cin >> n;
for(i=1;i<=n;i++)
{p=new int
[2*i-1]; //每行一个动态数组- -
for(j=1;j<=i;j++) //前边递增部分
p[j-1]=j;
j--; //循环结束其实j已经偷偷加一,减回去
for(t=j;j<2*i-1;j++,t--)//后边递减部分
p[j]=t-1;
for(j=0;j<2*i-1;j++) //输出数组
cout<
";
delete
[]p; //释放内存
cout<
}
return 0;
}
10月2日
今天是指针基本~~
课本一堆讲解,不说了直接习题
【习题】输入一个二维数a[6][6],设计一个函数,用指向一维数组的指针变量和二维数组的行数作为函数的参数,求出平均值、最大值和最小值,并输出。
自己乱写了一个(表示我被助教老师骗了,她说要把函数体放在循环里,害得我想怎么返回3个值想了好久):
#include
using namespace std;
int main()
{ int a[6][6],i,j,allsum=0,*p,min,max;
float ava=1.0;
int * data (int *p,int i);
cout<
for(i=0;i<6;i++)
for(j=0;j<6;j++)
cin>>a[i][j];
cout<
min=a[0][0];
max=a[0][0];
for(i=0;i<6;i++,p++)
{ p=&a[i][0];
p=data(p,i);
if(*p
min=*p;
p++; //指针读数组下一元素
if(*p>max)
max=*p;
p++;
allsum+=*p;
}
ava=(float)allsum/36.0;
cout<
cout<
cout<
return 0;
}
int * data(int *p,int i)
{int j,sum=0,*t,*pt,*k,*pk,a[3];
t=p;
pt=t;
k=p;
pk=k;
for(j=0;j<6;j++,p++,pt++,pk++)
{sum+=*p;
if(*pt>*t)
t=pt;
if(*pk
k=pk;
}
a[0]=*k; //把三个值赋给一个数组,再用指针指向数组,传指针实现传三个值
a[1]=*t; //第一个是最小值,第二个是最大值,第三个是各行和
a[2]=sum;
p=&a[0]; //再次感慨我太聪明了
return p;
}
老师后来给了一个,看得出明显比较熟练(明显没有被骗)。
#include
#include
using namespace std;
void fun(int (*p)[6],int n)
{
static float avg;
static int max,min;
int sum=0;
max=min=**p;
int i,j;
for(i=0;i
for(j=0;j <6;j++)
{
sum+=*(*(p+i)+j);
if(max
if(min>
*(*(p+i)+j)) min=*(*(p+i)+j);
}
avg=sum/(6*n);
cout <<
"平均数为: "
<
<
<<
"最大数为: "
<
<
<<
"最小数为: "
<
<
getchar();
}
void main()
{
int a[6][6]={
{5,66,345,44,365,54},
{48,99,34,67,2,67,},
{45,97,31,6,79,31},
{36,975,32,457,1,31},
{746,13,74,69,34,54},
{57,29,47,31,87,51}
};
fun(a,6);
}
【习题】输入10个整数,将其中最小的数与第一个数对换,将最大的数与最后一个数对换。流程:①输入10个数 ②进行处理
③输出10个数。
必须用指针方法处理。
拓展:3个过程用三个函数分别实现
我写了一个,调试了好久……还是传参问题
#include
using namespace std;
int * t,i,a[10]; //a[10]若在各个函数内定义会被随机……果断使用全局变量
int main()
{ int * scan();
int *
change(int * p);
void
print(int * p);
int *
p; p=scan();
p=change(p);
print(p);
return 0 ;
}
int * scan()
{ int i,*p;
cout<
for(i=0;i<10;i++)
cin>>a[i];
for(i=0;i<10;i++)
a[i]=9-i;
p=&a[0];
return
p;
}
int * change(int *p)
{ int i,temp,t,c=0;
for(i=0;i<10;i++,p++)
a[i]=*p;
t=a[0];
for(i=0;i<10;i++)
{if(a[i]>t)
c=i;} //记下最大值下标
temp=a[0]; //果断与第一个数交换
a[0]=a[c];
a[c]=temp;
t=a[9];
c=0;
for(i=0;i<10;i++)
{if(a[i]
c=i;} //最小值也一样
temp=a[9];
a[9]=a[c];
a[c]=temp;
p=a;
return
p;
}
void print(int * p)
{int i;
for (i=0;i<10;i++,p++)
cout <<
*p<< " ";
}
J写了一个,虽然没有用三个函数,但是这个是纯指针操作的说——
#include
using namespace std;
int main()
{ int i,*p,*t,j=0,h=0,a[10],*b,*k;
for(i=0;i<10;i++)
cin>>a[i];
p=b=a;
t=a+1;
for(i=0;i<9;i++,t++) if
(*p>*t) p=t;
t=a+1;
for(i=0;i<9;i++,t++) if
(*b
cout<
"; //先输出最小那个
for(i=1;i<9;i++)
{ k=&a[i];
if(p==k)
cout<
";//如果到达最小那个的地址,输出第一个(相当于与第一个交换)
if(b==k)
cout<
转载地址:http://umiox.baihongyu.com/