要求一:完成PTA作業
答:作業已經完成!
要求二:pta作業編程題目的解題思路和調試過程記錄
C高級語言第一次作業(1)
完成情況如圖:
題目一:計算兩個數的和與差
1.設計思路
(1)算法:
第一步:看主函數部分。通過主函數可得輸入兩個浮點型變量a,b,然后經過函數(sum_diff(a, b, &sum, &diff))調試之后,輸出兩個數的和(sum)與差(diff);
第二步:看函數變量。根據題目流程可看出是把a賦值給op1,b賦值到op2,&sum賦值到psum,&diff賦值到pdiff(注意:函數里的psum,pdiff為指針變量);
第三步:寫函數部分的代碼。根據題目要求,兩個數的和為psum=op1+op2,兩個數的差為pdiff=op1-op2。
提示:float psum,floatpdiff是定義和與差的指針變量,單寫psum,pdiff是指和與差的值。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
3.本題調試過程碰到問題及解決的辦法:
本題在調試過程中未遇到錯誤。
題目二:拆分實數的整數與小數部分
1.設計思路
(1)算法:
第一步:看主函數部分。定義x, fracpart為浮點型變量,intpart為整型變量(題目中fracpart是小數部分,intpart是整數部分),然后輸入x(x為一個實數),經過函數(splitfloat(x, &intpart, &fracpart))調試之后,輸出整數部分和小數部分的值;
第二步:看函數變量。根據題目流程可看出是x賦值給x,&intpart賦值給intpart, &fracpart賦值給fracpart(注意:函數里的intpart,fracpart為指針變量);
第三步:寫函數部分的代碼。根據題目要求,把一個實數強制轉化為int型得到整數部分,然后用實數減去整數部分即得到了小數部分。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
3.本題調試過程碰到問題及解決的辦法:
本題在調試過程中未遇到錯誤。
C高級語言第一次作業(2)
完成情況如圖:
題目一:在數組中查找指定元素
1.設計思路
(1)算法:
第一步:看主函數部分。通過主函數可得定義 i, index, n, x,a[10]為整型(題目定義了MAXN為10),然后輸入n(n是list[]中元素的個數),for循環輸入數組,再輸入x(x是待查找的元素),通過函數得出index的值,若index不為-1,則輸出index
的值,否則輸出Not found;
第二步:看函數變量。把a賦值給list[],n、x賦值給n、x;
第三步:寫函數部分的代碼。在函數中定義a為整型變量,根據題目要求,需知使得若x等於list[a],則返回a的值,若沒有,則使index為-1。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
int search( int list[], int n, int x )
{
int a;
for(a=0;a<n;a++){
if(list[a]==x){
return a;}
}
return -1;
}
3.本題調試過程碰到問題及解決的辦法:
本題問題
解決辦法:發現我設的是a,不是i,結果誤把a寫為了i,改正即可。這提示我在寫題時不要馬虎!
題目二:找最大值及其下標
1.設計思路:
(1)算法:
第一步:看主函數部分。通過主函數可得定義 a[10],i,max,p為整型變量,p=10,然后輸入a[0]~a[9]的值,經過函數(fun(a,&p,N))調用,得到最大值max及下標p的值;
第二步:看函數變量。fun(a,&p,N)中的變量賦值給int fun(int a,int b,int n)中的變量;
第三步:寫函數部分的代碼。求最大值及其下標的方法就是先令a[0]是最大值,然后循環數組里的數字,與max比較大小,如果比max大,則把這個數賦給max,再把其相應下表寫出即可。
提示:在本題中,函數里的a為數組的第一個值的地址,則a為數組a[0]的值,(a+i)則為a[i]的值。另外,該代碼中不要忘記return max,把max的值返回到主函數中。為什么不用返回下標的值呢?因為最開始是把下標的地址賦給b,b則為b的值(b的地址里存的數),在要求寫的代碼中,把i的值賦值給b,即b地址里存的數為i,因此不用返回i的值。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
int fun(int *a,int *b,int n)
{
int i,max=*a;
for(i=0;i<n;i++){
if(*(a+i)>max){
max=*(a+i);
*b=i;
}
}
return max;
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
沒寫返回值return max;
解決辦法:補上即可。
C高級語言第一次作業(3)
完成情況如圖:
題目一:最小數放前最大數放后
1.設計思路
(1)算法:
本題里有三個函數。從簡單的開始。
第一步:第一個函數的作用就是輸入一個10個數字的數組,第三個函數是輸出這個數組。這兩個函數都是用for循環輸入輸出。
第二步:我覺得第二個函數是本題考察的重點。我把這個函數要做的事情分為兩個部分。
第一是找最最值,第二是移動最值。其中找最值我設了兩個數max,min,把這兩個數等於a[0],再和數組中的數進行比較。把比max大的數賦值給max,比min小的數賦值給min。
第二是移動。
(2)流程圖:
主函數:
調用函數:
①input(int *arr,int n)函數
②max_min(int *arr,int n)函數
③output(int *arr,int n)函數
2.實驗代碼:
void input(int *arr,int n)
{
int i;
for(i=0;i<=9;i++){
scanf("%d",&arr[i]);
}
}
void max_min(int *arr,int n)
{
int max,min,i,t,c,d;
max=arr[0];
min=arr[0];
for(i=0;i<=9;i++){
if(arr[i]>=max){
max=arr[i];
c=i;
}
}
t=arr[c];
arr[c]=arr[9];
arr[9]=t;
for(i=0;i<=9;i++){
if(arr[i]<=min){
min=arr[i];
d=i;
}
}
t=arr[d];
arr[d]=arr[0];
arr[0]=t;
}
void output(int *arr,int n)
{
int i;
for(i=0;i<=9;i++){
printf("%3d",arr[i]);
}
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
在做這道題的時候,交換數字時沒把i賦值給其它變量,而是直接用max,min和首末位置互換,從而使得數組中出現兩個一樣的最值情況(原本沒有)
解決辦法:
找到問題,把i賦值給c,d,更正完畢,正確。
題目二:指針選擇法排序
1.設計思路
(1)算法:
本題的算法就是選擇排序法。選擇排序法就是選擇出最大或最小放第一個位置,次大或次小放第二個位置,其它同理。而具體做法就是讓第一個數與后面的比較,找到比第一個位置的數大或小(看升序還是降序)的時候,從那個大的或小的數的位置繼續與其他的比較,直到找出最大或最小,再和第一個數交換位置,之后就從第二個人數繼續下去,直到排序成功。
第一步:設 i,j,t,temp為int型變量;
第二步:寫for循環,第一個循環是趟數,第二個是比較。如果(x+t)<(x+j)成立,則把i賦值給t;
第三步:找到最值后交換。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
void sort(int *x,int n)
{
int i,j,t,temp;
for(i=0;i<n-1;i++)
{
t=i;
for(j=i+1;j<n;j++)
{
if(*(x+t)<*(x+j))
t=j;
}
temp=*(x+i);
*(x+i)=*(x+t);
*(x+t)=temp;
}
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
本題問題在於不會選擇排序法,沒有頭緒,然后上網查了選擇排序法,也懂了是怎樣一回事,心得在算法上。
解決辦法:
上網百度,寫下心得。
C高級PTA第一次作業(4)
完成情況如圖:
題目一:判斷回文字符串
1.設計思路
(1)算法:
本題是看是否為回文。回文是abba或者abcba的格式。方法是先求出一個字符串有多少個字符(strlen()就是查多少字符用的,但不包括\0)然后數組中首尾相比(用for循環寫出數組)如果不相等,則不是回文,如果相等,繼續比較第二個和倒數第二個,以此類推,如果從頭往后的數組的位數大於從后往前的數組的位數,那么跳出循環。如果最后真的從頭往后的數組的位數大於從后往前的數組的位數,那么是回文。
第一步:定義i,j,n為整形變量;
第二步:求出數組s中的字符個數記為n;
第三步:j=n-1,j為數組下標;
第四步:寫出for循環,在for循環里比較s[i]與s[j],如果不相等,則跳出循環。相等就繼續下去,直到循環結束;
第五步:循環結束后,判斷i和j的大小,若i>j,則是回文,否則不是回文。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
bool palindrome( char *s )
{
int i,j,n;
n=strlen(s);
j=n-1;
for(i=0;i<j;i++,j--)
{
if(s[i]!=s[j]){
break;
}
}
if(i>=j){
return true;
}
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
解決辦法:
經檢查發現if語句內容括多了,應該只有判斷s[i]與s[j]的關系,若不相等就跳出循環這一點,改正后答案正確。
題目二:使用函數實現字符串部分復制
1.設計思路
(1)算法:
第一步:先測出被復制的數組的長度,然后把整個數組復制到新的數組上;
第二步:用for循環,第一個for循環是說明從那個字符開始,內部嵌套的for循環是從這個字符開始直到結束的字符整體前移(前移是(s+j-1)=(s+j)做到的);
第三步: *(s+k-m+1)='\0',在得到的新數組后加'\0'。
(2)流程圖:
主函數:
調用函數:
2.實驗代碼:
void strmcpy( char *t, int m, char *s )
{
int i,j,k;
k=strlen(t);
strcpy(s,t);
for(i=m-1;i>0;i--){
for(j=i;j<k;j++){
*(s+j-1)=*(s+j);
}
}
*(s+k-m+1)='\0';
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
本題一點頭緒都沒有。
解決辦法:
上網查找了答案,認真分析后,自己又在電腦上敲出來的。
附加題:
題目:為了防止信息被別人輕易盜取,需要把電碼明文通過加密方式變換成為密文。變換規則如下:小寫字母y變換為a,小寫字母z變換為b,其他字母變換成為該字母ASCII碼順序后2個字母,比如o變換成q。要求給出你的姓名全拼加密后的結果。
我的姓名全拼加密后的結果:
1.設計思路
(1)算法:
第一步:定義一個字符為c,用while循環輸入字符;
第二步:根據題目要求,如果是字母則加2;
第三步: 如果加2以后不再是字母或者字母要循環回來,此時就-26即可。
(2)流程圖:
2.實驗代碼:
#include <stdio.h>
int main()
{
char c;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{
c=c+2;
if(c>'Z'&&c<='Z'+2||c>'z')
c=c-26;
}
printf("%c",c);
}
printf("\n");
return 0;
}
3.本題調試過程碰到問題及解決的辦法:
本題問題:
如圖:
解決辦法:
后來發現是'z'+2寫成了'z+2',改正即可。
要求三:學習總結和進度
1、總結兩周來所有PTA作業中每個題目所使用的知識點。(我學到了什么,未學會什么?)
分享:幾種表達方式的區別:
這兩周主要學了指針,指針與數組,指針與字符數組,在PTA作業習題中均有體現。這些知識點在課本上都有,我主要說一下習題的知識點。
在作業一中,我一遍過,覺得很簡單。這里需要注意的是怎樣把一個浮點數強制轉化為整數型。就是類似於(int)x這樣(若x是浮點型)。
在作業二中,第一個是看是否有list[a]等於x,第二個要注意找到最大值的方法。即先設最大值等於a[0],然后與數組中其他數比較大小,如果有比其大的,就把那個數賦值給所設的最大值,直到得到真的最大值。
在作業三中,第一題找最值的方法與作業二一樣,主要是交換數組中的數的時候,要記得把循環里的那個i(i為數組的下標)賦值給一個新設的變量,要不然在做題的時候,i值是會隨着i++增大的;第二題就是選擇排序法,選擇排序法是什么,怎么做詳見算法。
在作業四中,我通過網上查找,新學了一個函數。就是strlen(),這個函數的作用就是數出一個字符串中有幾個字符,還有strcpy(s,t)是把t的字符串復制到s中,這個不能弄顛倒。
至於指針問題,就是在定義一個指針的時候是帶星號的,以后單寫字母就是指針,加星號的是指針所指向的地址所存儲的值,還有就是數組a[]的a表示數組第一個元素的地址,a[i]還可以寫成*(a+i),另外要注意的是a=a+1是錯誤的,要想這樣寫,可以把a賦值給一個新的指針p,再p=p+1。
另外其實我有很多不會的,具體也說不出來個一二三,每次都是通過做題來補充自己。
2、將PTA作業的源代碼使用git提交到托管平台上。
(1)提交證明:
(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git
3、點評3個同學的本周作業
1、董雅潔:http://www.cnblogs.com/exo123/p/8575595.html
2、豐大為:http://www.cnblogs.com/DavidPark/p/8551402.html
3、徐銘博:http://www.cnblogs.com/xmb1547828350/p/8597402.html
4、學習進度表