第4讲 数组与指针-潘1
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
蛇形填数 (1114)
问题描述:在n×n方阵里填入1, 2, 3, …, n×n,要求填成 蛇形。例如n=4时方阵为:
10 9 8 7 11 16 15 6 12 13 14 5 1 2 3 4
输入要求:输入一个 正整数n(n≤8),占一行。 输出要求:输出一个n×n的蛇形方阵,每行的数字之间用1 个空格分开。
for(i =0;i<n/2;i++) { for(j=i;j<n-i;j++) if(a[j][n-1-i] ==0) a[j][n-1-i] = m++; for(j=n-i-1;j>i;j--) if(a[n-i-1][j] ==0) a[n-i-1][j] = m++; for(j=n-i-1;j>i;j--) if(a[j][i] ==0) a[j][i] = m++; for(j=0;j<n-i;j++) if(a[i][j] ==0) a[i][j] = m++; } if(n%2==1) a[n/2][n/2]=m;
int a[5]={1,2,3,4,5};可写为
int a[ ]={1,2,3,4,5};
引用一维数组元素
引用数组元素的表示形式为: 数组名[下标] 如a[0]=a[5]+a[7]-a[2*3] int n=5,a[10]; a[n]=20; 注意:只能引用数组元素而不能一次整体 调用整个数组全部元素的值。 合法 合法
输入样例: 5 输出样例: 13 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6 5
#include<iostream> using namespace std; int main() { int n,i,j,m=1; int a[10][10]; cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=0;
#include <stdio.h> int main() { void sort(int array[],int n); int a[10],i; printf("enter array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10); printf("The sorted array:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0; }
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于:
int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={{0,0,3},{ },{0,10}};合法
引用二维数组的元素
二维数组元素的表示形式为:
数组名[下标][下标]
青年歌手大奖赛(1112)
问题描述:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规 则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出 某选手的得分。 输入要求:输入数据有多组,每组占一行,每行的第一个数是 n(2<n<100),表示评委的人数,然后是n个评委的打分。 输出要求:对于每组输入数据,输出选手的得分,结果保留2位小数, 每组输出占一行。 输入样例: 3 99 98 97 4 100 99 98 97 输出样例: 98.00 98.50
#include<iostream> using namespace std; int main() { int a[1001]={0},i,x; cin>>x; while(x!=-1) { a[x]++; cin>>x; } for(i=1;i<=1000;i++) if(a[i]>0) cout<<i<<" "<<a[i]<<endl; return 0; }
例:用选择法对数组中10个整数按由小到 大排序。 a[0] a[1] a[2] a[3] a[4]
3 6 1 9 4
1
1 1
6
3 3
3
6 4
9
9 9
4
4 6
1
3
4
6
9
小到大排序
void sort(int array[],int n) { int i,j,k,t; 在sort[i]~sort[9]中, for(i=0;i<n-1;i++) 最小数与sort[i]对换 { k=i; for(j=i+1;j<n;j++) if(array[j]<array[k]) k=j; t=array[k]; array[k]=array[i]; array[i]=t; } }
第4讲 数组与指针
一维数组 二维数组 指针 动态内存分配
定义一维数组
定义一维数组的一般形式为:
类型符 数组名[常量表达式]; 数组名的命名规则和变量名相同 如 int a[10]; 数组名 每个元素的数据类型 数组长度
一维数组的初始化
在定义数组的同时,给各数组元素赋值
int a[10]={0,1,2,3,4,5,6,7,8,9}; int a[10]={0,1,2,3,4};相当于 int a[10]={0,1,2,3,4,0,0,0,0,0}; int a[10]={0,0,0,0,0,0,0,0,0,0};相当于 int a[10]={0};
输入要求:输入两个整数L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),L代 表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来 的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起 始点和终止点的坐标。 输出要求:占一行,马路上剩余的树的数目 输入样例: 500 3 150 300 100 200 470 471 输出样例: 298
b[1][2]=a[2][3]/2 合法
for(i=0;i<m;i++)
printf(“%d,%d\n”,a[i][0],a[0][i]);合法
一个简单例子
将一个二维数组行和列的元素互换,存到另 一个二维数组中。
1 2 3 a 4 5 6
1 4 b 2 5 3 6
开灯问题(1111)
问题描述:有n盏灯,编号为1~n。第1个人把所有灯打开, 第2个人按下所有编号为2的倍数的开关(这些灯将被关 掉),第3个人按下所有编号为3的倍数的开关(其中关掉 的等将被打开,开着的灯将被关闭),以此类推。一共有 k个人,问最后有哪些灯开着? 输入要求:n和k(k≤n≤1000) 输出要求:开着的灯的编号。编号之间以空格分隔,第一 个输出项之前和最后一个输出项之后不要空格。 输入样例:
aቤተ መጻሕፍቲ ባይዱ0]
a[1] a[2]
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
逻辑存储
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
校门外的树(1110)
题目描述:某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔 都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在 L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路 上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。 现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将 这些树都移走后,马路上还有多少棵树。
如何改进?
选票统计(1113)
问题描述:一年一度的南京市“十佳青少年”选举开始了,根据海选 结果,候选人达到了1000人,每个市民都可以参加投票选举,并且每 个人可以选若干人。市民只需将自己要选举的候选人编号一次写在选 票上即可。选举结束后,选委会进行选票统计。由于选票众多,且每 张选票上被选举的人数不等,编写一个程序完成选票统计:将所有选 票上的编号依次输入计算机,以-1表示统计结束,这时计算机要给所 有的选票编号 及统计其得票数。 输入要求:一行(一组以空格隔开的编号,以-1为结束)。相临的两 个数中前面表示序号,后面表示票数。 输出要求:按编号序号分若干行输出编号和得票数(不输出票数为0 的候选人情况)。 输入样例: 3 1 2 3 2 1 2 3 1 2 2 1 3 3 1 2 3 3 -1 输出样例: 1 5 2 6 3 7
一维数组 二维数组 指针 动态内存分配
定义二维数组
二维数组定义的一般形式为
类型符 数组名[常量表达式][常量表达式];
如:float a[3][4],b[5][10];
二维数组可被看作是一种特殊的一维数组:
它的元素又是一个一维数组
例如,把a看作是一个一维数组,它有3个元素: a[0]、a[1]、a[2] 每个元素又是一个包含4个元素的一维数组
73
输出样例: 1567
#include<stdio.h> #include<string.h> #define MAXN 1000 + 10 int a[MAXN]; int main() { int i, j, n, k, first = 1; memset(a, 0, sizeof(a)); scanf("%d%d", &n, &k); for(i = 1; i <= k; i++) for(j = 1; j <= n; j++) if(j % i == 0) a[j] = !a[j]; for(i = 1; i <= n; i++) if(a[i]) { if(first) first = 0; else printf(" "); printf("%d", i); } printf("\n"); return 0; }
内存中的存储顺序
二维数组的初始化
int a[3][4]={{1,2,3,4},{5,6,7,8},
{9,10,11,12}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4]={{1},{5},{9}};等价于 int a[3][4]={{1,0,0,0},{5,0,0,0}, {9,0,0,0}}; int a[3][4]={{1},{5,6}};相当于 int a[3][4]={{1},{5,6},{0}};
#include<stdio.h> int main() { int n,s,a[100],i,k,b; double w; while(scanf("%d",&n)!=EOF) { k=0; w=0; s=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); k++; b=a[0]; w=w+a[i]; } for(i=0;i<k;i++) { if(a[i]>s) s=a[i]; } for(i=1;i<k;i++) { if(b>a[i]) b=a[i]; } w=(w-s-b)/(k-2); printf("%.2lf\n",w); } return 0; }
解题思路
开一个有L+1个元素的数组,每个元素对应一棵树, 全部初始化为1(或0),表示各个位置上都有树。 然后每读入一个区间,就将该区间对应的数组元素 都变成0 (或1),表示该区间的树都被砍了。 最后算一下还有几个1 (或0),就是还剩几棵树 了。
#include <iostream> using namespace std; int main() { 如果L的值非 int a[10001]={0},i,j,L,m,x,y; 常大,该怎么 while(cin >> L >> m) { 办? while(m--) { cin >> x >>y; for(i=x;i<=y;i++) a[i] = 1; //代表移走了 } j = 0; for(i=0;i<=L;i++) if(a[i] != 1) //没被移走的 j++; cout << j <<endl; } return 0; }