一、PTA實驗作業
題目1:7-2 統計一行文本的單詞個數
1. 本題PTA提交列表
2. 設計思路
定義循環變量i,j定義不為空格的字符數count,定義單詞數number,i,j,count,number賦初值0;
定義字符數組a
輸入字符數組a
遍歷數組
每次進入循環,對count賦初值0
fori=jtoa[i]=='\0'
如果a[i]為空格
j=i+1
跳出循環
否則
count++記錄非空格字符數
end for
如果count>=1
number++記錄單詞個數
如果a[i]=='\0',數組遍歷結束
輸出單詞個數
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
沒有考慮好空格的問題,一開始使用的判斷方法是如果連續倆個數據,前一個是非空格,后一個是空格,就表示一個單詞。但是這種判斷就不適合末位是空格,單詞數會多一。還有就是出現連續空格如何跳過這些空格繼續數下去。最后發現利用一個循環可以解決多空格問題。通過判斷出的非空格字符來記錄單詞個數。
題目2:7-6 Jack cheng的煩惱2
1. 本題PTA提交列表
2. 設計思路
【考慮不完整】
定義字符數組a
定義循環變量,括號數n
定義變量flag,並賦初值0
輸入n
如果n不是偶數,一定不配對
輸出False
如果n是偶數
for i=0 to i<n
輸入字符元素
end for
for i=0 to i<n
flag=0;
如果a[i]為(或{ a[n-i]對應
flag=1
end for
如果i為奇數
for i=0 to i<=n/2
flag=0
如果a[i]為(或{ a[i+1]為對應的)或}
flag=1
end for
如果 flag==1
輸出True
如果flag==0
輸出False
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
只考慮到像(){}或者(({}))這種配對排列情況,還有類似({}())這種樣子的就沒考慮到,找規律發現可以找(和{的配對,剩下沒有能配對左括號的就是配對錯誤了,但是還沒想好怎么寫代碼。
所以正確思路應該是:遍歷數組,找左括號的配對,配對成功就接着配下一對,如果最后有沒能配對的,這個字符串就括號配對錯誤
題目3:7-11 藏頭詩
1. 本題PTA提交列表
2. 設計思路
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
一開始直接輸出輸不出來,注意到題目中一個漢字倆個字節,將倆個元素賦給新數組中一個元素,實現輸出(借鑒了相關的代碼,如何實現一個漢字倆個字節)
二、截圖本周題目集的PTA最后排名
三、同學代碼結對互評
1.互評同學名稱 周炳輝
2.我的代碼、互評同學代碼截圖
我的代碼
周炳輝的代碼
3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題。
我將z值放在一個數組里,然后遍歷數組,找到與mo對應的z值,而炳輝直接把mo當做下標值,這樣少了一次循環,而且也好讀些。
PTA提交結果:
發現X沒大寫,改了還是不對。在炳輝大佬指點下,發現代碼有漏洞,因為每次輸入后,我都給flag賦0值。這樣的話,如果最后一組的身份證是正確的,我的flag沒改變,是0.就會執行flag==0這一語句,輸出全對。
解決辦法:增加了一個變量flag1,賦初值為1,只要身份證有誤,就執行flag1=0.判斷最后flag1,如果為1,輸出全對。
正確代碼:
四、本周學習總結
1.你學會了什么?
1.1指針變量如何定義
定義指針變量的一般形式: 類型名 *指針變量名
(1)必須是有效的數據類型:如int,float,char等
(2)指針變量名是指針變量的名稱,必須是一個合法標識符
1.2 指針加法運算運用在哪種情況,2個指針變量能否相加?
指針加法用在指針變量加一個常量,+n表示下移n個存儲單元,-n表示上移n個存儲單元。倆個指針變量相加就是地址相加,沒有什么意義
1.3 指針不賦初值,直接使用,會出現什么情況,請用DEVC驗證,並截圖展示?
會指向一個不確定的單元
1.4 課堂派上關於分離浮點數的整數部分和小數部分那題,請用DEVC驗證實現,並在此貼圖展示,同時說明哪句是指針變量做函數形參,函數實參應該怎么表示。指針變量做函數形參有什么用處?`#include<stdio.h>
void splitfloat(float x,int *intpart,float *fracpart);
int main(){
float x;
int intpart;
float fracpart;
scanf("%f",&x);//輸入實數
splitfloat( x,&intpart,&fracpart);//調用函數
printf("%d\n",intpart);
printf("%f",fracpart);
return 0;
}
void splitfloat(float x,int *intpart,float *fracpart){
*intpart=(int)x;//強制轉換,取整
*fracpart=x-*intpart;//小數部分
}
1.5 請把課本的冒泡排序的函數改成指針變量做形參格式,並把代碼寫在底下,注意用markdown語法渲染。
#include<stdio.h>
void bubble (int a[],int n);
int main(){
int n,a[8];
int *p;
p=a;
int i;
scanf("%d\n",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
bubble(a,n);
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return 0;
}
void bubble(int a[],int n){
int i,j,t;
int *p=a;
int *pi,*pj,item;
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
pi=p+j;
p=p+j+1;j
if(*pi>*pj){
item=*pi;
*pi=*pj;
*pj=item;
}
}
}
}
1.6 如何定義一個指針變量指向數組,如何用指針變量表示數組元素?
int *p;
int a[80];
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",a[i]);
指針變量指向數組
(1)p=&a[0]
(2)p=a
用指針變量表示數組元素
(1)p=a+i
(2)p=&a[i]
1.7 如何定義字符指針指向字符串?指針指向字符串后,初始位置在哪里?
char *p;
char a[80];
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%c",a[i]);
字符指針指向字符串
(1)p=&a[0]
(2)p=a
初始位置在字符串首地址
1.8 利用字符指針操作字符串,如設計函數實現字符串連接,請在此貼圖展示代碼。說明指針表示字符的方法好處是什么?
如果將某個變量的地址作為函數的實參,相應的形參是指針。通過改變指針常量的值,就改變了存儲單元中的內容,返回主調函數時,變量值也就改變了
2.本周你不會內容有什么?
2.1 課堂派錯題羅列及如何訂正。
循環結束后,指針p已經不再指向數組,而是未知的位置,指針指向內容不明確,輸出的會是隨機值。
改正:在printf("\n")后加一句 p=a
a表示地址常量,常量不能使用自增符
2.2 其他不會的?打算怎么解決
刪除字符串中的子串,目前只會刪除一個字符還有計算字符串中子串個數。還不大有思路,項借大佬的代碼看看,再自個敲敲。幾種排序方法還是排的亂七八糟的,理論有了,實踐不夠吧。先理一遍偽代碼吧,再改成代碼。覺得這部分是考試重點,不能丟。
3.數組上機考試小結
3.1 那題錯了,請羅列?
6-1 數組循環右移
7-3 jmu-c-輸出字符間的字符子串
數組開始寫題就很慢了,尤其字符串學的太垃圾了,考試就試着寫了幾題,排序錯了還改好久改不出來
3.2 錯題如何訂正,為什么錯了?
6-1錯的很不應該,之前循環左移會,改成右移和調用函數就亂七八糟,輸出實現不了,改都不知道改哪。以為會這種方法的思路就會了,一操作全是問題,糟心
7-3遍歷數組,首先尋找起始字符,繼續向后找,如果找到終止字符,表示存在子串。如果存在子串,遍歷數組,把起始字符和終止字符以及之間的字符放在一個新的數組里,遍歷結束后,輸出這個子串。