第一次作業(第二學期)


作業要求一 (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分)。
表格:

折線圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM