第1次作業


作業要求二

1)C高級第一次PTA作業(1)

6-1 計算兩數的和與差

本題要求實現一個計算輸入的兩數的和與差的簡單函數。

代碼如下:

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

指針在題目中的作用:

    op1代表a,op2代表b,*psum代表sum,*pdiff代表diff。

6-2 拆分實數的整數與小數部分

本題要求實現一個拆分實數的整數與小數部分的簡單函數。

代碼如下:

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

指針在題目中的作用:

    x為輸入數,*intpart取x整數部分,*fracpart取輸入數減整數的部分(也就是小數部分)。

2)C高級第一次PTA作業(2)

6-1 在數組中查找指定元素

本題要求實現一個在數組中查找指定元素的簡單函數。

代碼如下:

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

(1)主要描述題目算法

     第一步:聲明函數
     第二步:定義兩個變量
     第三步:規划循環判斷數組中有無指定函數
     第四步:返回原函數

(2)流程圖

錯誤信息:

   錯誤原因:一開始找到相等函數的時候忘記在index=i之后加入break導致循環繼續答案錯誤。
   改正方法:在index=i;之后加入break。

6-2 找最大值及其下標

在一維整型數組中找出其中最大的數及其下標。

代碼如下:

 `int fun(int *a,int *b,int n){
  int i;
  for(i=0;i<n;i++){
    if(a[i]>*a){
      *a = a[i];
      *b = i;
    }
  }return *a;
}`

(1)主要描述題目算法

     第一步:聲明函數
     第二步:定義一個變量
     第三步:規划循環判斷數組中前一個數是否比后一個大
     第四步:是就交換然后記下下標
     第五步:返回原函數

(2)流程圖

錯誤信息:

   錯誤原因:最初的時候不知道輸出什么好,所以寫了return *a和return *b,結果答案錯誤。
   改正方法:咨詢了室友之后,室友告訴我只需要輸出return *a就行,我問了室友原因室友也不知道,希望老師解答一下。

3)C高級第一次PTA作業(3)

6-1 最小數放前最大數放后

為一維數組輸入10個整數;將其中最小的數與第一個數對換,將最大的數與最后一個數對換;輸出數組元素。

代碼如下:

`void input(int *arr,int n){
  int i;
  for(i=0;i<n;i++){
    scanf("%d",&*(arr+i));
  }
}
void max_min(int *arr,int n){
  int t;
  int i,x,y,z;
  int min=*arr;
  int max=0;
  for(i=0;i<n;i++){
    if(*(arr+i)<min){
      min=*(arr+i);
      x=i;
    }
  }
  t=*(arr+x);
  *(arr+x)=*arr;
  *arr=t;
  for(y=0;y<n;y++){
    if(*(arr+y)>max){
      max=*(arr+y);
      z=y;
    }
  }
  t=*(arr+z);
  *(arr+z)=*(arr+n-1);
  *(arr+n-1)=t;  
}
void output(int *arr,int n){
   int i;
  for(i=0;i<n;i++){
    printf("%3d",*(arr+i));
  }
}`

(1)主要描述題目算法

     第一步:聲明第一個函數
     第二步:輸入數組中所有的數
     第三步:返回原函數
     第四步:聲明第二個函數
     第五步:找出最小的數並記下下標
     第六步:交換最小數
     第七步:找出最大的數並記下下標
     第八步:交換最大數
     第九步:返回原函數
     第十步:聲明第三個函數
     第十一步:輸出數組中所有的數
     第十二步:返回原函數

(2)流程圖

錯誤信息:

   錯誤原因:一開始我寫成了 min=*(arr+i); *arr=min; 只是一開始的值變成了最小值或最大值,並沒有交換,結果答案錯誤。
   改正方法:經過的DEV C++運行之后我發現了問題定義了新的變量來表示指針,然后進行了交換的三行代碼,答案正確。

6-2 指針選擇法排序

指針選擇法對10個數進行由大到小的排序。

代碼如下:

`void sort(int *x,int n){
  int i,j,t;
  for(j=1;j<10;j++)
  for(i=0;i<10-j;i++)
  {
  if(*(x+i)<*(x+i+1))
    {
      t=*(x+i);
      *(x+i)=*(x+i+1);
      *(x+i+1)=t;
    }  
  }
}`

(1)主要描述題目算法

     第一步:聲明第一個函數
     第二步:定義三個變量
     第三步:確定一共循環幾次
     第四步:第一個數與后面的數比較排序然后第二個數依此循環
     第五步:返回原函數

