2018年3月份的PTA(一)

写程序证明p++等价于(p)++还是等价于*(p++)?


由程序说明p++等价于(p)++,因为(p++)在程序中是没有地址的,而输出中p++和(*p)++的地址不同是由于在线C语言开发环境地址是动态的

C高级第一次PTA作业(1)

题目6-1 计算两数的和与差

1.设计思路

(1)算法:(子函数)

第一步:子函数的声明,子函数名sum_diff,定义输入的两个实属的形参op1,op2,以及两个实数和与差的变量对应的指针型变量的形参psum,pdiff
第二步:在子函数中使用间接访问运算符*,访问两实数和与差的地址即对应的变量,用形参计算和与差

(2)流程图

2.实验代码

#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;
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:编译错误,在子函数中计算和与差时,用的形参变量是主函数的变量
改正方法:将子函数中的a,b改成op,op2
错误信息2:

错误原因:子函数中计算差时多想了,考虑了差为负数,自行加了一个绝对值
改正方法:将绝对值去掉

题目6-2 拆分实数的整数与小数部分

1.设计思路

(1)算法(子函数)

第一步:定义子函数名字splitfloat,定义实数x的形参单精度型x,实数x的整数部分地址的形参指针型intpart,实数x小数部分地址的形参指针型fracpart
第二步:间接访问实数x的整数部分是强制实数x为整型的值,间接访问实数x的小数部分是实数x减去强制实数x为整型值的差

(2)流程图

2.实验代码

