天天看點

第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)流程圖

第1次作業

錯誤資訊:

   錯誤原因:一開始找到相等函數的時候忘記在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次作業

   錯誤原因:最初的時候不知道輸出什麼好,是以寫了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次作業

   錯誤原因:一開始我寫成了

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次作業

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次作業

錯誤資訊(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';
  }
}`
           

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

流程圖

第1次作業

   錯誤原因:一開始寫的是

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;
	    }
    }
} `
           

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

結果圖

第1次作業

第1次作業

作業要求三

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

截圖

第1次作業

3、點評作業

高立彬

豐大為

于耀淞

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

第1次作業
第1次作業
上一篇: 第0次作業
下一篇: 總結報告