一、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;
}