PTA 8习题讲解

六眼飞鱼酱① 提交于 2020-12-23 13:42:32

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

分析:

Created with Raphaël 2.2.0 定义数组a和b 令pa指向a,pb指向b 判断i是否小于3 *pa=i;*pb=2*i; i++,pa++,pb++ 令pa指向a的第一个元素,pb指向b的第一个元素 判断i是否小于3 *pa = *pa + i;*pb = *pb + i; i++,pa++,pb++ 依次输出*--pa,*--pb 结束 yes no yes no

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!