2018第二次作業


一.代碼:



1. 刪除字符串中數字字符:

1).設計思路:

(1).文字描述:

第一步:主函數,定義一個數組,寫入數組,引用函數,輸出。
第二步:定義一個指針p並將s賦給*p,用一個for循環遍歷字符串,並在其中用一個if語句判斷是否是數字,如果是 p++=s ,循環過后將最后一個賦上‘\0’;

(2).流程圖:

主函數

函數

2).實驗代碼

` 
#include <stdio.h>
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
 delnum(item);
 printf("%s\n",item);
 return 0;
}

void delnum(char *s)
{
	char *p = s;
	for(;*s;s++)
   {
         if ( *s >'9' || *s < '0' )
               *p++=*s ;
   }
   *p='\0';
	 
}       
`

3).遇到的問題:

未遇到問題。

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

1).設計思路:

(1).文字描述:

第一步:主函數定義一個待查找的數組並賦值,定義一個被查找的字符串,引用函數並將函數的值賦給n,輸出n的值。
第二步:函數,遍歷字符串,並在for語句中用一個if語句判斷當前三個字符分別為a,s,d如果是n++,最后統計出n的值,最后返回n值。

2).實驗代碼

`
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 int n;
 n=fun(str,substr);
 printf("n=%d\n",n);
 return 0;
}

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

int fun(char *str,char *substr) 
{
	int count = 0;
	char *p=str,*ps= substr;
	for(;*p != '\0';p++){
		ps = substr;
		if(*ps == *p){
			while(*p == *ps){
				if(*p == *ps){
				p++;
				ps++;
			}else break;
			}
			
		}
		if(*p == '\0'){
			count ++;
		}
	}	
	return count;
 }      
`

3).遇到的問題:

未遇到問題。

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

1).設計思路:

(1).文字描述:

第一步:主函數,定義字符數組s,寫入字符串,引用函數,輸出排序后所得的字符串。
第二步:函數,用一個for循環表示循環的趟數,由於只需要排出排除首尾的順序所以只需要循環num-3次,在此循環下再用一次循環進行排序,並且只需要排出從第二個到num-j-2個數的順序。

2).實驗代碼

`    
#include <stdio.h>
int fun(char *s,int num);
int main()
{
 char s[10];
 gets(s);
 fun(s,7);
 printf("%s",s);
 return 0;
 }

int fun(char *s,int num)
{
	int i,j;
	char t;
	for(j=0;j<num-3;j++)
       for(i=1;i<num-j-2;i++)
        if(s[i]<s[i+1])
       {t=s[i]; s[i]=s[i+1]; s[i+1]=t;}
}    
`

3).遇到的問題:

在for語句中循環次數錯過兩次,出現下面的問題。

這個問題是因為運用冒泡排序法的時候for循環次數過多。
之后通過改進for循環的次數糾正了錯誤。

4. 輸出學生成績:

1).設計思路:

(1).文字描述:

第一步:輸入數字個數n,動態存儲分配。
第二步:用for語句進行輸入數據,並計算和,for語句結束后計算出平均值。
第三步:令最大,最小值等於第0個數,遍歷所有數據,並在其中用兩個if語句判斷出最大值和最小值並記錄。
第四步:輸出最大最小值和平均數。

2).實驗代碼

`
#include<stdio.h>

int main()
{
	int *p,i,sum = 0,max,min,n;
	double avg;
	scanf("%d",&n);
	
	if((p=(int*)calloc(n,sizeof(int)))==NULL){
   		 exit(1);
    }
    
	for(i=0;i<n;i++){
        scanf("%d",&*(p+i));
		sum = sum + *(p+i);}
	
	avg = (double)sum /(double) n;
	max = *p;
	min = *p;
	for(i=1;i<n;i++){
		if(*(p + i) > max){
			max = *(p+i);
		}
		
		if(*(p + i) < min){
			min = *(p+i);
		}
	}
      
	printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,(double)max,(double)min);
              free(p);
	
}        
`

3).遇到的問題:

再求平均數的時候忘記轉化成double型了,導致最后輸出的數全為整數。

5計算職工工資:

1).設計思路:

(1).文字描述:

第一步:定義一個結構體,並在其中定義姓名,基本工資,浮動工資和支出。
第二步:主函數中輸入數據個數n,引用結構體。
第三步:用一個for循環進行數據錄入,再用一個for循環將計算后的數據輸出。

(2).流程圖:

2).實驗代碼

`
#include <stdio.h>


struct emp{
        char  name[10];
        double jbg;
        double fdg;
        double zc;
    } ;
    
int main ()
{
    
    int i, n;
    scanf("%d", &n);
    struct emp s[n] ;
 for(i=0;i<n;i++)
 {
 	scanf("%s %lf %lf %lf",s[i].name,&s[i].jbg,&s[i].fdg,&s[i].zc);
 }
     for (i = 0; i < n; i++)
  {
  	printf ("%s %.2lf\n", s[i].name, s[i].jbg + s[i].fdg - s[i].zc);
  }
}
`

3).遇到的問題

在主函數中忘記引用“struct emp s[n] ;”導致錯誤。
請教班級的同學后進行改正。

6. 計算平均成績:

1).設計思路:

(1).文字描述:

第一步:定義一個結構體,並在其中定義學號num,姓名name,分數score。
第二步:主函數中先輸入整數n,引用結構體,用一個for循環輸入學號,姓名,分數並計算出分數的和。
第三步:計算出平均數。
第四步:用一個for循環遍歷數據,並用if語句判斷當前分數是否低於平均數,如果是輸出相應的姓名和學號。

2).實驗代碼

`
#include <stdio.h>

struct student{
		
        char num[10],name[10];
        double score;
};
    
int main ()
{
    double avg,sum = 0;
    int i, n;
    scanf("%d", &n);
    struct student s[n] ;
	for(i = 0;i < n;i ++)
	{
	 	scanf("%s %s %lf",&s[i].num,s[i].name,&s[i].score);
	 	sum = sum + s[i].score;
	}
	 
	 avg = sum / n;
	 printf("%.2lf\n",avg);
	 
	for(i = 0; i < n; i++)
	{
	  	if(s[i].score < avg)
	  	printf ("%s %s\n", s[i].name,s[i].num);
	}
}
`

3).遇到的問題:


出現上面的情況輸出學號的時候前面的0不見了。
后來想到要想保留前面的0需要將學號的類型改為字符型。

7. 按等級統計學生成績:

1).設計思路:

(1).文字描述:

第一步:定義一個結構體,並在其中定義學號num,姓名name,分數score,成績等級grade。
第二步:主函數中:引用結構體,並輸入學生個數n,用一個for語句進行數據錄入,引用函數進行計算,最后進行輸出。
第三步:函數中:用for語句進行遍歷,並用if語句進行等級的區分,其中如果在D等級則不及格人數count加一。最后返回count值。

2).實驗代碼

`
#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

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

    `

3).遇到的問題:

最開始沒有看到返回不及格人數的條件,導致前兩個點出現錯誤。

8. 結構體數組按總分排序:

1).設計思路:

(1).文字描述:

第一步:定義一個結構體,並在其中定義學號num,姓名name,分數score,分數和sum。
第二步:主函數中:先引用結構體,用一個for語句進行數據輸入,引用函數calc求出每名學生的總分,函數sort按每名學生的總分從高到低對這組數據進行排序,用一個for語句進行輸出。
第三步:函數calc:僅需一個for語句進行遍歷,並在遍歷過程中算出sum值。
第四步:函數sort:定義一個結構體t為之后交換做准備,之后用冒泡排序法進行排序即可。

(2).流程圖:

主函數:

函數calc:

函數sort:

2).實驗代碼

`
#include <stdio.h>
struct student					
{
int num;
char name[15];
float score[3];
float sum;
};
void calc(struct student *p,int n);	 
void sort(struct student *p,int n);
int main()
{
struct student stu[5];
int i,j;
float f;
for(i=0;i<5;i++)
{
	scanf("%d%s",&stu[i].num,stu[i].name);
	for(j=0;j<3;j++)
	{ 
    	scanf("%f",&f);
		stu[i].score[j]=f;
	}
}
calc(stu,5);
sort(stu,5);
for(i=0;i<5;i++)
{
	printf("%5d%15s",stu[i].num,stu[i].name);
	printf("  %.1f  %.1f  %.1f  %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
}
return 0;

}

void calc(struct student *p,int n)
{
	int i;
	for(i = 0;i < n;i ++,p++){
		p->sum = p->score[0] + p->score[1] + p->score[2];
		
	}
}

void sort(struct student *p,int n)
{
	int j,i;
	struct student t;
 		for(j=1;j<=n-1;j++)
       for(i=0;i<=n-j-1;i++){
       		if((p + i)->sum < (p + i + 1)->sum){
       			t = *(p + i);
       			*(p + i)= *(p+ i + 1);
       			*(p+ i + 1)= t;
			   }
	   }
}
	


    `

3).遇到的問題:

最初在第二個函數中將t定義為int型,發現編譯的時候出現問題,最后改為引用結構體定義t;

二,學習總結和進度:

1.近期所學知識點:

首先是對指針進行了深入的復習,並對pta中出現的問題進行講評。之后,這兩周主要學習了結構。首先學習的就是對結構體的概念和定義,並且在所需結構調用時需要在函數中調用一下結構體再去使用。再之后學習到結構數組,其中引用格式為結構數組名[下標].結構成員名。最后,學到了結構指針引用格式可以為p->結構成員名。

2.Git:

Git地址;

3.學習進度:

1).表格:

日期 代碼行數 代碼時間 博客字數 博客時間 知識點
3.26 100 90 0 0 pta
3.27 150 120 0 0 pta
3.28 0 0 500 120 博客園
3.29 200 120 0 0 pta
3.30 50 30 0 0 結構體
3.31 100 50 100 60 pta
4.1 0 0 50 60 博客園
4.2 200 90 300 90 pta
4.3 0 0 200 60 博客園
4.4 50 30 0 0 結構體的引用
4.5 100 50 0 0 結構體與數組
4.6 80 30 0 0 結構體與數組
4.7 100 60 100 60 結構體與指針
4.8 80 60 100 30 結構體與指針

2).折線圖:

4.作業互評:

1,點評同學作業:

於耀淞;
胡景文;
趙寅勝;

2,邀請同學點評作業:

胡景文;
班慶澤;
董欣;


免責聲明!

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



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