博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言中秋log10的函数,10本科生的C++成长轨迹7 - ACM培训:数组&函数&指针
阅读量:5976 次
发布时间:2019-06-20

本文共 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/

你可能感兴趣的文章
得到目标元素距离视口的距离以及元素自身的宽度与高度(用于浮层位置的动态改变)...
查看>>
安装和配置Tomcat
查看>>
实验三
查看>>
openssh for windows
查看>>
PostgreSQL cheatSheet
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
转:Mosquitto用户认证配置
查看>>
SpringBoot上传文件到本服务器 目录与jar包同级
查看>>
python开发_difflib字符串比较
查看>>
被解放的姜戈01 初试天涯
查看>>
三极管工作区在Spectre中的表示
查看>>
HT for Web的HTML5树组件延迟加载技术实现
查看>>
ASP.NET MVC 3 Razor Nested foreach with if statements
查看>>
【Mysql】命令行
查看>>
Asterisk 安装与配置
查看>>
利用日志记录所有LINQ的增,删,改解决方案
查看>>
实例讲解PostSharp(一)
查看>>
graylog 客户端的安装配置
查看>>
CentOS6.4_X86_64 安装Drupal-7.31必须成功版!
查看>>
驱动学习之驱动和应用的接口
查看>>