1. 程式人生 > >C作業--數據類型

C作業--數據類型

變量名 .... 同時 效率 停止 保持 方法 erro logs

一、PTA實驗作業

題目1:7-3 倒順數字串

1. 本題PTA提交列表

技術分享圖片

2. 設計思路(偽代碼)

  • (1)本題是要求輸入倒順序數串,首先看到這種題肯定是需要用到循環,那就先定一個整形i來進行循環,n是表示最大的整數。
  • (2)輸入n的值。
  • (3)因為無論哪個數字都是從1開始,那就先數出1來控制行末的空格。
  • (4)在進行一個循環for i=2 to i=n;逐一輸出i的值,並在格式上控制在i的前面加一個空格。
  • (5)在進行一個循環 for i=n-1 to i=1,i--;在逐一輸出i的值即可。

    3.代碼截圖

    技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

題目2:7-8 判斷合法標識符

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

  • (1)首先定義三個整形數repreat,i,j,repreat表示輸入的字符串的個數。repreat表示輸入字符串的個數,i,j用來循環。
  • (2)int flag=1,flag是用來判斷這個字符串是否為合法字符串。
  • (3)char ch 定義一個字符型變量來輸入字符。
  • (4)進行循環for i=1 to i=repreat i++.
  • (5)在嵌套一個循環for j=1to j=80 j++
  • (6)在逐一輸入字符ch,
  • (7)if(j==1 並且 ((ch>=‘0‘) 並且 (ch<=‘9‘))),則flag=0;這是因為首個字符只能是_或則字母。
  • (8)if((ch>=‘a‘ && ch<=‘z‘) || (ch>=‘A‘ && ch<=‘Z‘) || (ch==‘\n‘) || (ch==‘_‘) || (ch>=‘0‘ && ch<=‘9‘))這是用來判斷除第一個以外的字符,若為字母或則數字還有下劃線都算為合法字符。則保持原有的flag=1,否則 flag=0;
  • (9)if(ch==‘\n‘)當輸入的字符為回車是就停止輸入字符就break
  • (10)再到循環外,進行判斷flag的值若奇值為1則輸出YES 否則輸出NO

    3.代碼截圖

    技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

  • (1)技術分享圖片

起初對於數字在開頭的表述方式是錯誤的沒有註意到,然後另外一個錯誤是,我定義了一個flag=1,用來做判斷這字符串是否正確,所以我在if((ch>=‘a‘ && ch<=‘z‘) || (ch>=‘A‘ && ch<=‘Z‘) || (ch==‘\n‘) || (ch==‘_‘) || (ch>=‘0‘ && ch<=‘9‘))的條件下加了一個flag=1,可是如果一個字符串中出現非法字符的同時又出現正確的字符那麽這個flag 就會疊加,導致最後答案不正確。

  • (2)技術分享圖片

然後我就在輸入字符後加了一個if(j==1 && ((ch>=‘0‘) && (ch<=‘9‘)))判斷第一個字符是否為數字,如果滿足就 flag=0
在則我取消了if((ch>=‘a‘ && ch<=‘z‘) || (ch>=‘A‘ && ch<=‘Z‘) || (ch==‘\n‘) || (ch==‘_‘) || (ch>=‘0‘ && ch<=‘9‘))後面的flag=1的操作,這樣就可以解決疊加的效果。

題目3:7-10 簡單計算器

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

  • (1)int x,y定義兩個整形變量x表示運算的上一個數,二Y表示運算的下一個數,然後在char ch,表示所要輸入的運算符
  • (2)scanf("%d",&x) scanf("%c",&ch);先輸入x的值和運算符
  • (3)在進行一個while(ch!=‘=‘)當ch為=是結束循環,在循環內scanf("%d",&y);輸入y的值if(ch==‘+‘ || ch==‘-‘ || ch==‘*‘ ||ch==‘/‘)用來判斷之前輸入的字符為什麽,
  • (4)if(ch==‘+‘ || ch==‘-‘ || ch==‘‘ ||ch==‘/‘)則進入switch (ch)語句 case‘+‘ :x=x+y;break; case‘-‘ :x=x-y;break; case‘‘ :x*=y;break;因為除法比較特殊單獨拿出來操作
  • (5)if(ch==‘/‘),在這個if語句中再次判斷if(y!=0)則x/=y否則就輸出ERROR,並return 0;
  • (6)然後在前面那個大if下還有一個elseprintf("ERROR");return 0;
  • (7)然後在if語句外while語句內在輸入ch
  • (8)最後在while語句外輸出printf("%d",x)

3.代碼截圖

技術分享圖片

