2018上C語言程序設計(高級)作業- 第2次作業


作業要求一

提交截圖:
6-7:

            6-8:

            6-9:

           7-1:

          7-2:

          7-3:

          7-4:

          7-5:

作業要求二

  • 題目6-7刪除字符中數字字符
    1、設計思路:
    (1)第一步:本題要求是刪除字符中的數字字符,我的主要思路是通過數組遍歷若遇到數字,就把其刪除,把之后的非數字的字符向前移動;
    第二步:根據此思路,首先定義兩個循環變量i,j;通過while條件語句來進行判斷數字字符,之后再逐一刪除,前移;
    2、實驗代碼:
#include "stdio.h"
void delnum(char *s)
{
	int i = 0,j = 0;  
    while(s[i] != '\0') {  
        if (!(s[i] >= '0' && s[i] <= '9')) {  
            s[j] = s[i];  
            j++;
        }  
        i++;  
    }   
    s[j] = '\0';
}
       3、本題調試過程碰到問題及解決辦法
                    本題是字符問題,當我在遇到這個問題的時候,只是有想法,知道怎么去做,但是卻不知道怎么去用if條件來判斷出數組中的是否含有數字字符。簡單的說我只會構思,不會去寫成代碼。其主要問題是在

就是不會寫這個條件;
改正方法:我去網站上找了下這個題,看了許多的大佬的程序,他們的代碼方式寫的有很多中,之后我自己找到了這個條件,之后就順利寫出這個題目了。

  • 題目6-8 統計子串在母串出現的次數
    1、設計思路:
    (1)第一步:首先要遍歷數組,若要找出子串在母串的出現次數,在遍歷數組的時候,利用if條件語句進行逐一的判斷;
    第二步:在遍歷的過程中,循環變量要逐一的相加,而不是看子串的字符個數,這樣才能較為准確的去查找出現次數;(自我感覺自己的算法比較麻煩,但是實在是想不出簡單的算法,就只能將就着用)
    2、實驗代碼
    (之前代碼)
#include<stdio.h>
int fun(char *str,char *substr)
{
	int result=0,i=0;
	for(i=0;str[i]!='\0';i++)
	{
		if(substr[0]==str[i]&&substr[1]==str[i+1]&&substr[2]==str[i+2])
		{
			result++;
		}
	}
	return result;
 } 

(改進后代碼)

int fun(char *str,char *substr)
{
	int result=0,i=0,j=0,f=0;
	for(i=0;str[i]!='\0';i++)
	{
		j=0,f=i;
		while(substr[j]==str[f])
		{
			if(substr[j+1]=='\0')
			{
				result++;
			}	
			j++,f++;
		}
	}
	return result;
 } 
       3、本題調試過程碰到問題及解決辦法
               本題沒有問題;
  • 題目6-9字符串中除首尾字符外的其余字符按降序排列
    1、設計思路:
    (1)第一步:本題可按照之前的非字符的冒泡排序的方法去來實現這個問題,只是在遍歷數組的時候,出去首尾兩項;
    第二步:根據這個思路,首先定義循環變量,之后遍歷數組(注:在遍歷數組的時候要注意不要包括首尾兩項)之后再按照冒泡的方法進行排序即可;
    2、實驗代碼
#include <stdio.h>
 int fun(char *s,int num)
 {
 	int i=1,j=1,max;
 	for(i=1;i<num-3;i++)
 	{
 		for(j=1;j<num-2;j++)
 		{
 			if(s[j]<s[j+1])
 			{
 				char swap;
 				swap=s[j];s[j]=s[j+1];s[j+1]=swap;
			 }
		  } 
	 }
 }
         3、本題調試過程碰到問題及解決辦法
               本題沒有問題;
  • 題目7-1輸出學生成績
    1、設計思路
    (1)第一步:根據題意,首先要定義一些相關的變量,例如學生人數n,循環變量i,等等;
    第二步:之后在創建內存動態存儲;(這個我之后按照老師上課講的照抄照搬,自己當時聽懂的內容也是不是很多,后來我也去上網查了許多的有關動態存儲的相關的教程,也算是略有了解,但還是理解的不夠深刻)
    第三步:在創建動態存儲之后,之后就開始在數組中存儲內容(成績),在存儲的同時可以進行求和,以便進行之后的求平均值的操作;
    第四步:存儲之后,求平均值,之后遍歷數組進行找最大值和最小值;(此時應把最大值和最小值變量先初始化為數組的首地址元素,方便比較)之后根據數組遍歷來找出最大值和最小值;
    第五步:最后便可按照題目要求進行輸出;
    (2)流程圖:

        2、實驗代碼
    
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n=0,i=0,*p,sum=0,max=0,min=0;
	double average=0;
	scanf("%d",&n);
	if((p=(int*)calloc(n,sizeof(int)))==NULL)
	{
		printf("Not able to allocate memory.\n");
		exit(1);
	}
	for(i=0;i<n;i++)
	{
		scanf("%d",p+i);
		sum=sum+*(p+i);
	}
	average=(double)(sum*1.0/n*1.0);
	max=*p;min=*p;
	for(i=0;i<n;i++)
	{
		
		if(max<*(p+i))
		{
			int swap=0;
			swap=max;max=*(p+i);*(p+i)=swap;
		}
	}
	for(i=0;i<n;i++)
	{
		
		if(min>*(p+i))
		{
			int tmp=0;
			tmp=min;min=*(p+i);*(p+i)=tmp;
		}
	}
	printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",average,(double)max,(double)min);
	free(p);
	return 0;
}
      3、本題調試過程碰到問題及解決辦法
             錯誤信息1:


這個問題是我把max和min的初始化都放到了for循環里面了,導致在提交的時候總是有一個點過不去;
改正方法:在出現這個錯誤之后,當時我也很納悶,因為我在輸入例題啥的都正確但就是不能過那個點。之后我也嘗試了老師所說的進行單步調試,在調試的過程中我發現了,每次在進行for循環的時候都會把max和min在初始化依次,當時只是略有懷疑,因為我還是很慣性的認為即使初始化也沒啥問題,因為輸出的結果還是正確的。但是它總是過不去這個點,之后我就去詢問同學,在同學幫助下,也是指出了這個問題,最終我把max和min初始化放到了for之前了最后通過了。

  • 題目7-2 計算職工工資
    1、設計思路:
    (1)第一步:首先先定義結構,根據題目要求,在定義的結構里定義職工的名字,基本工資,浮動工資和支出工資;(注意題目的精度要求)
    第二步:定義完結構之后,在主函數里根據題目要求來創建各個所需變量;
    第三步:創建所需變量之后,要做的就是要是給相應的變量賦初值,再根據題目的公式計算出所對於的實際工資,並輸出;
    (2)流程圖:

         2、實驗代碼:
    
#include<stdio.h>
struct workers
{
	char name[10];
	float bs;
	float tfw;
	float sw; 
};
int main()
{
	int n,i=0;
	scanf("%d",&n);
	struct workers w[n];
	for(i=0;i<n;i++)
	{
		scanf("%s %f %f %f",w[i].name,&w[i].bs,&w[i].tfw,&w[i].sw);
		
	}
	for(i=0;i<n;i++)
	{
		printf("%s %.2f\n",w[i].name,w[i].bs+w[i].tfw-w[i].sw);
	}
}
 3、本題調試過程碰到問題及解決辦法
         錯誤信息1:在寫本題的時候,我用了兩個時間段,一個是在剛發下題的時候,一個是在星期的時候。為啥有倆時間段,主要是在第一個時間段我在剛聽完老師講課之后幾乎是沒怎么聽懂,感覺就學了一個定義其他的應用一點也不會,之后拿到這個題也是很頭疼,看老師的代碼例子,看也看不懂。所以就寫不出來;
          解決方法:遇到這個題的時候我總感覺要用數組比較好,可老師沒有講這個問題,之后我就去書上往后看了幾頁找到用數組的例子,仿照例子就把這個問題解決了;
  • 題目7-3計算平均成績
    1、設計思路:
    (1)第一步:首先要定義結構,定義學生的學號,姓名和成績;(主要學號是用字符串的形式而不是整數型)
    第二步:之后在主函數中根據題目要求定義幾個變量;
    第三步:之后在給每個學生進行賦初值的操作,並且把各個學生的成績進行求和操作;
    第四步:求和之后即可求出平均值;
    第五步:再進行遍歷操作,找出在平均值下的學生,注意學生的成績和平均值的類型不同,要進行強轉,之后在進行比對找出在平均值下的學生;
    2、實驗代碼:
#include<stdio.h>
struct student
{
	char name[10];
	char id[5];
	int result;
};
int main()
{
	int n=0,i=0,sum=0;
	float average;
	scanf("%d",&n);
	struct student s[n];
	for(i=0;i<n;i++)
	{
		scanf("%s %s %d",s[i].id,s[i].name,&s[i].result);
		sum=sum+s[i].result;
	}
	average=(float)(sum*1.0/n*1.0);
	printf("%.2f\n",average);
	for(i=0;i<n;i++)
	{
		if((float)(s[i].result)<average)
		{
			printf("%s %s\n",s[i].name,s[i].id);
		}
	}
}
 3、本題調試過程碰到問題及解決辦法
        本題在調試過程中沒有碰到問題;
  • 題目7-4按等級統計學生成績
    1、設計思路:
    (1)第一步:根據題意,首先要找不及格的同學個數,故先定義循環變量j,和用來計數的變量result,之后經過遍歷再加上if條件來判斷不及格的人數;
    第二步:若要依據每個人的成績進行評判每個人的等級,首先需要遍歷這個數組,之后再用if條件進行判斷,在每個判斷條件里進行grade的賦值操作;
    第三步:因為在定義的函數里數組是用指針的方式,所以不需要進行返回,而所進行的找不及格的人數是int型的故需要返回值;
    2、實驗代碼:
#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
	int j=0,result=0;
	for(j=0;j<n;j++)
	{
		if(p[j].score<60)
		{
			result++;
		}
	}
	for(j=0;j<n;j++)
	{
		if(((p+j)->score)>=85&&((p+j)->score)<=100)
		{
			((p+j)->grade)='A';
		}else if(((p+j)->score)>=70&&((p+j)->score)<=84)
		{
			((p+j)->grade)='B';
		}else if(((p+j)->score)>=60&&((p+j)->score)<=69)
		{
			((p+j)->grade)='C';
		}else if(((p+j)->score)>=0&&((p+j)->score)<=59)
		{
			((p+j)->grade)='D';
		}
	}
	return result;
 } 
            3、本題調試過程碰到問題及解決辦法
                   本題沒有遇到太大的問題,只是在一開始寫程序的時候,我用的還是以前的那種數組結構,沒有用到指針,而指針用的不是太熟,之后我通過看上課時候代碼,仿照代碼把程序又改成用指針的形式;
  • 題目7-5 結構體數組按總分排序
    1、設計思路:
    (1)第一步:本題首先需要計算總分,故先在定義的第一個函數里進行定義循環變量k,之后通過遍歷數組來計算出總分;
    第二步:在計算出總分之后,便開始根據總成績進行排名。由此題目可仿照以前的一維數組中的冒泡排序的思路,根據分數這個變量進行判斷;(注:在進行交換的時候,定義的交換變量需要是那個已定義的類型。自我感覺,之后這樣才能通過主函數中的遍歷數組方法來進行排名)
    (2)流程圖:
    主函數:

                      第一個函數:
    

                  第二個函數:

    2、實驗代碼:
void calc(struct student *p,int n)
{
	int k=0;
	for(k=0;k<n;k++)
	{
		(p+k)->sum=(p+k)->score[0]+(p+k)->score[1]+(p+k)->score[2];
	}	
}
void sort(struct student *p,int n)
{
	int k=0,l=0;
	struct student swap;
	for(k=0;k<n;k++)
	{
		for(l=k+1;l<n;l++)
		{
			if(p[k].sum<p[l].sum)
			{
				swap=p[k];p[k]=p[l];p[l]=swap;
			}
		}
	}
	
}
  3、本題調試過程碰到問題及解決辦法
       錯誤信息1:在寫這個程序的時候,我的思路一開始就比較的明確。所以在寫的時候比較的順利,但在第二個函數中出現了問題,當時我定義的用來交換的變量是float型的,還是按照以前的那種思路進行交換,但在運行的過程中發現,輸出結果每個人對應的總成績是不對應的。


改正方法:在遇到這個問題的時候,我當時也是很懵,但是確實不知道怎么改。但自從聽了老師上課講說上網查代碼之類的對自己的邏輯分析能力提高不是很好,我就決定不到最難的時候不去查。其實我也很認可老師的觀點。於是我就把上課講的內容想了一遍,感覺這個是定義類型的問題,於是改了類型之后就很容易的通過了。通過這個錯誤,也許它不是什么難題,但對我來說卻很為自己獨立想出而高興的。

作業要求三、學習總結和進度

1、總結兩周里所學的知識點有哪些學會了?(可記錄每道作業題目所用的知識點)哪些還沒有學會?

這兩周所學會的知識點:

這兩周我學會了關於字符串的跟深層次的應用,並且比上兩周在應用指針方面更加的熟練。這兩周還學了有關結構的定義,對這個自己覺得運用的還是不夠嫻熟。對於結構這里的知識點,上課的內容現在也懂了,但在做題的時候總是不太喜歡用老師講的那些方法。可能在理解上有些不同吧。

還沒有學會的知識點:

這兩周的課上知識點自己感覺學的還可以,只是在運用上很是欠佳,可能正如老師說那樣,遇到問題自己多去思考,對方面自己很欠缺,邏輯能力不強,有很多問題其實很簡單就是想不出來,當看了網上的那些代碼之后就一下豁然開朗。在這邏輯方面還需要提升。

2、將PTA作業的源代碼使用git提交到托管平台上,要求給出上傳成功截圖和你的git地址。

 Git地址:

Git地址
上傳截圖:

3、點評3個同學的本周作業(在作業中給出被點評同學博客的鏈接),並邀請3名同學點評你的作業。

   ①點評的三位同學:

董欣
董雅潔
豐大為
②邀請三位同學點評:
董欣
董雅潔
執念丶。

4、請用表格和折線圖呈現你本周(3/26 8:00~4/9 8:00)的代碼行數和所用時間、博客字數和所用時間。

   表格:

折線圖:


免責聲明!

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



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