C程序第二次作業


2-1刪除字符串中數字字符

1.設計思路
(1)主要描述題目算法
第一步:遍歷指針s所指的s數組。
第二步:如果 * (s+i)在0至9之間的話,則跳過此 * (s+i)。
第三步:如果* (s+i)不在0至9之間的話,使得 * (s+j) = * (s+i),j++。
第四步:千萬不要忘記最后 * (s+j) = '\0。
(2)流程圖
2.實驗代碼

void delnum(char *s)
{
  int i=0,j=0;
  for(i=0;*(s+i) != '\0';i++) 
  {
  	if(*(s+i)>='0'&&*(s+i)<='9') {
  		continue;
	  } else {
	  	*(s+j) = *(s+i);
	  	j++;
	  }
  }
  *(s+j) = '\0';
} 

3.本題調試過程碰到問題及解決辦法

2-2統計子串在母串出現的次數

1.設計思路
(1)主要描述題目算法
第一步:遍歷數組,如果 * (str+i) 與 * (str+i+1) , * (str+i+2)連續符合要求的話,則出現的次數加1。
第二步:如果不符合其中一項要求的話,則i++,如果都符合的話,則i = i+3。
第三步:返回k的值。
(2)流程圖
2.實驗代碼

/*int fun(char *str,char *substr)
{
	int i=0,k=0;
   while(*(str+i) != '\0') {
		if(*(str+i) == 'a'&& *(str+i+1) == 's') {
		 if(*(str+i+2)== 'd') {
			k++;
			i = i+3;
		 } else {
		 	i++;
		 }
		}else {
			i++; 
		}
	}
	return(k);*/
int fun(char *str,char *substr) 
{
	int i=0,k=0,m=0;
	char *p = substr;
	for(i=0;*(str+i) != '\0';i++) {
	  for(m = 0;*(str+i+m) == *(p+m);m++) {
	   if(*(p+m+1)=='\0') {
	   	k++;
	   } 
	}
 }
	return k;
}

3.本題調試過程碰到問題及解決辦法
錯誤點1:在 第一個else里寫continue,導致i一直為3,最后沒有輸出結果。
解決方法:在進行單步調試后,發現自己的症結點,將其改成i++。

2-3字符串中除首尾字符外的其余字符按降序排列

1.設計思路
(1)主要描述題目算法
第一步:調用函數中指針型s用來接收主函數的字符型數組s,num=7。
第二步:使用冒泡法,用ASCII的值來比較輸入字符的大小,但注意i的值,因其首尾不需要比較。
(2)流程圖
2.實驗代碼

int fun(char *s,int num) 
{
  char tmp;
  int i=0,j;
  for(i=1;i<6;i++) {
     for(j=1;j<6-i;j++) {
     	if(*(s+j) < *(s+j+1)) {
     	 tmp = *(s+j);
		 *(s+j) =*(s+j+1);
		 *(s+j+1) = tmp;	
		 }
	 }
  }
  return 0; 
} 

3.本題調試過程碰到問題及解決辦法
錯誤點1:使i=0,j=0,導致最后結果錯誤。
解決方法:再調試后重新閱讀了一遍題目,自己的粗心和慣性思維造成的。

pta提交列表:

2-4輸出學生成績

1.設計思路
(1)主要描述題目算法
第一步:對N進行整型定義,指針型p指向double類型,max,avg,min一樣指向double類型。
第二步:對p的數據進行動態分配內存的操作,若不進行分配則指針型p為空指針,調試時則會報錯。
第三步:使用for循環,用指針型p接受輸入的數據,得到sum的值。
第四步:再使用for循環,使max = *p,min= *p,即為p[0],與其他數據進行比較,最后輸出結果。
(2)流程圖

2.實驗代碼

#include<stdio.h>
int main ()
{
  int N;
  double *p,max,avg,min;
  scanf("%d",&N);
  if((p=(double*)calloc(N,sizeof(double)))==NULL){
  exit(1);
  }
  int i=0;
  double sum=0;
  for(i=0;i<N;i++) {
    scanf("%lf",p+i);
    sum = sum + *(p+i);
  }
  max = *p;
  min = *p;
  for(i=0;i<N;i++) {
    if(max<*(p+i)) {
      max = *(p+i);
    }
    if(min>*(p+i)){
      min = *(p+i);
    }
  }
  avg = sum/N;
  printf("average = %.2f\n",avg);
  printf("max = %.2f\n",max);
  printf("min = %.2f\n",min);
  return 0;
}