#include <stdio.h>
void splitfloat( float x, int *intpart, float *fracpart );
int main()
{
    float x, fracpart;
    int intpart;
    scanf("%f", &x);
    splitfloat(x, &intpart, &fracpart);
    printf("The integer part is %d\n", intpart);
    printf("The fractional part is %g\n", fracpart);
    return 0;
}
void splitfloat(float x,int *intpart,float *fracpart)
{
  *intpart=int(x);
  *fracpart=x-int(x);
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:进行强制类型转换时,在变量x上加了括号,类型int上没加括号
改正方法:将括号加在类型int上,变量x上的括号去掉

C高级第一次PTA作业(2)

题目6-1 在数组中查找指定元素

1.设计思路

(1)算法(子函数)

第一步:定义整型子函数名search,定义形参数组list[],数组长度n,待找数x
第二步:设置指针型循环变量i的初值为数组首元素的地址,循环条件为循环变量i在数组地址的范围内
第三步:判断地址i对应的数是否为待找的数x,若是则返回对应增加的sizeof的个数,否则继续循环
第四步:若循环结束还未有返回值则返回-1

(2)流程图

2.实验代码

#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)
{
  for(signed int *i=list;i<list+n;i++)
  {
    if(*i==x)
    return i-list;
  }
  return -1;
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:把主函数的变量a胡乱放在子函数中使用了,形参list是一个不变的地址,错误地直接把list当作循环变量了
改正方法:重新定义指针型循环变量i,使它的初值为数组首元素的地址,把a改成形参list,list改成i

题目6-2 找最大值极其下标

1.设计思路

(1)算法(子函数)

第一步:定义子函数名fun,形参整型指针型a、b,整数n
第二步:a=>max,定义整型指针型循环变量i等于a+1
第三步:若i<a+n,则下一步,否则返回max
第四步:若
i>max,则I=>max,i-a=>a,i<=i+1,跳到第三步

(2)流程图

2.实验代码

#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;
}
int fun(int *a,int *b,int n)
{
  int max=*a;
  for(signed int *i=a+1;i<a+n;i++)
  if(*i>max)
  {
    max=*i;
    *b=i-a;
  }
  return max;
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:在定义循环变量i时,将循环变量i定义成整型而不是指针型,导致进行循环时间接访问的不是地址
改正方法:将循环变量i定义成指针型

C高级第一次PTA作业(3)

题目 6-1 最小数放前最大数放后

1.设计思路

(1)算法(子函数)

第一步:定义子函数名intput,形参整型指针型arr,整型n
第二步:循环变量i<=0
第三步:若i<数组长度n,则下一步,否则返回主函数
第四步:输入*(arr+i),i<=i+1,跳到第三步

第一步:定义子函数名max_min,形参整型指针型arr,整型n
第二步:arr=>MAX,arr=>MIN,整型循环变量1=>i
第三步:若i<n,则下一步,否则跳到第五步
第四步:若(arr+i)>MAX,则(arr+i)=>MAX,i=>max,若(arr+i)<MIN,则(arr+i)=>MIN,i=>min,i<=i+1,跳到第三步
第五步:交换(arr+min)和arr,交换(arr+max)和(arr+n-1)

第一步:定义子函数名output,形参整型指针型arr,整型n,整型循环变量i<=0
第二步:若i<n,则下一步,否则返回主函数
第三步:输出*(arr+i),i<=i+1,跳到第二步

(2)流程图

2.实验代码

#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ 
	int a[10];
	input(a,10);
	max_min(a,10);
	output(a,10);
	return 0;
}
void input(int *arr,int n)
{
  for(signed short int i=0;i<n;i++)
  scanf("%d",arr+i);
}
void max_min(int *arr,int n)
{
  short int MAX=*arr,MIN=*arr,swap,max,min;
  for(signed short int i=1;i<n;i++)
  {
    if(*(arr+i)<MIN)
    {
      MIN=*(arr+i);
      min=i;
    }
  }
  swap=*(arr+min);
  *(arr+min)=*arr;
  *arr=swap;
  for(signed short int i=1;i<n;i++)
  {
    if(*(arr+i)>MAX)
    {
      MAX=*(arr+i);
      max=i;
    }
  }
  swap=*(arr+max);
  *(arr+max)=*(arr+n-1);
  *(arr+n-1)=swap;
}
void output(int *arr,int n)
{
  for(signed short int i=0;i<n;i++)
  printf("%3d",*(arr+i));
}

3.本题调试过程碰到问题及解决办法

本题无错误信息

题目6-2 指针选择法排序

1.设计思路

(1)算法(子函数)

第一步:定义子函数名sort,形参整型指针型x,整型n
第二步:整型指针型循环变量i<=x,j,整型指针型k
第三步:i赋给k,i+1=>j
第四步:若j<x+n,则跳到第六步,否则下一步,若k<j,则j赋给k,否则下一步
第五步:j+1=>j,跳到上一步
第六步:交换k和i,i+1=>i,若i<x+n-1,则跳到第三部,否则返回主函数

(2)流程图

2.实验代码

#include<stdio.h>
void sort(int *x,int n);
int main ( )
{
	int *p,i,a[10];
	p=a;
	for (i=0;i<10;i++)  scanf("%d",p++);
	p=a;
	sort(a,10);
	for(i=0;i<10;i++)  printf("%4d",*p++);
	printf("\n");
	return 0;
 }
void sort(int *x,int n)
{
  for(signed int *i=x;i<x+n-1;i++)
  {
    short int *k=i;
    for(signed int *j=i+1;j<x+n;j++)
    if(*k<*j)
    k=j;
    int swap;
    swap=*i;
    *i=*k;
    *k=swap;
}

3.本题调试过程碰到问题及解决办法

本题无错误信息

C高级第一次PTA作业(4)

题目6-1 判断回文字符串

1.设计思路

(1)算法(子函数)

第一步:定义子函数名palindrome,形参字符指针型s
第二步:整数N为字符串s的长度,循环变量i<=0,j<=N-1
第三步:若j>=N/2,则下一步,否则跳到第五步
第四步:若(i+s)不等于(j+s),返回false,否则j-1=>j
第五步:i+1=>i,若i<=N/2,跳到第三步,否则返回true

(2)流程图

2.实验代码

#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)
{
  short int N=strlen(s);
  short int i=0,j=N-1;
  for(;i<=N/2;i++)
  while(j>=N/2)
  if(*(i+s)!=*(j+s))
  return false;
  else
  {
    j--;
    break;
  }
  return true;
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:把主函数的实参sp当子函数的形参s用了,循环变量定义成了指针型,但是赋了一个整数值,不是地址
改正方法:把sp改成s,循环变量改成整型
错误信息2:

错误原因:两次for循环把前半部分的字符和后半部分的每一个字符都进行比较了,所以第二轮就返回false
改正方法:把内循环改成while循环,这样每次循环的时候就确保第几个字符和倒数第几个字符比较了
错误信息3:

错误原因:循环条件当遇到字符的长度是偶数的时候,中间的两个数没有在范围内,导致没有比较到
改正方法:在循环条件上都加一个等号

题目6-2 使用函数实现部分字符串复制

1.设计思路

(1)算法(子函数)

第一步:定义子函数名strmcpy,形参字符指针型t,整型m,字符指针型m
第二步:若m>主函数数组长度MAXN,则'\0'=>s,否则下一步
第三步:循环变量i<=m-1,j<=0
第四步:若i<MAXN,则返回下一步,否则返回主函数
第五步:
(s+j)<=(t+i),(t+i+1)<='\0',i+1=>i,j+1=>j,返回上一步

(2)流程图

2.实验代码

#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
    char t[MAXN], s[MAXN];
    int m;
    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);
    return 0;
}
void strmcpy(char *t,int m,char *s)
{
  short int i=m-1,j=0;
  if(m>MAXN)
  *s='\0';
  else
  {
    for(i=m-1,j=0;i<MAXN;i++,j++)
    *(s+j)=*(t+i);
    *(t+i+1)='\0';
  }
}

3.本题调试过程碰到问题及解决办法

错误信息1:

错误原因:循环变量i,j在循环初值中设定的,只适用于for循环,在子函数的语句中无法使用
改正方法:将循环变量的定义放在子函数的范围内

额外加题3

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char code;
	do
	{
		code=getchar();
		if(code=='z')
		code='b';
		else if(code=='y')
		code='a';
		else if(code<='x'&&code>='a')
		putchar(code);
	}
	while(code!='\n'||code!='\0');
	system("pause");
	return 0;
}

学习总结和进度

总结知识点:

这周主要指针的定义、使用,数组指针的使用,字符串的使用,间接访问符号,指针型的变量就是一个地址,地址存放的是一个变量的值,通过指针变量间接访问可以实现在子函数中直接改变指针变量指向的变量的值,在写代码的时候容易把主函数的变量当作子函数的变量使用,出现编译错误,要用到地址的变量没设置成指针型,这是几个容易犯的错误。

git地址:https://github.com/MemoriesBook/C-PTA-.git

董欣

董雅洁

冯子旋

日期 代码时间 代码行数 博客时间 博客行数
3.12 0 0 0 0
3.13 0 0 0 0
3.14 6 3 25 17
3.15 11 5 0 0
3.16 0 0 0 0
3.17 0 0 0 0
3.18 9 7 19 24
3.19 17 21 0 0
3.20 0 0 0 0
3.21 0 0 0 0
3.22 12 8 31 40
3.23 48 19 45 86
3.24 0 0 0 0
3.25 0 0 0 0
posted @ 2018-03-25 22:44  這是記憶中的一本書!  阅读(720)  评论(8编辑  收藏  举报