第一次作业(第二学期)

作业要求一 (20分)

完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里:

1)C高级第一次PTA作业(1)

2)C高级第一次PTA作业(2)

3)C高级第一次PTA作业(3)

4)C高级第一次PTA作业(4)

额外加题3:为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2为字幕,比如o变换成q。要求给出你的姓名全拼加密后的结果。

作业要求二(60分)

1)C高级第一次PTA作业(1)

题目6-1 计算两数的和与差
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:两数相加求和。
第二步:两数相减求差。
第三步:通过指针返回多个值。
(2)流程图(4分)

2.实验代码(2分)

void sum_diff(float op1,float op2,float *psum,float *pdiff)
{
     *psum=op1+op2;
     *pdiff=op1-op2;
     

     }

3.本题调试过程碰到问题及解决办法(12分)

题目6-2 拆分实数的整数与小数部分
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过转换数据类型去掉小数部分得到整数部分。
第二步:原来的数减去整数部分得到小数部分。
第三步:通过指针返回多个值。
(2)流程图(4分)

2.实验代码(2分)

void splitfloat(float x,int *intpart,float *fracpart)
{
     
     *intpart= (int)x;
     *fracpart=x-*intpart;

     }

3.本题调试过程碰到问题及解决办法(12分)

2)C高级第一次PTA作业(2)

题目6-1 在数组中查找指定元素
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过for循环将所给值与数组中每个元素进行比较。
第二步:若在数组中找到与所给值相等的数则用mark=1来标记。
第三步:根据mark的值决定返回值。

(2)流程图(4分)

2.实验代码(2分)

 int search(int list[], int n, int x)  
{  
       int j;
       int mark=0;
for(j=0;j<n;j++)
  {
  if(list[j]=x)
  {
   mark=1;
   break;
}
   }
  if(mark==1)
 { 
   return j;
  }
  else
 {
  return -1;
 }
 }  

3.本题调试过程碰到问题及解决办法(12分)

题目6-2 找最大值及其下标
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过for循环找到数组中的最大值。
第二步:返回最大值。

(2)流程图(4分)

2.实验代码(2分)

int fun(int *a,int *b,int n)
{
	int j;
	int zuida=*a;
	for(j=1;j<N;j++)
	{
		if(*(a+j)>*a)
		{
			*b=j;
			zuida=*(a+j);
		}
	}
	return zuida;	
}

3.本题调试过程碰到问题及解决办法(12分)

3)C高级第一次PTA作业(3)

题目6-1 最小数放前最大数放后
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过input函数对数组初始化。
第二步:在max_min函数中对每个元素依次比较,找出其中最大值与最小值并记录并用mark,flag记录其角标。
第三步:通过中间变量c1将最小值与数组第一个元素交换。
第四步:通过中间变量c2将最大值与数组最后一个元素交换。
第五步:通过for循环依次输出该数组各元素。
(2)流程图(4分)



2.实验代码(2分)

void input(int *arr,int n)
{
int i;
for(i=0;i<10;i++)
{
scanf("%d",&*(arr+i));
}
} 
void max_min(int *arr,int n)
{ int mark=0,flag=0;
  int j=0;
  int c1,c2;
  int max=*arr,min=*arr;
  for(j=0;j<10;j++)
  { if(*(arr+j)>max)
  {max=*(arr+j);
   mark=j;
  }
  if(*(arr+j)<min)
  {min=*(arr+j);
   flag=j;
  }
  	
  }
  c1=*arr;
  *(arr)=min;
  *(arr+flag)=c1;
  c2=*(arr+9);
  *(arr+9)=max;
  *(arr+mark)=c2; 

} 
void output(int *arr,int n)
{
  int k=0;
  for(k=0;k<10;k++)
  {printf("%3d",*(arr+k));
  }
} 

3.本题调试过程碰到问题及解决办法(12分)

题目6-2 指针选择法排序
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过for循环内嵌for循环找出最外层循环对应的每一个组数中的最大值,并记录其角标。
第二步:通过中间变量c1将其与外层循环对应的数据中的第一个数进行交换。
第三步:待循环结束后,输出数组中各元素。

(2)流程图(4分)

