PTA 8习题讲解
判断题
-
指针变量指向某变量的地址不一定是1000,语句的含义应该是将指针P指向的变量内容赋值为1000.
-
该语句的含义应该是定义了一个指针变量p,两个int 类型的普通变量。
-
int *p只能指向int类型的变量,同样char *p只能指向char类型的变量,double *p只能指向double类型的变量,float *p只能指向float类型的变量.
-
不同类型的指针变量不可以相互赋值,同类型的指针变量可以相互赋值。
-
*p是一个指针变量,需赋值一个可用的地址之后才可这样赋值。
- 教材P189页 在函数定义时将指针作为函数的形参,在函数调用时把变量的地址作为实参。
- a即数组a的首地址,地址为常量,不可对其赋值。
- P201页
- 字符串比较规则是指依次比较相对应字符的ASCII码,并返回两个字符的差,而不是比较两个字符串的长度
- 指针数组存放的是指针,这些指针指向各个字符串
单选题
填空题
4-1
#include <stdio.h>
int main(void)
{
int a[10], b[10], *pa, *pb, i;
pa = a;
pb = b;
for( i=0; i<3; i++, pa++, pb++){
*pa = i;
*pb = 2*i;
}
pa = &a[0];
pb = &b[0];
for ( i=0; i<3; i++,pa++,pb++){
*pa = *pa + i;
*pb = *pb + i;
}
printf("%d %d", *--pa, *--pb); /* 输出的数字之间有一个空格 */
return 0;
}
写出下列程序的执行结果:
4 6
分析:
4-2
4-3
p+5指向e,遇到\0结束打印
4-4
4-5
程序填空题
- 5-1
- 5-35
5-2
#include <stdio.h>
#include <string.h>
int main(void)
{
//初始化//
char s[80], ch, *p, *q;
int i, j, n;
gets(s);
p = s (1分);
//消除输入字符串的前后空格//
while ( *p == ' ') p++ (1分);
n = strlen(s);
q = s+n-1(1分) ;
while ( *q == ' ') q--(1分) ;
//判断是否是“回文”//
while (p<q (1分) && *p ==*q)
{
p++;
q--(1分);
}
if ( p<q )
printf("NO\n");
else
printf("YES\n");
return 0;
}
如果字符串前后有空格,则经过第一个while后p指向第一个非空格的字符,同理,经过第二个while后q指向最后一个非空格的字符,这样就实现了消除字符串的前后空格
*通过指针p和q的依次移动来判断回文,当通过p>=q退出循环时,判断为回文字符串,当通过*p!=q退出循环时,p<q,不是回文字符串
- 5-3
- 5-4
- 5-5
突破点在于要求每传送三个字符后再存放一个空格
for循环里的语句将a中的字符依次传到数组b中
而 if 内的语句用来实现每传送三个字符后再存放一个空格
当实现传送完三个字符后,由于for循环里的语句执行完后i++,因此这时候i=4,此时要进行存放空格的操作,
故可得出第二个空填==(i-1)%3 == 0==,第一个空填上==(i-1)%3!=0==
此时考虑特殊情况i=1时,由题意要进行传字符而不是放空格的操作,所以第一个空补充为==(i-1)%3 == 0 || i-1 == 0==
函数题
6-4
# include <stdio.h>
void month_day ( int year, int yearday, int * pmonth, int * pday);
int main (void)
{
int day, month, year, yearday; /* 定义代表日、月、年和天数的变量*/
scanf ("%d%d", &year, &yearday );
month_day (year, yearday, &month, &day );/* 调用计算月、日函数 */
printf ("%d %d %d\n", year, month, day );
return 0;
}
/* 请在这里填写答案 */
void month_day (int year,int yearday,int *pmonth,int *pday)
{
int k,leap;
int tab[2][13]={
{
0,31,28,31,30,31,30,31,31,30,31,30,31},
{
0,31,29,31,30,31,30,31,31,30,31,30,31}
};
leap=(year%4==0&&year%100!=0)||year%400==0;
for (k=1;yearday>tab[leap][k];k++)
yearday-=tab[leap][k];
*pmonth=k;
*pday=yearday;
}
6-1
#include <stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );
int main()
{
float a, b, sum, diff;
scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
return 0;
}
/* 你的代码将被嵌在这里 */
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
6-3 利用指针找最大值
#include <stdio.h>
void findmax( int *px, int *py, int *pmax );
int main()
{
int max, x, y;
scanf("%d %d", &x, &y);
findmax( &x, &y, &max );
printf("%d\n", max);
return 0;
}
/* 你的代码将被嵌在这里 */
void findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
*pmax=*px;
else
*pmax=*py;
}
6-3
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else
printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
int search( int list[], int n, int x )
{
int i;
for (i=0;i<n;i++)
if (list[i]==x){
return i;
break;
}
if (i==n)
return -1;
}
6-5
#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;
}
/* 你的代码将被嵌在这里 */
bool palindrome( char *s )
{
int n;
n=strlen(s);
int i=0,k=n-1;
while(i<k){
if(s[i]!=s[k])break;
i++;k--;
}
if(i>=k)return true;
else return false;
}
6-6 数组循环右移
a0 | a1 | a2 | a3 | … | … | … | … | an-2 | an-1 |
数组循环右移即每一个数组元素都向右移m个单位
- 算法思路:
先考虑:如何实现每个数组元素向右移一个单位?
从数组的最后一项开始,依次将每前一项的值赋给后一项,为了避免丢掉最后一项a[n-1]的数据,我们可以将a[n-1]这一项copy到一个变量temp中,当每次赋值完成后,a[1]中即为a[0]的值,然后我们可以再将temp中存放的a[n-1]的值赋值给a[0],这样就实现了每个数组元素都向右移一个单位 ^__ ^
an-1 | a0 | a1 | a2 | … | … | … | … | an-3 | an-2 |
于是我们想:
st=>start: 如果要右移m个单位
op=>operation: 进行m次上述循环
st(right)->op
- 具体代码实现:
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
int ArrayShift( int a[], int n, int m )
{
int i;
int k;
for(k=1;k<=m;k++)
{
int temp=a[n-1];
for(i=n-1;i>0;i--)
{
a[i]=a[i-1];
}
a[0]=temp;
}
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4269854/blog/4832814