3.本題調試過程碰到問題及解決辦法
錯誤點1:指針p指向為int類型,導致最后輸出打的只能是整數;在動態分配內存中,指針型p指向double類型,因此(p=(double)calloc(N,sizeof(double)))==NULL而不為(p=(int)calloc(N,sizeof(int)))。
解決方法:疑惑以后,突然靈光一現,部分錯誤的話代表我的代碼沒有語法錯誤,隨意輸入數之后,發現即便avg答案是小數最后也輸出為整數,然后發現自己的問題並改正。

pta提交列表:

2-5計算職工工資

1.設計思路
(1)主要描述題目算法
第一步:使用結構體類型進行結構體變量的引用。
第二步:使用for循環,輸入s1[i].name,s1[i].ji,&s1[i].fu,s1[i].spare對用i的值,且需要注意字符串的話,輸入時不用加 “&”。
第三步:最后再遍歷數組,輸出要輸出的值。
(2)流程圖
2.實驗代碼

#include <stdio.h>
struct money {
	char name[10];
	float ji;
    float fu;
	float spare;
} s1[1000]; 
int main ()
{
	int N,i;
	scanf("%d",&N);
	float shing[N];
	for(i=0;i<N;i++) {
		scanf("%s %f %f %f",s1[i].name,&s1[i].ji,&s1[i].fu,&s1[i].spare);
		shing[i] = s1[i].ji+s1[i].fu-s1[i].spare;
	}
	for(i=0;i<N;i++) {
		printf("%s %.2f\n",s1[i].name,shing[i]);
	}
	return 0;
}

3.本題調試過程碰到問題及解決辦法

錯誤點1:在將s1[1000]改成s1[100]后,會出現段錯誤。
解決方法:,因一開始定義為1000,所以並沒有錯誤,但在看過姚舜禹同學的問題后,自己換成較小值會出現相同的錯誤。
在自己寫代碼時並沒有遇到什么大的問題,但本題在看到姚舜禹同學在小組中提到的問題及我班兩位同學的回復后,覺得自己的代碼雖然提交正確了,但覺得自己的代碼還是存在着很大的不足:最好是不要用是s1[1000]這種方式,極有可能因為數組的溢出而造成段錯誤,比如若我將1000改成100答案則是錯誤的,可以直接在輸入n后寫上struct money s1[n]就可以正常使用,可以看書自己以后需要向同學學習的地方還有很多,也覺得這種有錯誤時可以在小組里討論也是十分好的。

2-6計算平均成績

1.設計思路
(1)主要描述題目算法
第一步:使用結構體類型進行結構體變量的引用,且根據題意后面應為s1[10]。
第二步:輸入N的值,遍歷數組,輸入s1[i].number,s1[i].name,s1[i].score並將它們儲存起來,計算出sum的值。
第三步:在for循環中,判斷s1[i].score與avg的大小,最后按要求輸出元素。
(2)流程圖

2.實驗代碼

#include <stdio.h>
struct score {
	char number[6];
	char name[10];
	int score;
} s1[10];
int main ()
{
	
	int N,i,sum=0;
	float avg;
	scanf("%d",&N);
	for(i=0;i<N;i++) {
		scanf("%s %s %d",s1[i].number,s1[i].name,&s1[i].score);
		sum = sum + s1[i].score;
	}
	avg = sum/N;
	printf("%.2f\n",avg);
	for(i=0;i<N;i++) {
		if(s1[i].score<avg) {
			printf("%s %s\n",s1[i].name,s1[i].number);
		}
	}
	return 0;
}

3.本題調試過程碰到問題及解決辦法

錯誤點1:輸出時將s1[i].number的%s寫成%d。
解決方法:在單步調試后知道錯誤的代碼行,重新觀察后找出問題所在。
pta提交列表:

2-7按等級統計學生成績

1.設計思路
(1)主要描述題目算法
第一步:首先需要定義一個整型變量,為最后函數的返回值,使他在分數小於60的情況下++。
第二步:想到使用for循環,遍歷完整個p指針,根據不同的分數情況對p指針里不同元素定義不同的等級。
第三步:最后返回主函數。
2.實驗代碼

