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

第三步:若iI=>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

第一步:定义子函数名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)>MAX)
    {
      MAX=*(arr+i);
      max=i;
    }
    if(*(arr+i)<MIN)
    {
      MIN=*(arr+i);
      min=i;
    }
  }
  swap=*(arr+min);
  *(arr+min)=*arr;
  *arr=swap;
  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

第三步:i+1=>j

第四步:若j<x+n,则跳到第六步,否则下一步,若i<j,则交换

第五步:j+1=>j,跳到上一步

第六步: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++)
  for(signed int *j=i+1;j<x+n;j++)
  if(*i<*j)
  {
    int swap;
    swap=*i;
    *i=*j;
    *j=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

原文地址:https://www.cnblogs.com/lixiaojing/p/8550974.html

时间: 2024-10-06 04:44:16

2018年3月份的PTA(一)的相关文章

cocopods 镜像源更新 时间 2018年07月份

注意:本次更镜像源地址新时间为2018年07月份左右 如果您阅读本文章的时间与此时间相差太久.则可能没有参考价值. pod 的国内镜像源由原来的 https://gems.ruby-china.org 变更为  https://gems.ruby-china.com 变更的时间应该在 2018年07月份左右.如果你的pod无法更新很可能需要修改镜像源. 在命令行中输入以下代码更换数据源 1. 更换数据源 $ gem sources --add https://gems.ruby-china.co

2018年3月底的PTA(二)

C高级第二次PTA作业(1) 题目6-7 删除字符串中数字字符 1.设计思路 为了偷懒,本题算法和流程图是精简代码后的,具体请看本题实验代码的第二段代码. (1)算法(子函数) 第一步:定义子函数类型void.名delnum,形参字符指针型s. 第二步:整数i(用作循环变量),整数j(用来做新的字符数组的下标),将0赋给i,将0赋给j. 第三步:若地址s+i中的字符为结束符则跳到第四步,否则下一步. 第四步:若地址s+i中的字符在0到9之间则i+1赋给i,跳到上一步,否则地址s+i中的字符赋给地

2018年5月份日志

日期 事情 详情 2018年5月2日  定向采购二期需求:采购合同品种和销售订单品种合并或相互约束      定向采购二期需求:直接成品入库      报损报溢:更新库存采取报溢则生成入库单,报损则生成出库单                                                                                                                                                  

2018年5月份

react-native 快递流程图 https://github.com/24ark/react-native-step-indicator Class.forName 与 ClassLoader.loadClass 相关问题浅析 https://blog.csdn.net/u011116672/article/details/77823867 大厂App 性能分析与优化方案研究 https://mp.weixin.qq.com/s/Olgy26LTtonEQ63d3TjWIQ https:/

最新2018年6月份Wordpress通杀全版本漏洞 详情及利用方法

2018年6月29日,wordpress爆出最新漏洞,该网站漏洞通杀所有wordpress版本,包括目 前的wordpress 4.8.6 以及wordpress 4.9.6版本.可以删除网站上的任意文件,影响危害严重, 甚至是致命的一个漏洞,如果被攻击者利用,后果将不堪设想.截止目前该漏洞还未有被修复, 如果您在使用wordpress,请尽快将wp-includes文件夹下的post.php文件改名,等官方出 wordpress漏洞补丁后,再改回并升级. wordpress是许多站长以及建站公

2018年6月份Android上海找工作经历

前言首先介绍一下我的经历:本人 14 年毕业,在学校里面自学 Android 开发,在 cz 呆了三年,小城市,IT 不发达,倒闭了 2 家公司,然后杭州谋求发展,可参考以前写的一篇求职文章<杭州找Android工作的点点滴滴>,呆了一年,又倒闭了,哎,一言难尽呐!上个月,也就是 6 月份从杭州来到了上海,满打满算找工作到确认去这家公司用了二个星期.从 5 月份离职,中间去成都重庆玩了一个星期,然后在家又呆了二个星期,最后 6 月 11 号才开始找工作,在上海每天安排 2 场面试,有时候面试

2018年2月份

Jsoup解析Html中文文档 http://www.cnblogs.com/jycboy/p/jsoupdoc.html elastic-job详解系列 http://www.cnblogs.com/haoxinyue/category/1010567.html React-Native采坑小结 z-index  zIndex bug问题 https://www.cnblogs.com/star91/p/ReactNative-jin-qi-cai-keng-xiao-jie.html 获取通

2018年4月份

「驭龙」开源主机入侵检测系统了解一下 https://mp.weixin.qq.com/s/kzeAEvz-ejLD71fgb5t8tA 用java创建你的第一个区块链(第一部分) http://mp.weixin.qq.com/s/I2NOUTRmTPztReo-WFt6Pw Java 相关的知识点 https://segmentfault.com/a/1190000014128432 https://github.com/crossoverJie/Java-Interview Netty事件

关于Angular官网《英雄指南》教程几点问题修正(此问题在2018年4月份有效,以后可能就订正了)

1.官网中在导入"of"关键字时的引用为: import { Observable, of } from 'rxjs'; 应该改为: import { Observable } from 'rxjs/Observable'; import { of } from 'rxjs/observable/of'; 2.在第8节的HTTP中,需要导入angular2-in-memory-web-api包,此时系统会默认导入最新包,为0.6.0: 但是此时Angular中@angular/comm