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


一、PTA實驗作業

題目1:統計一行文本的單詞個數

1.本題PTA提交列表

2.設計思路

定義字符數組存放輸入的字符
定義整形變量count存放單詞個數,len存放字符長度
輸入字符串
計算字符個數
if 開頭的字符是空格
    count=0
else
    count=1
for i=0 to len-1
    if 前一個字符是空格后一個字符非空格
    count加一
end for
輸出count的值

3.代碼截圖

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

遇到的問題:數組長度定義不夠大導致數組越界
解決方法:將數組長度由原來的80增加到1000即可

題目2:統計大寫輔音字母

1.本題PTA提交列表

2.設計思路

定義字符數組str存放輸入的字符串,ch存放從B到Z的大寫字母
定義整型數組count存放輔音字母個數,i,j為循環變量
輸入字符串
for i=0 to str[i]
    for j=0 to ch[j]
        if 輸入的字符中含有輔音字母
        count加一
    end for
end for
輸出count的值后換行

3.代碼截圖

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

遇到的問題:空字符串判斷條件錯誤
解決方法:剛開始自己的寫法判斷條件有缺漏,判斷范圍只局限在大寫字母內,不能判斷% 、\等字符,后來參考的同學的判斷思路,更改了自己的寫法,精簡了許多

題目3:刪除字符串中的字串

1.本題PTA提交列表

2.設計思路

3.代碼截圖

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

遇到的問題:
解決方法:

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

三、同學代碼結對互評

1.互評同學名稱

徐宏偉

2.我的代碼、互評同學代碼截圖

我的代碼


同學的代碼

3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題

首先,我和同學的思路基本相同,都是判斷字符和連續空格問題;其次,我和同學的判斷條件各有千秋,我是直接判斷整個字符串和連續空格問題,而同學是拆分字符串,到字符為空格時停止再開始下次判斷;我的思路比較劍走偏鋒,如果中間條件一個判斷錯可能導致全部代碼作廢重寫,而同學的思路就比較穩妥一點,拆分成一段一段的判斷,比較不容易犯錯;我個人比較喜歡效率高一點的代碼,我更喜歡我的代碼

四、本周學習總結

1.你學會了什么?

1.1指針變量如何定義

定義指針變量要使用指針聲明符*,如int i,*p
int *p 代表指向整型變量
char *p 代表指向字符型變量
float *fp 代表指向單精度實型變量
double *dpl 代表指向雙精度實型變量

1.2 指針加法運算運用在哪種情況,2個指針變量能否相加?

指針加法只要運用在地址的偏移,如*p=a+1
兩個指針變量不能相加,否則會出現編譯錯誤

1.3 指針不賦初值,直接使用,會出現什么情況,請用DEVC驗證,並截圖展示?

指針不賦初值就會出現運行錯誤,且容易使程序崩潰

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

void splitfloat(float x,int *intpart,float *fracpart)是指針變量做函數形參
splitfloat(number,&integral,&decimal)函數實參應該這樣表示
指針變量做函數形參,不可以改變實參的值,但是可以改變指針指向變量的值

1.5 請把課本的冒泡排序的函數改成指針變量做形參格式,並把代碼寫在底下,注意用markdown語法渲染