(2)流程圖

4)C高級第一次PTA作業(4)

6-1 判斷回文字符串

本題要求編寫函數,判斷給定的一串字符是否為“回文”。

代碼如下:

`bool palindrome( char *s ){
  int i,j;
  int n = strlen(s);
    for(i=0,j=n-1;i<=(n-1)/2;i++,j--)
    {
      if(*(s+i)!=*(s+j))
      {
        return false;
      }
    }
    if(i>=j) return true;
}`

(1)主要描述題目算法

     第一步:聲明第一個函數
     第二步:定義兩個變量
     第三步:數清楚一共幾個字符
     第四步:判斷第一個數與最后一個數是否一樣
     第五步:循環
     第六步:返回原函數

(2)流程圖

錯誤信息(1):

   錯誤原因:忘記了strlen函數導致忘記取字符串字符的數量。
   改正方法:寫入strlen函數。

錯誤信息(2):

   錯誤原因:開始我寫的是
if(s[i]!=s[j]) break; if(i>j) return ture; return no;
造成的錯誤就是忽略了只有兩個字符的情況。
   改正方法:
if(*(s+i)!=*(s+j)) { return false; } if(i>=j) return true;
對於這種情況進行了分別的討論。

6-2 使用函數實現字符串部分復制

本題要求編寫函數,將輸入字符串t中從第m個字符開始的全部字符復制到字符串s中。

代碼如下:

`void strmcpy( char *t, int m, char *s ){
  int n;
  n=strlen(t);
  int i;
  int a=0;
  if(m<=n){
    for(i=m;t[i-m]!='\0';i++)
    {
      *(s+a)=t[i-1];
      a++;
    }*(s + n) = '\0';
  }else{
    *s='\0';
  }
}`

(1)主要描述題目算法

     第一步:聲明第一個函數
     第二步:數清楚一共幾個字符
     第三步:判斷是否有意義
     第四步:如果有意義讓字符串t從第m個字符開始的全部字符復制到字符串s
     第五步:最后加入'\0'
     第七步:如果沒意義直接讓字符串s變為'\0'
     第八步:返回原函數

流程圖

錯誤信息:

   錯誤原因:一開始寫的是 t[i]!='\0' 忘記了i的取值一開始是m結果編譯錯誤。
   改正方法:改為 t[i-m]!='\0'

附加題

小寫字母y變換為a,小寫字母z變換為b,其他字母變換成為該字母ASCII碼順序后2為字母

代碼如下:

`#include<stdio.h>
void mima( char *s );
int main ()
{
    char a[20];
    gets(a);
    mima(a);
    printf("%s",a);
    return 0;
} 

void mima( char *s ){
    int i;
    for(i=0;*(s+i)!='\0';i++)
    {
	    if(*(s+i)=='y'){
		    *(s+i)='a';
	    }else if(*(s+i)=='z'){
		    *(s+i)='b';
	    }else{
		    *(s+i)=*(s+i)+2;
	    }
    }
} `

(1)主要描述題目算法

     第一步:輸入字符串
     第二步:聲明函數
     第三步:循環判斷是否為y,z
     第四步:如果為y則變為a,如果為z則變為b,如果都不是則加2
     第五步:返回原函數
     第七步:輸出字符串

結果圖

流程圖

作業要求三

1、總結兩周里所學的知識點有哪些學會了?哪些還沒有學會?

在所在的兩個周,我們主要先復習了上半學期的主要知識,然后對於指針以及針對於一般變量、數組與字符變量代替,和指針在函數中的應用。更是學習了指針的理論知識和它所注意的事情。
主要沒有搞清楚還有三點,一是對於字符變量還是略有生疏經常忘記 t[i]!='\0' 需要 i=0 要讓初始量為零;二是對於"strcpy"、"strcat"、"strcmp"的應用還是不太明白:三是希望老師解答一下C高級第一次PTA作業(2)6-2 找最大值及其下標中我的錯誤。

2、將PTA作業的源代碼使用git提交到托管平台上,要求給出上傳成功截圖和你的git地址。

git地址:https://git.coding.net/wuyaole/dayixiagxueqi01.git
截圖

3、點評作業

高立彬
豐大為
於耀淞

4、用表格和折線圖呈現本周(3/12 8:00~3/26 8:00)的代碼行數和所用時間、博客字數和所用時間



免責聲明!

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



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