本文结合PTA专项练习带领读者掌握指针,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。
6-1 删除字符串中数字字符
删除一个字符串中的所有数字字符。
函数接口定义:
void delnum(char *s);
其中 s 是用户传入的参数。 函数的功能是删除指针 s 所指的字符串中的所有数字字符。
裁判测试程序样例:
#include "stdio.h" void delnum(char *s); int main () { char item[80]; gets(item); delnum(item); printf("%s\n",item); return 0; } /* 请在这里填写答案 */
输入样例:
a0bc+d496df
输出样例:
abc+ddf
void delnum(char *s) { int i=0,j=0; while(s[i]!='\0') {//删除难以处理,那就转换思路,筛选不为数字的字符 if(s[i]<'0'||s[i]>'9') { s[j]=s[i]; j++; } i++; } s[j]='\0'; }
6-2 找最大值及其下标
在一维整型数组中找出其中最大的数及其下标。
函数接口定义:
int fun(int *a,int *b,int n);
其中形参a 、b、n 都是用户传入的参数。函数fun的功能是在指针a所指向的一维数组中找出其中最大的数及其下标,下标存到指针b所指的变量里,函数返回最大值。
裁判测试程序样例:
#include<stdio.h> #define N 10 int fun(int *a,int *b,int n); int main() { int a[N],i,max,p=0; for(i=0;i<N;i++) scanf("%d",&a[i]); max=fun(a,&p,N); printf("max=%d,position=%d\n",max,p); return 0; } /* 请在这里填写答案 */
输入样例:
2 1 5 4 8 4 5 8 9 1
输出样例:
max=9,position=8
int fun(int *a,int *b,int n) { int max1=a[0]; for(int i=0;i<n;i++) { if(max1<a[i]) { max1=a[i]; *b=i; } } return max1; }
6-3 求两数平方根之和
函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。
函数接口定义:
double fun (double *a, double *b);
其中 a 和 b 是用户传入的参数。函数求 a 指针和 b 指针所指的两个数的平方根之和,并返回和。
裁判测试程序样例:
#include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
double fun (double *a, double *b) { double t1=sqrt(*a); double t2=sqrt(*b); return t1+t2; }
6-4 求一组数中的最大值、最小值和平均值
编写函数,求一组数中的最大值、最小值和平均值。
函数接口定义:
float fun(int a[],int n,int *max,int *min);
其中 a、n、max 和 min 都是用户传入的参数。函数求a数组中n个元素的最大值、最小值和平均值。最大值和最小值分别通过max 和 min带回,函数返回平均值 。
裁判测试程序样例:
#include <stdio.h> float fun(int a[],int n,int *max,int *min); int main() { int x[10],i,m,n; float p; for(i=0;i<10;i++) scanf("%d",&x[i]); p=fun(x,10,&m,&n); printf("max=%d,min=%d,average=%.2f\n",m,n,p); return 0; } /* 请在这里填写答案 */
输入样例:
2 5 4 8 6 9 1 3 7 0
输出样例:
max=9,min=0,average=4.50
float fun(int a[],int n,int *max,int *min) { *max=*min=a[0];float sum=0; for(int i=0;i<n;i++) { if(*max<a[i]) { *max=a[i]; } if(*min>a[i]) { *min=a[i]; } sum+=a[i]; } return sum/n; }
6-5 两个4位正整数的后两位互换
将输入的任意两个4位正整数的后两位互换,例如输入1234和5678,交换之后输出1278和5634。
函数接口定义:
void fun(int *p,int *q);
其中p和 q 是用户传入的参数。函数将指针p所指整数与指针q所指的整数的后两位互换。
裁判测试程序样例:
void fun(int *p,int *q); int main() {int a,b; scanf("%d%d",&a,&b); fun(&a,&b); printf("%5d%5d\n",a,b); return 0; } /* 请在这里填写答案 */
输入样例:
1234 5678
输出样例:
1278 5634
void fun(int *p,int *q) { int a1=*p/100*100; int b1=*q/100*100; int a2=*p%100; int b2=*q%100; *p=a1+b2; *q=b1+a2; }
6-6 判断回文字符串
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false。
裁判测试程序样例:
#include <stdio.h> #include <string.h> #define MAXN 20 typedef enum {false, true} bool; bool palindrome( char *s ); int main() { char s[MAXN]; scanf("%s", s); if ( palindrome(s)==true ) printf("Yes\n"); else printf("No\n"); printf("%s\n", s); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
bool palindrome( char *s ) { int right=strlen(s)-1;//因为存在'\\0' 所以减一 for(int left=0;left<=right;left++) { if(s[left]!=s[right]) { return false; } right--; } return true; }
7-1 求矩阵每行元素的和
本题要求编写程序,使用指针方式求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6),再输入m行数据,每行n个整数,每个整数之间用空格分隔。
输出格式:
输出m个整数,每行1个数。
输入样例:
2 3
1 2 3
4 5 6
输出样例:
6
15
#include <stdio.h> int main() { int m,n;scanf("%d%d",&m,&n);int a[m][n]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); int b[m]={0}; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { b[i]+=a[i][j]; } printf("%d\n",b[i]); } }