这篇文章只是为了考试复习而写的,考试只能用C,而且你还必须补充他写的代码,
他写的代码又要求你必须用指针和动态数组(不用指针,代码简单得多),
那没办法了,考前补一下指针和动态数组的使用方法吧。
先给出指针和动态数组的使用方法:
用指针代表一维数组
int *a; //*a即a[0]; *(a+9)即a[9];
要用指针表示二维数组,可以用行指针或列指针
行指针
int (*p)[3],a[3][3];
p=a;//则p就是二维数组a
p[i]+j或者*(p+i)+j都表示&a[i][j],*(*(p+i)+j)表示a[i][j]的值,例如p[1][2]表示(*(a+1)+2);
函数编写:int f(int (*p)[3])
函数调用:f(a)
列指针(把二维数组变成了一维数组)
int *p,a[3][3];
p=*a;//*a用列指针接,a用行指针接
*(p+i*n+j)表示p[i*n+j]
函数编写:int f(int *p)
函数调用:f(*a)
动态数组申请
malloc函数,申请一个变量的内存空间,比如int *a=(int*)malloc(sizeof(int));
calloc函数,申请一个大小为n的数组的内存空间,比如int *a=(int*)calloc(n,sizeof(int));
———————————————————————————————————————————————
以下是练习题,主要是自定义函数进行指针传参以及申请动态空间的应用
———————————————————————————————————————————————
(指针传参,自定义函数排序)nefu 1059 大表哥的指针
考试要求用指针传参,写自定义函数进行排序。
做法是把定义的一维数组a传参到sort(int *a)函数中,编写函数时直接按数组方式进行下标访问即可。
#include <stdio.h>
void sort(int *a)//考试不支持C++,只能自编sort函数,冒泡排序即可
{
int t;
for(int i=1;i<=5;i++)
for(int j=i+1;j<=5;j++)
if(a[j]<a[i])
{t=a[i];a[i]=a[j];a[j]=t;}
}
int main()
{
int a[10];
while(scanf("%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5])!=-1)
{
sort(a);
printf("%d %d %d %d %d\n",a[1],a[2],a[3],a[4],a[5]);
}
return 0;
}
(二维数组,用行指针传参)作业7128
处理二维数组时用行指针比较方便。注意定义二维int型行指针时必须写 (*p)[21],不能写 *p[21]。
#include <stdio.h>
int n,m;
double (*p)[21],a[21][21],ans[21],ave;
void get_ans(double (*p)[21])//写*p[21]会报错,必须写(*p)[21],注意定义二维行指针时变量外一定要打括号!
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
ans[j]=ans[j]+p[i][j];
ave=ave+p[i][j];
}
for(int i=1;i<=m;i++)
ans[i]=ans[i]/n;
ave=ave/(n*m);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&a[i][j]);
p=a;//将二维数组a的地址传给指针p,之后把指针当成二维数组用
get_ans(p);
for(int i=1;i<=m;i++)
i==m?printf("%.2lf\n",ans[i]):printf("%.2lf ",ans[i]);
printf("%.2lf\n",ave);
return 0;
}
(使用calloc函数)nefu 1634 报数
由于考试只能用C,但是C没有C++的queue,所以只能用数组模拟队列了,可以用calloc函数申请动态的一维数组a,
用法是int *a=(int *)calloc(1001,sizeof(a));
C写法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a=(int *)calloc(1001,sizeof(a));//开一个动态数组a,大小为1001
int n,m,tmp,cnt,head,tail;
scanf("%d%d",&n,&m);
tail=0;//尾下标
for(int i=1;i<=n;i++)
a[++tail]=i;//入队
cnt=0;head=1;//头下标
while(head<tail)//队列不为空
{
cnt++;
tmp=a[head];head++;//出队
if(cnt%m!=0)a[++tail]=tmp;//报到的数字不是m则入队
}
printf("%d\n",a[head]);
return 0;
}
C++写法:
#include <bits/stdc++.h>
using namespace std;
queue<int>q;
int main()
{
int n,m,tmp,cnt;
cin>>n>>m;
for(int i=1;i<=n;i++)
q.push(i);
cnt=0;
while(q.size()>1)
{
cnt++;
tmp=q.front();q.pop();
if(cnt%m!=0)q.push(tmp);
}
printf("%d\n",q.front());
return 0;
}
(使用malloc函数)nefu 1026 申请动态空间存放字符串,将其排序后输出
考试要求申请动态空间再排序字符串。
申请单个变量的动态空间,用到malloc函数,用法:
a[i]=(char *)malloc(strlen(tmp)*sizeof(char));//申请a[i]字符串的内存空间,其大小为tmp字符串的长度
注意定义二维字符行指针时不要打括号! 是char *a[21],不是char (*a)[21]!
注意定义二维int型行指针时要打括号! 必须写 (*p)[21],不能写 *p[21]!
#include <stdio.h>
#include <stdlib.h>//这是malloc函数的头文件
#include <string.h>
int n;
char *a[21],tmp[51];
void sort(char *a[21])//字符串按字典序进行冒泡排序
{
char t[51];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(strcmp(a[j],a[i])<0)
{strcpy(t,a[i]);strcpy(a[i],a[j]);strcpy(a[j],t);}
}
int main()
{
while(scanf("%d",&n)!=-1)
{
getchar();
for(int i=1;i<=n;i++)
{
scanf("%s",tmp);
a[i]=(char *)malloc(strlen(tmp)*sizeof(char));//申请a[i]字符串的内存空间,其大小为tmp字符串的长度
strcpy(a[i],tmp);//把tmp字符串复制给a[i]字符串
}
sort(a);
for(int i=1;i<=n;i++)
printf("%s\n",a[i]);
}
return 0;
}
另附C++的代码,直接用string和sort方便得很,14行就能搞定(考试不让我用C++,我也很无奈啊!)
#include <bits/stdc++.h>
using namespace std;
bool cmp(string x,string y){return x<y;}
int main()
{
int n;string a[21];
while(cin>>n)
{
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)printf("%s\n",a[i].c_str());
}
return 0;
}