2018上第一次作業


要求一:完成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、學習進度表



免責聲明!

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



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