第一次作业
要求一
附加题
实验代码
#include<stdio.h>
#include<string.h>
int main()
{
char str[100];
int i=0;
scanf("%s",str);
while(str[i]!='\0')
{
if(str[i]=='y')
str[i]='a';
else if(str[i]=='z')
str[i]='b';
else
str[i]=str[i]+2;
i++;
}
puts(str);
}
错误信息:输出全为a
错误改正:循环语句中的判断语句赋值号‘=’与逻辑运算符相等‘’弄混,将‘=’改为‘’即可
要求二
题目6-1 计算两数的和与差
1 设计思路
(1)主要描述算法
第一步:输入数据
第二步:引用函数sum_diff( float op1, float op2, float psum, float pdiff )
第三步:函数sum_diff( float op1, float op2, float psum, float pdiff )中,将形参op1与op2的和赋值给指针psum所指的变量sum,将op1与op2的差赋值给指针pdiff所指的变量diff
第四步:输出sum与diff
2 实验代码
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2,*pdiff=op1-op2;
}
错误信息1:部分正确
错误原因:在函数中重复定义sum与diff
改正方法:删去重复定义的sum与diff
题目6-2 拆分实数的整数与小数部分
1 设计思路
(1)第一步:定义一个实数x,定义一个实数fracpart作为小数部分,定义一个整数intpart作为整数部分
第二步:引用函数void splitfloat( float x, int intpart, float fracpart )来进行整数部分与小数部分的分解
第三步:函数void splitfloat( float x, int intpart, float fracpart )中将形参x强制转换为整形类型,将得到的值赋给指针intpart所指的变量intpart;将形参x减去指针intpart所指的变量的值所得到的值赋给指针fracpart所指变量fracpart
第四步:输出intpart与fracpart的值
2 实验代码
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
暂无错误
6-1(2) 在数组中查找指定元素
1 设计思路
第一步:定义循环变量i,下标变量index,数组长度变量n以及需要查找数变量x;定义数组a[MAXN];
第二步:对数组的输入以及引用函数search;
第三步:函数search中,通过将数组初地址、长度以及需查找数输入,再用指针对数组进行遍历,最后返回查找到的数的下标并赋给下标变量index;
第四步:按照index的值来输出相应的结果
2 实验代码
int search( int list[], int n, int x )
{
int i;
for(i=0;i<n;i++)
{
if(*(list+i)==x)
{
return i;
break;
}
}
if(i==n)
return -1;
}
暂无错误
6-2(2)找最大值及其下标
1 设计思路
第一步:定义变量、数组,声明函数;
第二步:数组赋值;
第三步:引用函数,在函数中定义一个最大值变量max并将数组的首地址的值赋给max,再通过遍历来比较交换出该数组的最大值以及找到其下标
第四步:返回最大值max并将下标指针中的值改变,输出
2 实验代码
int fun(int *a,int *b,int n)
{
int max = *a;
int i;
for(i=1;i<n;i++)
{
if(*(a+i)>max)
{
max=*(a+i);
*b=i;
}
}
return max;
}
错误信息1:函数返回时未注意下标指针的返回
错误改正:添加下标指针的赋值以及返回即可
6-1 (3) 最小数放前最大数放后
1 设计思路
第一步:定义数组,声明函数input,max_min,output;
第二步:定义函数: intput:通过指针将输入数据放入 数组中来达到给数组赋值的效果
max_min:通过遍历找到最大值与最小值的下标,在遍历结束后将最大值与最小值的位置按题意交换
output:按题意遍历输出数组元素
第三步:按序引用函数intput,max_min,output
流程图
2 实验代码
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 max=*arr,min=*(arr+n-1) ;
int i,j=0,k=0;
for(i=0;i<n;i++)
{
if(*(arr+i)>max)
max=*(arr+i),k=i;
if(*(arr+i)<min)
min=*(arr+i),j=i;
}
int t;
t=*arr,*arr=*(arr+j),*(arr+j)=t;
t=*(arr+n-1),*(arr+n-1)=*(arr+k),*(arr+k)=t;
}
void output(int *arr,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%3d",*(arr+i));
}
}
暂无错误
6-2(3) 指针选择法排序
1 设计思路
第一步:声明函数sort,定义指针p,循环变量i,数组a
第二步:通过指针p对数组a赋值,完成后重新将指针移到数组a首位置
第三步:调用函数sort对数组a进行选择降序排序
具体步骤:1>外循环i为当前位置,令下标变量k=i
2>内循环j遍历i之后的剩余元素,若j所指位置的值大于k所指位置的值,则令k=j
3>内循环结束后判断k是否与i相等,若不相等,则交换i所指位置的值与k所指元素的值
第四步:按题意格式输出
流程图
主函数
函数
2 实验代码
void sort(int *x,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(*(x+j)>*(x+k))
k=j;
}
if(k!=i)
{
int t;
t=*(x+k),*(x+k)=*(x+i),*(x+i)=t;
}
}
}
错误信息1:未使用函数中数组的形参名导致编译错误
错误改正:将自己在函数中使用的数组名改为函数中的形参名
6-1(4) 判断回文字符串
1 设计思路
第一步:定义数组,声明函数
第二步:定义函数palindrome来判断是否为回文数
具体步骤:1> 通过strlen函数读取该数组的长度
2> 遍历前半个数组,如果第i个元素的值与第n-i-1个元素的值(即对称的两个位置的元素)不相等,则palindrome函数返回值为false
3> 若2>中没有返回false,则palindrome函数返回值为true
第三步:按题意输出
流程图
主函数
函数
2 实验代码
bool palindrome( char *s )
{
int i;
int n = strlen(s);
for(i=0;i<=n/2;i++)
{
if(*(s+i)!=*(s+n-i-1))
return false;
}
return true;
}
暂无错误
6-2(4) 使用函数实现字符串部分复制
1 设计思路
第一步:声明函数,定义数组,变量赋值,数组赋值
第二步:引用函数strmcpy( char *t, int m, char *s )来实现字符串部分复制
具体步骤:1>找到字符串数组t的第m个元素,判断该元素是否为‘\0’,若不为'\0',执行2>,否者执行3>
2>将该元素以及字符串数组 t从第m个元素之后的元素通过循环赋给字符串数组s
3>在字符串数组s的末位置加上'\0'
第三步:按题意格式输出
流程图
主函数
函数
2 实验代码
void strmcpy( char *t, int m, char *s )
{
int i;
for(i=m;*(t+i-1)!='\0';i++)
{
*(s+i-m)=*(t+i-1);
}
*(s+i-m)='\0';
}
错误信息1:函数中使用数组
错误改正:将数组改为指针形式
错误信息2:对字符串函数s赋值时位置位置表达式错误,导致s[0]没有赋值
错误改正:重新计算s的位置表达式,带入特殊值检验其正确性
要求三 学习总结和进度
1.知识点
这两周的PTA作业用到了指针的定义、*运算符的作用以及指针与自定义函数、指针与数组之间的关系相关的知识点
指针的使用极大的方便了自定义函数与主函数之间的交互,使得只能有一个或零个返回值的自定义函数能“拥有”多个返回值,使原本要在主函数中完成的步骤在自定义函数中完成并改变主函数中的变量,最大程度的简化了主函数;指针的调用,可以有效的避免变量的滥用。另外,指针的灵活性也能使较复杂的值的传递过程变得相对简单;但也是这种灵活性,容易导致浏览者的思路混乱。