写程序证明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

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

  1. 2018年10月份编程语言排行榜(来自TIOBE Index for October 2018)

    TIOBE Index for October 2018 from:https://www.tiobe.com/tiobe-index// October Headline: Swift is kno ...

  2. 2018秋寒假作业6—PTA编程总结3

    1.实验代码 7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T) ...

  3. 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

    要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号   那么如何申请Office ...

  4. 2018年3月底的PTA(二)

    C高级第二次PTA作业(1) 题目6-7 删除字符串中数字字符 1.设计思路 为了偷懒,本题算法和流程图是精简代码后的,具体请看本题实验代码的第二段代码. (1)算法(子函数) 第一步:定义子函数类型 ...

  5. OpenStack keystone节点搭建(官方2018年4月份文档)

    参考文档:https://docs.openstack.org/install-guide/common/conventions.html https://docs.openstack.org/mit ...

  6. 2018秋寒假作业5—PTA编程总结2

    1.实验代码: 7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌&qu ...

  7. 2018年12月份GitHub上最热门的Java开源项目

    来自:开源最前线(ID:OpenSourceTop) 链接:https://www.itcodemonkey.com/article/12747.html 又到了公布 GitHub 上热门项目的时候啦 ...

  8. SNF框架及机器人2018年1-9月份升级内容

    1月 增加评星控件.年月选择控件 完善表格弹框的封装,增加多选弹框 的封装 增加表格 单元格合并.列头必填与可填写的标识 4月 关于分页查询和排序的各种修改(扶额) 导入excel优化 bs计算合计的 ...

  9. 2018秋寒假作业4—PTA编程总结1

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...

随机推荐

  1. [mysql] 2进制安装和简单优化

    ##################################mysql 2进制安装和简单优化################################################## ...

  2. [BZOJ1707] [Usaco2007 Nov] tanning分配防晒霜 (贪心)

    Description 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SP ...

  3. iOS开发--XMPPFramework--用户登录(三)

    创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~ 我们在第一篇文章中,已经介绍了Openfire服务器的搭建等环境的配置, 第二篇文章中,导入了XMPPFra ...

  4. Couldn't save uncommitted changes.

    关于idea切换分支报错的问题. Couldn't save uncommitted changes. Tried to save uncommitted changes in stash befor ...

  5. TC命令流量控制测试(针对具体IP和具体进程)

    TC命令流量控制测试 这里测试系统为Linux操作系统,通过简单的TC命令来实现对带宽的控制. 1对具体IP地址的流量控制 这里采用iperf来进行带宽的测试,首先在服务器和客户端都安装上iperf软 ...

  6. SQL语句的学习理解

    1.手电筒当天下载自定义活跃: SELECT user_dim.app_info.app_instance_id FROM [flashlight35-6aae4:com_scroll_sos_fla ...

  7. 九大排序算法的Java实现

    1.冒泡排序 package Sort; import java.util.Arrays; public class BubbleSort { public static void main(Stri ...

  8. 让wordpress标签云显示文章数的正确方法

    先看一下效果 在百度经验找到一个教程,可惜,根据实践发现方法是错误的, 百度经验上的代码: 1 2 3 4 5 6 7 8 9 10 11 12 //标签tag所包含的文章数量 function Ta ...

  9. canvas 绘制图形

    canvas 绘制图形: 注意: canvas 的宽高设置在行内,否则会使画布(canvas)产生扭曲,绘图变形: <!DOCTYPE html> <html lang=" ...

  10. Kotlin——从无到有系列之高级篇(一):Lambda表达式

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 经过前面一系列对K ...