int set_grade( struct student *p, int n ) 
{
	int k = 0,i=0;
	for(i=0;i<n;i++) {
		if((p+i)->score >= 85) {
			(p+i)->grade = 'A';
		} else if((p+i)->score>=70 && (p+i)->score < 85) {
			(p+i)->grade = 'B';
		} else if((p+i)->score>=60 && (p+i)->score < 70) {
			(p+i)->grade = 'C';
		} else {
			(p+i)->grade = 'D';
			k++;
		}
	}
	return k;
}

3.本題調試過程碰到問題及解決辦法
因本題思路較簡單,並無問題。

2-8結構體數組按總分排序

1.設計思路
(1)主要描述題目算法
第一步:調用calc(struct student *p,int n),sort(struct student *p,int n) 分別接收calc(stu,5),sort(stu,5)的值。
第二步:因其calc函數目的為求出每名學生的總分,所以要用到for循環語句一個一個循環后算出其中每個元素的總值。
第三步:sort函數的目的是為了讓每名學生的總分從高到低對這組數據進行排序,想到用選擇排序法或者是冒泡排序法,進行調換后。最后返回主函數。
(2)流程圖

2.實驗代碼

void calc(struct student *p,int n) {
	int i=0,j=0;
	for(i=0;i<5;i++) {
		 (p+i)->sum = (p+i)->score[0] +(p+i)->score[1]+(p+i)->score[2];	
	}
}
void sort(struct student *p,int n) {
	int a=0,b=0;
	struct student tmp;
	for(a=0;a<4;a++) {
		for(b=0;b<4-a;b++) {
			if((p+b)->sum <(p+b+1)->sum) {
				tmp = p[b];
				p[b] = p[b+1];
				p[b+1] = tmp;
			}
		}
	}
}

3.本題調試過程碰到問題及解決辦法

遇到的問題1:將p[b+1].sum與p[b].sum的大小值進行后直接進行交換,導致最后輸出的

結果其它的不變,只是sum值發生了改變。
解決方法:在將dev c++上的輸出結果和要求的輸出結果對比后,發現了自己錯誤的地方,並改正。

遇到的問題2:在修改過第一個問題后,dev c++編譯時出現了上述圖片中出現的問題。
解決的方法:在翻譯錯誤提示后,嘗試性的將原先定義的 int tmp改成了struct student tmp,結構編譯成功,然后理解到此時的p[b]為結構類型,要使得tmp可以成為它們之間的交換介質,類型必須要相等,因此tmp的類型必須改成struct student。
關於'->':此符號只能用於指針上,如a.sum不能用a->sum來表示。

pta提交列表:

學習總結和進度

1、總結兩周里所學的知識點有哪些學會了?(可記錄每道作業題目所用的知識點)哪些還沒有學會?
答:在這兩周總的來說自己復習了指針及學習了結構類型,按照每道作業的知識點的話,可分為:
在第一次作業中主要考查的知識點對我來說應該是指針及對輸出不同要求字符串的方法,及最后一題的動態分配內存,前面三題自己是一下過的,但最后一題卡了很多次,說明自己對這個點的掌握並不是很熟練。
在第二次作業中覺得主要考查的是對結構類型函數的應用及結構類型函數元素中數組的使用,關於數組的方面自己是看教科書和上網查詢后才最終解決的問題,但現在的話覺得自己對這個點掌握的相對熟練。
在第三次作業中對我自身而言,主要考查的則是結構類型數據和子函數的調用的混搭,兩道題的算法並不是很難,但值得注意的是如果是結構類型的元素進行交換時,交換介質必須也為相同的類型。
2、將PTA作業的源代碼使用git提交到托管平台上,要求給出上傳成功截圖和你的git地址。





git地址:(https://git.coding.net/exo07/disizhouzuoye.git)
3、點評3個同學的本周作業
張金禹:( http://www.cnblogs.com/17-1/p/8687764.html)
高立彬:(http://www.cnblogs.com/gao628526/p/8665187.html)
徐銘博:(http://www.cnblogs.com/xmb1547828350/p/8657376.html)
4、請用表格和折線圖呈現你本周(3/26 8:00~4/9 8:00)的代碼行數和所用時間、博客字數和所用時間


免責聲明!

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



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