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 |
2018年3月份的PTA(一)的更多相关文章
- 2018年10月份编程语言排行榜(来自TIOBE Index for October 2018)
TIOBE Index for October 2018 from:https://www.tiobe.com/tiobe-index// October Headline: Swift is kno ...
- 2018秋寒假作业6—PTA编程总结3
1.实验代码 7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T) ...
- 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)
要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号 那么如何申请Office ...
- 2018年3月底的PTA(二)
C高级第二次PTA作业(1) 题目6-7 删除字符串中数字字符 1.设计思路 为了偷懒,本题算法和流程图是精简代码后的,具体请看本题实验代码的第二段代码. (1)算法(子函数) 第一步:定义子函数类型 ...
- OpenStack keystone节点搭建(官方2018年4月份文档)
参考文档:https://docs.openstack.org/install-guide/common/conventions.html https://docs.openstack.org/mit ...
- 2018秋寒假作业5—PTA编程总结2
1.实验代码: 7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌&qu ...
- 2018年12月份GitHub上最热门的Java开源项目
来自:开源最前线(ID:OpenSourceTop) 链接:https://www.itcodemonkey.com/article/12747.html 又到了公布 GitHub 上热门项目的时候啦 ...
- SNF框架及机器人2018年1-9月份升级内容
1月 增加评星控件.年月选择控件 完善表格弹框的封装,增加多选弹框 的封装 增加表格 单元格合并.列头必填与可填写的标识 4月 关于分页查询和排序的各种修改(扶额) 导入excel优化 bs计算合计的 ...
- 2018秋寒假作业4—PTA编程总结1
7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...
随机推荐
- [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...
- [Luogu2073]送花
题面 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地 ...
- 【MyBatis源码分析】Configuration加载(下篇)
元素设置 继续MyBatis的Configuration加载源码分析: private void parseConfiguration(XNode root) { try { Properties s ...
- wpf研究之道——自定义Button控件
我们知道WPF中普通的按钮,长得丑,所以自定义按钮,在所难免.我们给按钮添加 MoveBrush,EnterBrush两把刷子,其实就是鼠标经过和鼠标按下的效果.只不过这不是普通的刷子,而是带图片的I ...
- Android Studio 封装的类的继承
有个封装好的Firebase.java文件,放到项目中直接使用就可以,这个需要继承一个AbstractFirebase类,在广告代码中,可以等到加广告的时候来加这个文件. 这个地方的继承,因为是ads ...
- lambda表达式封装对数据库的查询
前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询, ...
- lvm创建卷组和格式化
* 前提条件:/dev/sdb为一块空的硬盘 * 创建物理卷:pvcreate /dev/sdb * 创建卷组:vgcreate vol_name /dev/sdb (vol_name 为卷组名字) ...
- ubuntu字符界面怎么设置中文显示和中文输入
在ubuntu的字符登陆界面,中文显示默认是乱码的,而且也不支持中文输入,解决方法有很多, 1)安装zhcon--解决中文显示乱码的问题. sudo apt-get install zhcon 然后c ...
- 如何恢复(初始化)android studio所有设置
android studio是个大家伙,安装的时候经常出现一些问题,使用的时候也经常出现一些问题,如果,我是说如果,当你遇见一些问题不能解决的时候,可以试试重置android studio来解决问题, ...
- postgresql和oracle数据库对比
SQL执行计划干预 从使用postgresql来看,想要改变执行计划只能通过対表进行分析,不能通过添加hint的方式来改变执行计划: oracle不仅可以通过对表进行收集统计来改变执行计划,而且很重要 ...