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