一、PTA
題目1:人以類聚
1. 本題PTA提交列表

2.設計思路

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- 一開始寫的代碼是這樣的

沒有按學號從小到大輸出小明喜歡同學的學號導致錯誤。
題目2:Left-pad
1.本題PTA提交列表

2.設計思路
int N,k=0,j=0,i
定義長度為100000的字符型數組a,c,以及一個字符型變量ch
輸入N,ch
while(輸入a[k]如果不為'\n'
k++;
a[k]='\0'
if N>=k 即要補足之后的長度大於原數組長度
for i=0 to N
if(i<N-k) c[i]=ch即c數組前面補為ch
else c[i]=a[j] j++ 即c數組后面為a數組
c[N]='\0'
else
for i=k-N to a[i]!='\0' //只留下從結尾往開頭數要求長度的數組元素
c[j]=a[i] j++
c[j]='\0'
for i=0 to c[i]!='\0'
輸出c[i]
3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- 數組定義時的大小不夠,加了兩次,才過
題目3:字符串轉換成十進制整數
1.本題PTA提交列表

2.設計思路
定義兩個長度為100字符數組 a,b
int i,j0,flag=0,flag標志是否存在有效-號
long number=0
while(輸入a[i]a不等於'#')
i++
for i=0 to a[i]!='\0'
if(a[i]=='-'&&j==0)即存在有效-號
flag=1
if(a[i]為'0'到a'9'或者'a'到'f'或者'A'到'F')
b[j]=a[i] j++
b[i]='\0'
for j=0 to b[j]!='\0'
if(b[j]為'0'到'9')
number=number*16+b[j]-'0'
if(b[j]為'a'到'f')
number=number*16+b[j]-'a'+10
if(b[j]為'A'到'F')
number=number*16+bj]-'A'+10
if(flag==1&&number!=0)即有有效-號並且不為0
輸出-number
else
輸出number
3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- 在-號的無效有效上判斷錯誤,沒有判斷出時是在第一個十六進制字符前的-號才是有效的,同時代碼flag初始化錯誤初始化為1,導致一直錯誤。后來認真讀了代碼才發現
二、截圖本周題目集的PTA最后排名

三、同學代碼結對互評
1.互評同學名稱
嚴偉傑
2.我的代碼、互評同學代碼截圖


3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題
- 思路不同:
我沒有判斷前十七位是否為數字,因為前十七位如果不為數字,那么最后的加權求和取余肯定與校驗碼不同。而嚴偉傑同學有判斷前十七位是否為數字,我的代碼算是耍了小聰明,但是比較簡短,他的代碼更加嚴謹。 - 變量定義不同:
我定義了a數組存放身份證為一維數組,每次輸入都重新對它賦值。而嚴偉傑同學定義了一個二維數組,每次存放一行,在我看來是不必要的,這樣導致數組占用內存空間大,效率低。 - 所以總體來說我更喜歡我的代碼。
四、本周學習總結
1.你學會了什么?
1.1指針變量如何定義
如果指向整形變量則定義 int *p
如果指向字符型變量則定義 char *p
如果指向double形變量則定義 double *p
即指向什么類型的變量,就定義什么類型的指針
1.2 指針加法運算運用在哪種情況,2個指針變量能否相加?
運用在數組中,表示數組下標又一一位。兩個指針變量不能相加
1.3 指針不賦初值,直接使用,會出現什么情況,請用DEVC驗證,並截圖展示?

程序運行錯誤,會崩潰
1.4 課堂派上關於分離浮點數的整數部分和小數部分那題,請用DEVC驗證實現,並在此貼圖展示,同時說明哪句是指針變量做函數形參,函數實參應該怎么表示。指針變量做函數形參有什么用處?

指針變量做函數形參的好處:在函數中可以改變主函數中指向的值,則可以間接實現傳回多個數
1.5 請把課本的冒泡排序的函數改成指針變量做形參格式,並把代碼寫在底下,注意用markdown語法渲染。
#include<stdio.h>
void bubble(int *a,int n);
int main(void){
int n,a[8];
int i;
printf("Enter n(n<=8):");
scanf("%d",&n);
printf("Enter a[%d)]:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
for(i=0;i<n;i++)
printf("%3d",a[i]);
return 0;
}
void bubble(int *a,int n){
int i,j,t;
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
1.6 如何定義一個指針變量指向數組,如何用指針變量表示數組元素?
這樣定義:
int *p,a[10];
p=a;
*(p+i) 即可表示a[i]
1.7 如何定義字符指針指向字符串?指針指向字符串后,初始位置在哪里?
char *p;
p="china";
初始位置為首字母的地址,這道題即為c的地址
1.8 利用字符指針操作字符串,如設計函數實現字符串連接,請在此貼圖展示代碼。說明指針表示字符的方法好處是什么?
#include<stdio.h>
char Fun(char *a,char *b);
int main(){
char a[]="china ",b[]="is the best";
Fun(a,b);
puts(a);
return 0;
}
char Fun(char *a,char *b){
int i=0,j,k=0;
while(a[i]!='\0')
i++;
for(j=i;b[k]!='\0';j++){
a[j]=b[k];
k++;
}
a[j]='\0';
}
好處:可以返回多個值
2.本周你不會內容有什么?
2.1 課堂派錯題羅列及如何訂正

這題答案為D,由於數組名為指針常量,不能實現自增
2.2 其他不會的?打算怎么解決
對於指針指向數組時的情況,掌握的不夠熟練,這周還做了一些別的題,發現尋找規律有時候是很重要的,如何優化代碼,提高代碼效率也很重要。解決方法:多做題,累積經驗和解某些題目的方法。
3.數組上機考試小結
3.1 哪題錯了,請羅列?
上機考試雖然得了滿分,但是在IP地址轉換那題,錯把數組定義成整形,導致之后錯誤,浪費了一會兒時間。然后輸出十六進制數,可以直接用 printf("%X",number) 這種形式,可以輸出大寫的十六進制。
3.2 錯題如何訂正,為什么錯了?
粗心導致浪費時間,考試應認真檢查代碼,整理好自己的思路,而不是自己看自己的代碼都不懂的樣子