#include<stdio.h>
void bubble(int *p,int n);
int main()
{
	int n,a[8];
	int i;
	scanf("%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 *p,int n)
{
	int *i,*j,t;
	for(i=1+p;i<p+n;i++)
	for(j=p;j<p+n-1;j++)
	if(*j>*(j+1))
	{
		t=*j;
		*j=*(j+1);
		*(j+1)=t;
	}
}

1.6 如何定義一個指針變量指向數組,如何用指針變量表示數組元素?

int a[10],i,*p;
p=a;
for(i=0;i<10;i++)
*(p+i)=i;
或者
int a[10],i,*p
p=a;
for(i=0;i<10;i++)
*p=i;

1.7 如何定義字符指針指向字符串?指針指向字符串后,初始位置在哪里?

const char *p代表定義一個字符指針指向字符串,指向字符串的第一個字符

1.8 利用字符指針操作字符串,如設計函數實現字符串連接,請在此貼圖展示代碼。說明指針表示字符的方法好處是什么?

#include <stdio.h>
#include<string.h>
int fun(char *p,char *s);
int main()
{
    char a[80],b[80];
    scanf("%s%s",a,b);
    printf("%s",fun(a,b));
}
int fun(char *p,char *s)
{
	strcat(p,s);
}


指針表示字符好處是字符不會被覆蓋

2.本周你不會內容有什么?

2.1 課堂派錯題羅列及如何訂正

剛開始以為這是找不同等式,后來才發現是找表達式錯誤
c選擇中的*&point不是地址

2.2 其他不會的?打算怎么解決

對於指針作為函數形參的應用還不熟悉,經常寫得格式錯誤,如p=&a經常寫成*p=&a之類的;還有對指針的概念理解得還不是非常透徹,需要多多翻書打代碼,多做一點相關的題目鞏固一下自己的知識點

3.數組上機考試小結

3.1 那題錯了,請羅列?

  • 錯題1:jmu-c-輸出字符間的字符子串
  • 錯題2:數組循環右移
  • 錯題3:刪除數組中的元素

3.2 錯題如何訂正,為什么錯了?

  • 錯題1:將起始字符和終止字符定義成數組,當進入循環時,相應的內容會發生改變,不再是開始輸入的那個字符,對比不出結果,這個致命錯誤直接導致當時考試輸出不了結果
    改正后
#include<stdio.h>
int main()
{
	char ch[80];
	char start[80],end[80];
	int i,j,k,index1=0,index2=0,flag1=0,flag2=0;
	gets(ch);
	gets(start);
	gets(end);
	for(i=0;ch[i];i++)
	{
		if(start[i]==ch[i])
		{
		    index1=i;
		    break;
		}
		else if(start[i]!=ch[i]&&ch[i]=='\0')
		flag1=1;
	}
	for(j=0;ch[j];j++)
	{
		if(end[j]==ch[j])
		{
			index2=j;
			break;
		}
		else if(end[j]!=ch[j]&&ch[j]=='\0')
		flag2=1;
	}
	if(flag1==1||flag2==1)
	printf("no sub string!");
	else
	{
	    for(k=index1;k<index2;k++)
		printf("%c",ch[k]);
    }
}
  • 錯題2:數組越界和值被覆蓋
    改正前
int ArrayShift( int a[], int n, int m )
{
	int i,j,k=m,index=0;
	char b[80];
	for(i=0;i<m;i++) //將數儲存在另一個數組 
	{
		b[i]=a[i];
	}
	for(j=0;j<m;j++) //后面的數移動到前面 
	{
		a[j]=b[n-m];
		m--;
	}
	for(i=k;i<n;i++) //前面的數移動到后面 
	{
		a[i]=b[index];
		index++;
	}	
}

改正后

int ArrayShift( int a[], int n, int m ){
	int i,j,temp;
	for(i=1;i<=m;i++){
		temp=a[n-1];
		for(j=n-1;j>0;j--){
			a[j]=a[j-1];
		}
		a[0]=temp;
	}
}
  • 錯題3:沒時間做最后一題,回來做了一遍
#include<stdio.h>
int main()
{
    int i,j,n,del1,del2;
    scanf("%d",&n);
    int num[n];
    for(i=0;i<n;i++)
    scanf("%d",&num[i]);
    scanf("%d",&del1);
    for(i=0;i<deln;i++)
    {
        scanf("%d",&del2);
        for(j=del2-1;j<n;j++)
        {
            num[j]=num[j+1];
        }
        n--;
    }
    for(i=0;i<n;i++)
    {
        if(i==0)printf("%d",num[i]);
        else printf(" %d",num[i]);
    }
    return 0;
}


免責聲明!

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



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