4.本題調試過程碰到問題及PTA提交列表情況說明

  • (1)技術分享圖片

第一次莫名其妙的第一次出現了段錯誤這個名詞,檢查後發現在輸入的時候漏掉了地址

  • (2)技術分享圖片

這次是為非法字符的錯誤好像是漏掉的考慮ch是否為非法字符
然後我就在switch語句前加了一個if(ch==‘+‘ || ch==‘-‘ || ch==‘*‘ ||ch==‘/‘)的判斷。

二、截圖本周題目集的PTA最後排名。

技術分享圖片

三、本周學習總結(3分)

1.你學會了什麽?

1.1 一維數組如何定義、初始化?

1:定義一個數組,需要明確數組變量名,數組元素的類型和數組的大小。
一般形式為類型名 數組名 [數組長度] 註意!!數組長度是一個常量

1.2 一維數組在內存中結構?可畫圖說明。數組名表示什麽?

數組名是一個地址常量,存放數組內存空間的首地址

1.3 為什麽用數組?

在程序中使用數組,可以讓一批相同類型的變量使用同一個數組變量名,用下表來相互區分。它的優點是表達簡潔,可讀性好便於使用循環結構。

1.4 介紹選擇法、冒泡法、直接插入排序如何排序?偽代碼展示

  • (1)選擇法
    ```
    1.定義整型變量i,k,min,temp;
    2.輸入n;定義 a[n];
    3.for(i=0;i<n;i++),輸入n個數;
  1. for(k=0;k<n-1;k++),min=k;
  2.   for(i=k+1;i<n-k;i++);
              if(a[i]<a[min])    min=i;
       重復執行第5步驟,直到i=n-k為止;
       temp=a[k-1];      a[k-1]=a[min];        a[min]=temp;
    重復執行第4步驟,直到k=n時為止;
    6.輸出n個元素數組的值。
    ```
  • (2)冒泡法
    ```
    1.定義整型變量i,k,temp,N;
    2.輸入n;定義 a[n];
    3.for(i=0;i<n;i++),輸入n個數;
  1. for(k=0;k<n-1;k++),temp=k;
  2.   for(i=k+1;i<n-k;i++);
               if(a[i]<a[temp])         
                      N=a[itemp];      a[temp]=a[i];        a[i]=N;
       重復執行第5步驟,直到i=n-k為止;
    重復執行第4步驟,直到k=n時為止;
    6.輸出n個元素數組的值。
    ```
  • (3)直接插入排序
    ```
    1.定義整型變量i,k,bigger,temp;
    2.輸入n;定義 a[n];
    3.for(i=0;i<n;i++),輸入n個數;
  1. for(k=0;k<n-1;k++),bigger=k;
  2.   for(i=k+1;i<n;i++);
              if(a[i]<a[bigger]) 
                    for(j=k;j>=0;j--)
                         a[ j+1]=a[ j ];
       重復執行第5步驟,直到i=n-k為止;

    重復執行第4步驟,直到k=n時為止;
    6.輸出n個元素數組的值。
    ```

    1.5 介紹什麽是二分查找法?它和順序查找法區別?

    二分查找法是在元素按從小到大排列的數組中查找一個數時,取數組的中間值判斷是該數比要找的數大還是小,然後進一步鎖定相應的範圍,直到找到要找的數或者最後一個數並不是該數
    區別:順序查找法是從第一個找到最後一個,直到找到要找的數或者最後一個數並不是該數,沒有找到該數。順序查找法比二分查找法要簡介明了,更直接;但是二分查找法工作效率更高,如果數組元素比較多的話,順序查找法的效率就會降低。

    1.6 二維數組如何定義、初始化?

    1:在二維數組定義時,初始化有兩種方法
    1:分行賦值法:
    類型名 數組名 [行長度] [列長度]={{初始值0},{初始值1}.......}
    2:順序賦值法
    一般形式為:
    類型名 數組名 [行長度][列長度]={初值表}

    1.7 矩陣轉置怎麽實現?方陣中:下三角、上三角、對稱矩陣的行標i列標j的關系?請說明。

    用二維數組 a[ n ][ n ],除對角線上的元素以外,當i小於j時(上三角),a[ j ][ i ]=a[ i ][ j ];即可實現矩陣轉置。
    上三角:i小於等於j;下三角:i大於等於j。

    1.8 二維數組一般應用在哪裏?

    我覺得應該是用於表示矩陣,和多維向量。

    2.本周的內容,你還不會什麽?本周內容對於:切分表達式——寫個tokenizer吧這道題我還是不會,對於這種字符的題目,我還是沒有掌握的很清楚。

    對於數組的使用還是很生疏。

C作業--數據類型