要求一:完成PTA作业
答:作业已经完成!
要求二:pta作业编程题目的解题思路和调试过程记录
C高级语言第一次作业(1)
完成情况如图:
题目一:计算两个数的和与差
1.设计思路:
(1)算法:
第一步:看主函数部分。通过主函数可得输入两个浮点型变量a,b,然后经过函数(sum_diff(a, b, &sum, &diff))调试之后,输出两个数的和(sum)与差(diff);
第二步:看函数变量。根据题目流程可看出是把a赋值给op1,b赋值到op2,&sum赋值到psum,&diff赋值到pdiff(注意:函数里的psum,pdiff为指针变量);
第三步:写函数部分的代码。根据题目要求,两个数的和为psum=op1+op2,两个数的差为pdiff=op1-op2。
提示:float psum,floatpdiff是定义和与差的指针变量,单写psum,pdiff是指和与差的值。
(2)流程图:
主函数:
调用函数:
2.实验代码:
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
3.本题调试过程碰到问题及解决的办法:
本题在调试过程中未遇到错误。
题目二:拆分实数的整数与小数部分
1.设计思路:
(1)算法:
第一步:看主函数部分。定义x, fracpart为浮点型变量,intpart为整型变量(题目中fracpart是小数部分,intpart是整数部分),然后输入x(x为一个实数),经过函数(splitfloat(x, &intpart, &fracpart))调试之后,输出整数部分和小数部分的值;
第二步:看函数变量。根据题目流程可看出是x赋值给x,&intpart赋值给intpart, &fracpart赋值给fracpart(注意:函数里的intpart,fracpart为指针变量);
第三步:写函数部分的代码。根据题目要求,把一个实数强制转化为int型得到整数部分,然后用实数减去整数部分即得到了小数部分。
提示:int intpart, float fracpart 是定义整数与小数的指针变量,单写intpart, fracpart是指整数,小数的值。
(2)流程图:
主函数:
调用函数:
2.实验代码:
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
3.本题调试过程碰到问题及解决的办法:
本题在调试过程中未遇到错误。
C高级语言第一次作业(2)
完成情况如图:
题目一:在数组中查找指定元素
1.设计思路
(1)算法:
第一步:看主函数部分。通过主函数可得定义 i, index, n, x,a[10]为整型(题目定义了MAXN为10),然后输入n(n是list[]中元素的个数),for循环输入数组,再输入x(x是待查找的元素),通过函数得出index的值,若index不为-1,则输出index
的值,否则输出Not found;
第二步:看函数变量。把a赋值给list[],n、x赋值给n、x;
第三步:写函数部分的代码。在函数中定义a为整型变量,根据题目要求,需知使得若x等于list[a],则返回a的值,若没有,则使index为-1。
(2)流程图:
主函数:
调用函数:
2.实验代码:
int search( int list[], int n, int x )
{
int a;
for(a=0;a<n;a++){
if(list[a]==x){
return a;}
}
return -1;
}
3.本题调试过程碰到问题及解决的办法:
本题问题
解决办法:发现我设的是a,不是i,结果误把a写为了i,改正即可。这提示我在写题时不要马虎!
题目二:找最大值及其下标
1.设计思路:
(1)算法:
第一步:看主函数部分。通过主函数可得定义 a[10],i,max,p为整型变量,p=10,然后输入a[0]~a[9]的值,经过函数(fun(a,&p,N))调用,得到最大值max及下标p的值;
第二步:看函数变量。fun(a,&p,N)中的变量赋值给int fun(int a,int b,int n)中的变量;
第三步:写函数部分的代码。求最大值及其下标的方法就是先令a[0]是最大值,然后循环数组里的数字,与max比较大小,如果比max大,则把这个数赋给max,再把其相应下表写出即可。
提示:在本题中,函数里的a为数组的第一个值的地址,则a为数组a[0]的值,(a+i)则为a[i]的值。另外,该代码中不要忘记return max,把max的值返回到主函数中。为什么不用返回下标的值呢?因为最开始是把下标的地址赋给b,b则为b的值(b的地址里存的数),在要求写的代码中,把i的值赋值给b,即b地址里存的数为i,因此不用返回i的值。
(2)流程图:
主函数:
调用函数:
2.实验代码:
int fun(int *a,int *b,int n)
{
int i,max=*a;
for(i=0;i<n;i++){
if(*(a+i)>max){
max=*(a+i);
*b=i;
}
}
return max;
}
3.本题调试过程碰到问题及解决的办法:
本题问题:
没写返回值return max;
解决办法:补上即可。
C高级语言第一次作业(3)
完成情况如图:
题目一:最小数放前最大数放后
1.设计思路
(1)算法:
本题里有三个函数。从简单的开始。
第一步:第一个函数的作用就是输入一个10个数字的数组,第三个函数是输出这个数组。这两个函数都是用for循环输入输出。
第二步:我觉得第二个函数是本题考察的重点。我把这个函数要做的事情分为两个部分。
第一是找最最值,第二是移动最值。其中找最值我设了两个数max,min,把这两个数等于a[0],再和数组中的数进行比较。把比max大的数赋值给max,比min小的数赋值给min。
第二是移动。就用车老师当年第一节课说的交换杯子里的水的办法交换二者。这里要注意的是是数组中两个数进行交换,在交换的时候要把最大最小值的下标i(设数组的下标为i)赋值给其他数,否则你在赋值的时候下标的i只能是最后一位(因为有i++)。
(2)流程图:
主函数:
调用函数:
①input(int arr,int n)函数
②max_min(int arr,int n)函数
③output(int *arr,int n)函数
2.实验代码:
void input(int *arr,int n)
{
int i;
for(i=0;i<=9;i++){
scanf("%d",&arr[i]);
}
}
void max_min(int *arr,int n)
{
int max,min,i,t,c,d;
max=arr[0];
min=arr[0];
for(i=0;i<=9;i++){
if(arr[i]>=max){
max=arr[i];
c=i;
}
}
t=arr[c];
arr[c]=arr[9];
arr[9]=t;
for(i=0;i<=9;i++){
if(arr[i]<=min){
min=arr[i];
d=i;
}
}
t=arr[d];
arr[d]=arr[0];
arr[0]=t;
}
void output(int *arr,int n)
{
int i;
for(i=0;i<=9;i++){
printf("%3d",arr[i]);
}
}
3.本题调试过程碰到问题及解决的办法:
本题问题:
在做这道题的时候,交换数字时没把i赋值给其它变量,而是直接用max,min和首末位置互换,从而使得数组中出现两个一样的最值情况(原本没有)
解决办法:
找到问题,把i赋值给c,d,更正完毕,正确。
题目二:指针选择法排序
1.设计思路
(1)算法:
本题的算法就是选择排序法。选择排序法就是选择出最大或最小放第一个位置,次大或次小放第二个位置,其它同理。而具体做法就是让第一个数与后面的比较,找到比第一个位置的数大或小(看升序还是降序)的时候,从那个大的或小的数的位置继续与其他的比较,直到找出最大或最小,再和第一个数交换位置,之后就从第二个人数继续下去,直到排序成功。
第一步:设 i,j,t,temp为int型变量;
第二步:写for循环,第一个循环是趟数,第二个是比较。如果(x+t)<(x+j)成立,则把i赋值给t;
第三步:找到最值后交换。
(2)流程图:
主函数:
调用函数:
2.实验代码:
void sort(int *x,int n)
{
int i,j,t,temp;
for(i=0;i<n-1;i++)
{
t=i;
for(j=i+1;j<n;j++)
{
if(*(x+t)<*(x+j))
t=j;
}
temp=*(x+i);
*(x+i)=*(x+t);
*(x+t)=temp;
}
}
3.本题调试过程碰到问题及解决的办法:
本题问题:
本题问题在于不会选择排序法,没有头绪,然后上网查了选择排序法,也懂了是怎样一回事,心得在算法上。
解决办法:
上网百度,写下心得。
C高级PTA第一次作业(4)
完成情况如图:
题目一:判断回文字符串
1.设计思路
(1)算法:
本题是看是否为回文。回文是abba或者abcba的格式。方法是先求出一个字符串有多少个字符(strlen()就是查多少字符用的,但不包括\0)然后数组中首尾相比(用for循环写出数组)如果不相等,则不是回文,如果相等,继续比较第二个和倒数第二个,以此类推,如果从头往后的数组的位数大于从后往前的数组的位数,那么跳出循环。如果最后真的从头往后的数组的位数大于从后往前的数组的位数,那么是回文。
第一步:定义i,j,n为整形变量;
第二步:求出数组s中的字符个数记为n;
第三步:j=n-1,j为数组下标;
第四步:写出for循环,在for循环里比较s[i]与s[j],如果不相等,则跳出循环。相等就继续下去,直到循环结束;
第五步:循环结束后,判断i和j的大小,若i>j,则是回文,否则不是回文。
(2)流程图:
主函数:
调用函数:
2.实验代码:
bool palindrome( char *s )
{
int i,j,n;
n=strlen(s);
j=n-1;
for(i=0;i<j;i++,j--)
{
if(s[i]!=s[j]){
break;
}
}
if(i>=j){
return true;
}
}
3.本题调试过程碰到问题及解决的办法:
本题问题:
解决办法:
经检查发现if语句内容括多了,应该只有判断s[i]与s[j]的关系,若不相等就跳出循环这一点,改正后答案正确。
题目二:使用函数实现字符串部分复制
1.设计思路
(1)算法:
第一步:先测出被复制的数组的长度,然后把整个数组复制到新的数组上;
第二步:用for循环,第一个gor循环是说明从那个字符开始,内部嵌套的for循环是从这个字符开始直到结束的字符整体前移(前移是(s+j-1)=(s+j)做到的);
第三步: *(s+k-m+1)='\0',在得到的新数组后加'\0'。
(2)流程图:
主函数:
调用函数:
2.实验代码:
void strmcpy( char *t, int m, char *s )
{
int i,j,k;
k=strlen(t);
strcpy(s,t);
for(i=m-1;i>0;i--){
for(j=i;j<k;j++){
*(s+j-1)=*(s+j);
}
}
*(s+k-m+1)='\0';
}
3.本题调试过程碰到问题及解决的办法:
本题问题:
本题一点头绪都没有。
解决办法:
上网查找了答案,认真分析后,自己又在电脑上敲出来的。
要求三:学习总结和进度
1、总结两周来所有PTA作业中每个题目所使用的知识点。
分享:几种表达方式的区别:
这两周主要学了指针,指针与数组,指针与字符数组,在PTA作业习题中均有体现。这些知识点在课本上都有,我主要说一下习题的知识点。
在作业一中,我一遍过,觉得很简单。这里需要注意的是怎样把一个浮点数强制转化为整数型。就是类似于(int)x这样(若x是浮点型)。
在作业二中,第一个是看是否有list[a]等于x,第二个要注意找到最大值的方法。即先设最大值等于a[0],然后与数组中其他数比较大小,如果有比其大的,就把那个数赋值给所设的最大值,直到得到真的最大值。
在作业三中,第一题找最值的方法与作业二一样,主要是交换数组中的数的时候,要记得把循环里的那个i(i为数组的下标)赋值给一个新设的变量,要不然在做题的时候,i值是会随着i++增大的;第二题就是选择排序法,选择排序法是什么,怎么做详见算法。
在作业四中,我通过网上查找,新学了一个函数。就是strlen(),这个函数的作用就是数出一个字符串中有几个字符,还有strcpy(s,t)是把t的字符串复制到s中,这个不能弄颠倒。
至于指针问题,就是在定义一个指针的时候是带星号的,以后单写字母就是指针,加星号的是指针所指向的地址所存储的值,还有就是数组a[]的a表示数组第一个元素的地址,a[i]还可以写成*(a+i),另外要注意的是a=a+1是错误的,要想这样写,可以把a赋值给一个新的指针p,再p=p+1。
2、将PTA作业的源代码使用git提交到托管平台上。
(1)提交证明:
(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git
3、点评3个同学的本周作业
1、董雅洁:http://www.cnblogs.com/exo123/p/8575595.html
2、丰大为:http://www.cnblogs.com/DavidPark/p/8551402.html
3、徐铭博:http://www.cnblogs.com/xmb1547828350/p/8597402.html