2.实验代码(2分)

 void sort(int *x,int n)
 {
 	int i,j,k,mark,c1;
 	int max;
 for(i=0;i<10;i++)
 {  max=*(x+i);
 	for(j=i;j<10;j++)
 	{ if(*(x+j)>max)
 	{max=*(x+j);
 	mark=j;
	 }
	 }
	c1=*(x+i); 
    *(x+i)=*(x+mark);
    *(x+mark)=c1;
 }
	
 }

3.本题调试过程碰到问题及解决办法(12分)

  

4)C高级第一次PTA作业(4)

题目6-1 判断回文字符串
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过strlen函数得到实参的字符长度,根据其判断可能是哪种回文类型。
第二步:通过for循环依次比较第一个与最后一个,第二个与倒数第二个,依次往下......
第三步:根据是否是回文返回不同的字符串。

(2)流程图(4分)

2.实验代码(2分)

 bool palindrome(char *s)
{    int a[4]={true};
     int b[5]={false};
     int length;
     int mark=0;
     int i,j;
     int n,m,flag=0;
     length=strlen(s);
     n=length-1;
     for(i=0;i<length/2;i++,n--)
     {
         if(*(s+i)!=*(s+n))  
         {      flag=1;     
                break;
                }           
                            }
     if(flag==1)
     {return *b;
                }
     else if(flag==0)
     { return *a;
          }
     }

3.本题调试过程碰到问题及解决办法(12分)

6-2 使用函数实现字符串部分复制
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过for循环得到数组t的长度。
第二步:判断t的长度与m的大小来决定是否能够复制。
第三步:若否,s为空字符串。若是,用for循环依次将t中字符复制至s。
第四步:在字符串s的最后手动加上\0。

(2)流程图(4分)

2.实验代码(2分)

void strmcpy(char *t,int m,char*s)
{
    int count=0;
    int i;
    for(i=0;;i++)
    {
	 if(*(t+i)=='\0')
	 {break;
	 }
	 else
	 {count++;
	 }
	}
	if(count<m)
	{*s='\0';
	}
	else
	{
	for(i=0;*(t+i)!='\0';i++)
	{
	*(s+i)=*(t+m-1+i);
	}
	*(s+i)='\0';	
	}
}

3.本题调试过程碰到问题及解决办法(12分)
问题:在写题过程中,误将\0打成\n导致段错误。其次,疏忽了在s数组后手动添加\0。
解决方法:将该题改为编程题,在主函数达到题目要求后,对比排查问题所在。在肯定思路的情况下,尝试不同写法。

额外加题3:
为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2为字幕,比如o变换成q。要求给出你的姓名全拼加密后的结果。
1 设计思路(6分)
(1)主要描述题目算法(1分)
第一步:通过for循环依次输入名字的各个字符。
第二步:判断各字符范围,进行变换。
第三步:输出加密后的名字。

(2)流程图(4分)

大量使用选择语句导致流程图横向宽度大
2.实验代码(2分)

#include <stdio.h>
int main()
{
    char name[20];
    int i;
    for(i=0;;i++)
    {
    scanf("%c",&name[i]);	
    if(name[i]=='\n')
	{break;
		}	
    if('A'<=name[i]&&name[i]<='Z')
	{name[i]=name[i]+2;
		}	
    if(name[i]>='a'&&name[i]<='z')	
    {if(name[i]=='y')
    {name[i]='a';
	}
	if(name[i]=='z')
	{name[i]='b';
	}
	else
	{name[i]=name[i]+2;
	}
		}		
	}
	printf("%s",name);
    return 0;
}

3.本题调试过程碰到问题及解决办法(12分)

结果


要求三、学习总结和进度(20分)

1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?(5分)
学会了:1. 使用指针在函数中返回多个值。
2. 数组与指针的等价替换。
3.指针字符串与字符串数组的区别。

2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。

git地址:https://git.coding.net/Donahue_Xu/The-First-Homework2.git

上传截图:

3、点评3个同学的本周作业
赵寅胜:http://www.cnblogs.com/2017023960ZYS/p/8604534.html
刘炜旗:http://www.cnblogs.com/ryo-/p/8644256.html
于耀淞:http://www.cnblogs.com/jsjyys/p/8589997.html

4、请用表格和折线图呈现你本周(3/12 8:00~3/26 8:00)的代码行数和时间、博客字数和时间(3分)。
表格:

折线图:

posted on 2018-03-19 19:47  徐铭博  阅读(542)  评论(13编辑  收藏  举报

导航