C語言博客作業--字符數組


一、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 錯題如何訂正,為什么錯了?

粗心導致浪費時間,考試應認真檢查代碼,整理好自己的思路,而不是自己看自己的代碼都不懂的樣子


免責聲明!

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



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