第一次作业
PTA第一次作业
第一题:计算两个数的和与差。
1 设计思路
(1)主要描述题目算法
第一步:阅读题目与函数。
第二步:先定义四个标识符a,b,sum,diff,对a,b赋值,然后把a的值给op1,把b的值给op2,将sum的地址给psum,将diff的地址给pdiff,然后输出两个数的和与差。
第三步:输出两数的和与差。
第四步:a+b是两个数的sum,a-b是两个数的差,因此在调用函数sum_diff中两个数的和psum等于op1+op2,两个数的差diff等于op1-op2。
void sum_diff( float op1, float op2, float *psum, float *pdiff ){*pdiff=op1-op2;
*psum=op1+op2;
}
(2)本题调试过程碰到问题及解决办法
无
第二题:拆分实数的整数与小数部分
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义。
第二步:找到对应函数中的实参和形参。
第三步:将X分为整数然后赋值给intpart,用x减去整数就是小数部分,然后将小数部分的值赋值给fracpart.
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
(2)本题调试过程碰到问题及解决办法
问题:没有把x转化为整型。
改正方法:转化之后再赋给*intpart。
PTA第二次作业
第一题:在数组中查找指定元素
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义,找到对应函数中的实参和形参并写出函数接口。
第二步:用变量i来遍历数组,如果有list[]==x的情况就代表了这个元素为了防止多次遍历。
第三步:然后把数组中所有的元素与指定元素x进行判断,如果不符合要求return -1如果只要有一个符合要求就return i。
int search( int list[], int n, int x )
{
int i;
int subscript = 0;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
subscript=1;
return i;
break;
}
}
if(subscript==0)
return -1;
}
(2)流程图
(3)本题调试过程碰到问题及解决办法
遍历概念不太清楚导致自己编译很多遍才全部正确,以后要多学多练。
第二题:寻找最大值及其下标
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义
第二步:先定义变量i然后利用变量遍历数组。
第三步:然后定义一个最大值
int fun(int *a,int *b,int n)
{
int i;
int max=a[0];
for(i=0;i<n;i++)
{
if(max<a[i])
{
max=a[i];
*b=i;
}
}
return max;
}
(2)流程图
(3)本题调试过程碰到问题及解决办法
指针使用错误,数值和地址弄混。
*和&使用错误
PTA第三次作业
第一题:最小数放前最大数放后
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义,定义接口函数。
第二步:找到对应函数中的实参和形参。
第三步:用for循环寻找出最大值与第一个数交换
(2)流程图
(3)实验代码
void input(int *arr,int n){ int i; for(i=0;i<n;i++){ scanf("%d",arr+i); } } void max_min(int *arr,int n){ int min=arr[0],max=arr[0]; int i,temp; int q=0,w=0; for(i=0;i<n;i++){ if(min>*(arr+i)){ min=*(arr+i); q=i; } if(max<*(arr+i)){ max=*(arr+i); w=i; } } temp=*(arr+0);*(arr+0)=*(arr+q);*(arr+q)=temp; temp=*(arr+n-1);*(arr+n-1)=*(arr+w);*(arr+w)=temp; } void output(int *arr,int n){ int i; for(i=0;i<n;i++){ printf("%3d",*(arr+i)); } }
(4)本题调试过程碰到问题及解决办法
无
第二题:指针选择法排序
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义,定义接口函数。
第二步:定义两个for循环.然后把数组第一个元素小标0定为最大值
第三步:判断数组中是否存在比arr+max大的数,假如有则记录它的角标,然后把小标赋值给max.
第四步:在for循环里判断数组小标和最大值max小标是否相同,如果不同,则交换俩数的小标。
第五步:用第一个数与最大值交换
(2)流程图
(3)实验代码
void sort(int *x,int n)
{
int q=0,b=0,temp=0,maxium=0;
for(q=0;q<n-1;q++)
{
maxium=q;
for(b=q;b<n;b++)
{
if(*(x+maxium)<*(x+b))
{
maxium=b;
}
}
if(maxium!=q)
{
temp=*(x+maxium);
*(x+maxium)=*(x+q);
*(x+q)=temp;
}
}
}
PTA第四次作业
第一题:判断回文字符串
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义,定义接口函数。
第二步:找出形参实参
第三步:用回文法求出字符串长度
第四步:用for循环比较出第一个和最后一个字符一不一样
(2)流程图
(3)实验代码
bool palindrome( char *s )
{
int x,i,cnt=0;
x=strlen(s);
for(i=0;i<x/2;i++)
{
if(s[i]==s[x-1-i])
{
cnt++;
}
}
if(cnt==x/2)
{
return true;
}else
{
return false;
}
}
(4)本题调试过程碰到问题及解决办法
编译错误
地址符忘记加*(基本错误)
第二题:使用函数实现字符串部分复制
(1). 主要描述题目算法
第一步:阅读题目并了解函数及其定义,定义接口函数并找出形参实参。
第二步:调用函数strmcpy,然后再把函数i,a循环
第三步:结束
(2)流程图
(3)实验代码
void strmcpy(char *t,int m,char *s)
{
int i;
int sum=0;
for(i=0;t[i]!='\0';i++) {sum++;}
if(sum<m) {s[0]='\0';}
else
{
for(i=0;t[m-1]!='\0';i++,m++)
{
s[i]=t[m-1];
}
s[i]='\0';
}
}
(4)本题调试过程碰到问题及解决办法
编译错误
‘\0'也占一个字符需要*(s+a) = '\0'才可以执行
学习总结
(1)在这两周中对于指针的知识理解不透彻,自己也在看mooc弥补。还有就是编程时间较少,有些手生,打起代码不流畅。
(2)点评网址
(3)托管代码
(4)表格