本文结合PTA专项练习带领读者掌握指针,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。
6-1 鸡兔同笼问题
《孙子算经》记载:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”
函数原型
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot);
说明:head 和 foot 为头和脚的数量,chicken 和 rabbit 为指示鸡和兔数量的指针。若问题有解,则将鸡和兔的数量保存到 chicken 和 rabbit 所指示的变量中,函数值为 1(真);否则不改变 chicken 和 rabbit 所指示的变量,函数值为 0(假)。
裁判程序
#include <stdio.h> int ChickenRabbit(int *chicken, int *rabbit, int head, int foot); int main() { int h, f, c, r; scanf("%d%d", &h, &f); if (ChickenRabbit(&c, &r, h, f)) { printf("%d %d\n", c, r); } else { puts("None"); } return 0; } /* 你的提交代码将被嵌在这里 */
输入样例1
35 94
输出样例1
23 12
输入样例2
30 71
输出样例2
None
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot) { for(int i=0;i<=head;i++) { int j=head-i; if(i*2+j*4==foot) { *chicken=i; *rabbit=j; return 1; } } return 0; }//简单判断即可
6-2 冒泡排序
输入n(1<=n<=10)个整数,将它们从小到大排序后输出,要求编写函数bubble()实现冒泡排序算法。
函数接口定义:
void bubble (int a[ ], int n);
其中 a为数组,n为数据个数。
裁判测试程序样例:
#include <stdio.h> void bubble (int a[ ], int n); int main(void) { int n, a[10]; int i; scanf("%d", &n); for (i=0; i<n;i++) scanf("%d",&a[i]); bubble(a,n); for (i=0; i<n; i++) printf("%d ",a[i]); printf("\n"); return 0; } /* 请在这里填写答案 */
输入样例:
8
7 3 66 3 -5 22 -77 2
输出样例:
-77 -5 2 3 3 7 22 66
void bubble (int a[ ], int n) { for(int i=0;i<n-1;i++) { for(int j=0;j<n-i-1;j++) { if(a[j]>a[j+1]) { int t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } }
6-3 字符串反正序连接
先将在字符串s中的字符按逆序存放到t串中,然后把s中的字符按正序连接到t串的后面。
函数接口定义:
void fun (char *s, char *t);
其中s和 t 都是用户传入的参数。函数先将在字符串s中的字符按逆序存放到t串中,然后把s中的字符按正序连接到t串的后面。
裁判测试程序样例:
#include <stdio.h> void fun (char *s, char *t); int main() { char s[100], t[100]; scanf("%s", s); fun(s, t); printf("%s\n", t); return 0; } /* 请在这里填写答案 */
输入样例:
abcd
输出样例:
dcbaabcd
void fun (char *s, char *t) { int j=0; //计算长度 int l=0; while(s[l]!='\0') l++; for(int i=l-1;i>=0;i--) { t[j]=s[i]; j++; } int p=j; for(int i=0;i<l;i++) { t[p]=s[i]; p++; } t[p]='\0'; }
6-4 计算最长的字符串长度
本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
函数接口定义:
int max_len( char *s[], int n );
其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。
裁判测试程序样例:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
4
blue
yellow
red
green
输出样例:
6
6-5 查找星期
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 星期
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
函数接口定义:
int getindex( char *s );
函数getindex应返回字符串s序号。如果传入的参数s不是一个代表星期的字符串,则返回-1。
裁判测试程序样例:
#include <stdio.h> #include <string.h> #define MAXS 80 int getindex( char *s ); int main() { int n; char s[MAXS]; scanf("%s", s); n = getindex(s); if ( n==-1 ) printf("wrong input!\n"); else printf("%d\n", n); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
Tuesday
输出样例1:
2
输入样例2:
today
输出样例2:
wrong input!
int getindex( char *s ) { if(strcmp(s,"Sunday")==0) return 0; if(strcmp(s,"Monday")==0) return 1; if(strcmp(s,"Tuesday")==0) return 2; if(strcmp(s,"Wednesday")==0) return 3; if(strcmp(s,"Thursday")==0) return 4; if(strcmp(s,"Friday")==0) return 5; if(strcmp(s,"Saturday")==0) return 6; return -1; }
7-1 C程序设计 实验5-7 数组指针作函数参数
数组指针作函数参数
输入m个学生(最多30人)n门课程(最多5门)的成绩,然后计算并打印每个学生各门课的总分和平均分。其中,m和n的值由用户从键盘输入。
输入格式:
输入顺序如下:
学生个数m 课程数n 学生1课程1分数 学生1课程2分数 ... 学生1课程n分数 学生2课程1分数 学生2课程2分数 ... 学生2课程n分数 ... 学生m课程1分数 学生m课程2分数 ... 学生m课程n分数
输出格式:
每个学生总分(整数) 平均分(实数,保留1位小数)
输入样例:
在这里给出一组输入。例如:
2 3
61 62 70
75 82 90
输出样例:
在这里给出相应的输出。例如:
193 64.3
247 82.3
#include <stdio.h> int main() { int m,n;scanf("%d%d",&m,&n);int a[n]; for(int i=0;i<m;i++) { double sum=0; double aver; for(int j=0;j<n;j++) { scanf("%d",&a[j]); sum+=a[j]; } aver=sum/n; printf("%.0f %.1f\n",sum,aver); } }
7-2 查找奥运五环色的位置
奥运五环的5种颜色的英文单词按一定顺序排列{“red”, “blue”, “yellow”, “green”, “black” },定义指针数组并初始化,输入任意一个颜色的英文单词,从已有颜色中查找并输出该颜色的位置值,若没有找到,则输出"Not Found"。
输入格式:
输入一个代表颜色的单词。
输出格式:
输出单词对应的位置值,如果未找到,输出Not Found。
输入样例:
yellow
输出样例:
3
#include <stdio.h> #include <string.h> int main() { char* colors[]={"red","blue","yellow","green","black"}; char color[100]; int flag=-1; scanf("%s",color); for(int i=0;i<5;i++) { if(strcmp(color,colors[i])==0) { flag=i; break; } } if(flag!=-1) printf("%d",flag+1); else printf("Not Found"); }