1. 程式人生 > >C語言課設-班級成績統計分析

C語言課設-班級成績統計分析

2014年9月3日 幫別人寫的 (王藝) 

//定義標頭檔案
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//巨集定義
#define MAX 18
#define MAXLIN 100
//一個學生的結構體儲存結構
typedef struct Stu{				//存資料用的
	char num[MAX];		//學號
	char name[MAX];		//姓名
	char sex[MAX];		//性別
	char banji[MAX];	//班級
	char math[MAX];		//數學
	char english[MAX];	//英語
	char wuli[MAX];		//物理
}Stu;
//一個班級的數學結構體
typedef struct ban{
	int name;
	int math;
	int renshu;
}ban;
int counts=0;		//全域性計數
//字串擷取函式
void substring(char *s,int i,int n,char *t)	
{
 int j=0;
 for(;j<n;j++)
  t[j]=s[i++];
 t[j]=0;
}
//==================================================================================================================================
//只是讀取
//==================================================================================================================================
//初始化函式  讀取所有學生
void Init(Stu stu[MAXLIN]){				//這個函式只是讀取  別的函式呼叫了這個函式
	counts=0;
	char str1[20]={"D:\\File04.txt"};		//讀取的檔名
	FILE *fp;						//檔案指標
	char haha[35]={"NULL"};			//取資料結構陣列
	char haha1[27];					//取具體數值陣列
	if((fp=fopen(str1,"rt"))==NULL){		//開始讀取
		printf("資料夾開啟失敗!\n");
		exit(0);
	}
	fgets(haha,36,fp);			//讀取資料結構	
	while(fgets(haha1,28,fp)!=NULL){				//迴圈讀取具體數值,並輸出
		substring(haha1,0,3,stu[counts].num);		//學號
		substring(haha1,4,6,stu[counts].name);		//姓名
		substring(haha1,11,2,stu[counts].sex);		//性別
		substring(haha1,14,3,stu[counts].banji);		//班級
		substring(haha1,18,2,stu[counts].math);		//數學
		substring(haha1,21,2,stu[counts].english);	//英語
		substring(haha1,24,2,stu[counts].wuli);		//物理
		counts++;
	}
	fclose(fp);				//關閉檔案
}
//==================================================================================================================================
//求所有班級      功能3 呼叫
//==================================================================================================================================
//初始化班級 
void InitBanji(Stu stu[MAXLIN],ban b[MAXLIN],int &p){				//實現功能2
	int countban=0;		//記錄一共多少條班級資料  有重複的班級
	int a,bb,c;			//字串轉為 數字 用到
	Init(stu);	//呼叫初始化函式,進行初始化
	int countbanji[MAXLIN];				//儲存班級字串
	for(int i=0;i<counts;i++){				//迴圈把 字串變為 整形
		a=stu[i].banji[0]-'0';				//字串變為整形  -'0'
		bb=stu[i].banji[1]-'0';
		c=stu[i].banji[2]-'0';
		countbanji[countban++]=a*100+bb*10+c;	//賦值成一個百位數
	}
	//資料去重  並把資料輸出來
	for(i=0;i<countban;i++){
		for(int j=0;j<i;j++){
			if(countbanji[i]==countbanji[j]){
				break;
			}
		}
		if(i==j){
			b[p++].name=countbanji[i];
		}
	}
}
//==================================================================================================================================
// 功能1
//==================================================================================================================================
//讀入功能函式  這個是最開始寫的功能 和初始化有點重複 本可以呼叫初始化函式 但也沒問題 我懶得改了
void DuRu(Stu stu[MAXLIN]){									//對應的功能是1
	int count=0;		//計數
	char str1[20]={"D:\\File04.txt"};		//讀取的檔名
	FILE *fp;						//檔案指標
	char haha[35]={"NULL"};			//取資料結構陣列
	char haha1[27];					//取具體數值陣列
	if((fp=fopen(str1,"rt"))==NULL){		//開始讀取
		printf("資料夾開啟失敗!\n");
		exit(0);
	}
	fgets(haha,36,fp);			//讀取資料結構	
	printf("%s\n",haha);		//輸出資料結構
	while(fgets(haha1,28,fp)!=NULL){				//迴圈讀取具體數值,並輸出
		substring(haha1,0,3,stu[count].num);		//學號
		substring(haha1,4,6,stu[count].name);		//姓名
		substring(haha1,11,2,stu[count].sex);		//性別
		substring(haha1,14,3,stu[count].banji);		//班級
		substring(haha1,18,2,stu[count].math);		//數學
		substring(haha1,21,2,stu[count].english);	//英語
		substring(haha1,24,2,stu[count].wuli);		//物理
		printf("%s\t",stu[count].num);			//輸出
		printf("%s\t",stu[count].name);
		printf("%s\t",stu[count].sex);
		printf("%s\t",stu[count].banji);
		printf("%s\t",stu[count].math);
		printf("%s\t",stu[count].english);
		printf("%s\n",stu[count].wuli);
		count++;
	}
	printf("\n");
	fclose(fp);				//關閉檔案
	printf("檔案%s輸出完畢",str1);		//輸出完畢提示
	printf("\n\n");			//換行
}
//==================================================================================================================================
//功能2
//==================================================================================================================================
//確定班級函式
void BanJi(Stu stu[MAXLIN]){
	int countban=0;		//記錄一共多少條班級資料  有重複的班級
	int a,b,c;			//字串轉為 數字 用到
	Init(stu);	//呼叫初始化函式,進行初始化
	int countbanji[MAXLIN];				//儲存班級字串
	for(int i=0;i<counts;i++){				//迴圈把 字串變為 整形
		a=stu[i].banji[0]-'0';				//字串變為整形  -'0'
		b=stu[i].banji[1]-'0';
		c=stu[i].banji[2]-'0';
		countbanji[countban++]=a*100+b*10+c;	//賦值成一個百位數
	}
	//資料去重  並把資料輸出來
	printf("\n這些學生所屬的班級有:\n");
	for(i=0;i<countban;i++){
		for(int j=0;j<i;j++){
			if(countbanji[i]==countbanji[j]){
				break;
			}
		}
		if(i==j){
			printf("%d\n",countbanji[i]);
		}
	}
	printf("所有班級輸出完畢!\n\n");
}
//==================================================================================================================================
//功能3
//==================================================================================================================================
//計算數學平均成績函式
void Math(Stu stu[MAXLIN]){
	int a,bb,c,m,n;
	ban b[MAXLIN];
	int p=0;
	InitBanji(stu,b,p);		//初始化班級資訊
	for(int i=0;i<p;i++){
	//	printf("%d\n",b[i].name);
		b[i].math=0;
		b[i].renshu=0;
	}
	//計算求各班 對應的數學成績 與 人數
	for(int j=0;j<counts;j++){
		a=stu[j].math[0]-'0';		//數學成績
		bb=stu[j].math[1]-'0';
		m=a*10+bb;
		a=stu[j].banji[0]-'0';		//班級
		bb=stu[j].banji[1]-'0';
		c=stu[j].banji[2]-'0';
		n=a*100+bb*10+c;
		for(i=0;i<p;i++){			//成績與人數匹配對應 班級
			if(b[i].name==n){
				b[i].math+=m;
				b[i].renshu++;
				break;
			}
		}
	}
	printf("\n各班數學平均成績如下\n");		//對各個班級數學成績進行輸出
	for(int z=0;z<p;z++){
		printf("班級:%d\t",b[z].name);
		printf("數學總分:%d\t",b[z].math);
		printf("班級人數:%d\t",b[z].renshu);
		printf("班級數學平均成績:%d\n",b[z].math/b[z].renshu);
	}
	printf("輸出完畢!\n\n");
}
//==================================================================================================================================
//退出函式
//==================================================================================================================================
void TuiChu(){
	printf("\n謝謝您的使用!\n");	//輸出友情話語
}
//==================================================================================================================================
//主函式
//==================================================================================================================================
int main(){
	int choice;  //選擇
	Stu stu[MAXLIN];		//結構體陣列
	while(true){		//死迴圈,運算元不止一次
		//輸出介面
		printf("**********歡迎使用班級成績統計分析系統**********\n");
		printf("----------讀入資料請輸入 1  --------------------\n");
		printf("----------確定班級請輸入 2  --------------------\n");
		printf("----------計算班級數學平均成績  請輸入 3  ------\n");
		printf("----------退出請輸入 0  ------------------------\n");
		printf("您的選擇是:");
		//輸入要進行的操作選擇
		scanf("%d",&choice);
		//異常處理
		if(choice<0||choice>3){
			printf("請輸入 0--3 之間的數!\n");
			//接著輸入
			continue;
		}
		//根據選擇進入相應的功能函式
		switch(choice){
		case 1: DuRu(stu);
			break;
		case 2: BanJi(stu);
			break;
		case 3:	Math(stu); 
			break;
		case 0:	TuiChu(); 
			exit(0);
		}
	}
	//返回0
	return 0;
}

執行程式截圖:

 

選擇1:

 

選擇2:

 

選擇3:



相關推薦

C語言-班級成績統計分析

2014年9月3日 幫別人寫的 (王藝)  //定義標頭檔案 #include<stdio.h> #include<string.h> #include<stdlib.h> //巨集定義 #define MAX 18 #define M

C語言 投票管理系統

學生黨一枚,大二的時候,學校讓做C語言課程設計,我選了“投票管理系統”。C語言水的很,寫出來之後,自己感覺良好,答辯的時候罵的老慘,可成績卻是第一。[\dog][\dog][\dog] 文末見程式碼,有五個檔案,如圖。 第一個是儲存投票的磁碟檔案,防止系統關閉後資料丟

C語言——電影院選票系統

出錯 維數 介紹 txt 用戶名 位置 數據 交互性 表示 C語言課設——電影院選票系統 1.課題介紹 大家都愛看電影,現請參考一個熟悉電影票預訂系統,實現C語言版的訂票系統。了解訂票如何實現的。系統主要有2類用戶:管理員用戶和顧客用戶。 管理員用戶 1.電影放映廳信息管

C語言銷售管理系統設計

一.          C程式設計課程設計題目簡介 該設計要求學生以某公司銷售管理業務為背景,設計、開發一套“銷售管理系統”軟體。 通過該題目的設計過程,可以培養學生結構化程式設計的思想,加深對高階語言基本語言要素和控制結構的理解,針對c語言中的重點和難點內容進行訓練,獨

C語言例程系列》-- 統計平均成績

#include <stdio.h> #define NUM 10 int main() { int s[NUM]; int i,sum = 0; for(i = 0; i < NUM; i++) {

C語言進階——enum, sizeof, typedef 分析11

def 進階 new %d 計算 void var ray 枚舉類型 枚舉類型的使用方法: enum是C語言的 一種自定義類型 enum值是可以根據需要自定義的整型值 第一個enum的值默認為0 默認情況下的enum值是在前一個定義值的基礎上加 1 enum類型的變量

c語言 要求按照考試成績的等級輸出百分制分數段,成績的等級由鍵盤輸入

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c語言圓半徑r = 1.5,圓柱高h = 3,求圓周長,圓面積,圓球表面積,圓球體積,圓柱體積

要求scanf輸入資料,並有相應文字說明 #include<stdio.h> int main() { float r,h,pi=3.141592 ; printf("請輸入圓半徑r和圓柱高h:"); scanf("%f%f",&r,&h); printf(

C語言函式呼叫過程的彙編分析

轉自:   http://www.cnblogs.com/xiaojianliu/articles/8733560.html   下面一段C程式: int bar(int c, int d) { int e = c + d; return e; }

c語言上作業——初學連結串列操作

http://www.cnblogs.com/maluning/p/7966875.html 根據上面的大佬的指導。今天完成了老師的作業。第一次完成了連結串列的建立、遍歷、插入、刪除(基本靠抄,不好意思)。 作為一個菜鳥,第一次完成100行以上的不用複製重複程式碼的程式碼。好興奮呀。 //不過還是有一點

C語言-字符串典型問題分析

++ hello mar lse inf sso size eof shift 1、典型問題一 下面的程序輸出什麽為什麽? 1 #include <stdio.h> 2 3 int main() 4 { 5 char buf

#C語言基礎知識歸納和例題分析(1)

## C語言基礎知識歸納和例題分析(1) 計算機程式和計算機語言 1.程式 就是一組計算機能識別和執行的指令 2.計算機語言經歷的幾個階段 機器語言(直接執行)→符號語言(又稱組合語言)→高階語言 3.高階語

C語言作業3-陣列-1統計文章各字元型別數目

C語言作業3-陣列-1統計文章各字元型別數目 問題描述: 有1篇文章,共有3行文字, 每行有80個字元,要求分別統計其中的英文大寫字母、小寫字母、數字、及其他字元的個數 程式碼實現: #include<stdio.h> #include<stdlib.h>

c語言製作簡單的成績判斷系統

#incllude <stdio.h> #include <stdlib.h> int main() {     int x; while(1){printf("輸入成績x:\n");     scanf("%d",&x);     if(x

快速排序演算法(c語言演算法實現)-------精簡原理分析

    “快速排序法”使用的是遞迴原理,下面我結合一個例子來說明“快速排序法”的原理。首先給出一個數組{53,12,98,63,18,72,80,46, 32,21},先找到第一個數--53,把它作為中間值,也就是說,要把53放在一個位置,使得它左邊的值比它小,右邊的值比它大。{21,12,32, 46,18

c語言 輸入一行字元,統計其中有多少個單詞,單詞之間用空格分隔開

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c語言課程設計—學生成績管理系統

學生成績管理系統是比較適合初學者的。它涵蓋了c語言幾乎知識。對於學了c語言的人,把這個課程設計搞好(當然自己能設計出來是要有很好的基礎)。不管自己能不能夠完成,最重要的是能弄懂。參考其他資料,試著自己編寫是不錯的選擇。這個課程設計也是我參照資料,自己編寫的。自己適當地增加了

C語言:輸入一行字串統計出英文字母,空格,數字和其他字元的個數

題目要求 輸入一行字串統計出英文字母,空格,數字和其他字元的個數。 程式分析 要統計英文字母,空格,數字和其他字元的個數,則要遇到他們加一。 核心程式碼如下: while ((c=getchar())!='\n') { if ((c >= 'a' &

c語言連結串列-學生成績管理系統

大學時候用連結串列寫的成績管理系統,可實現增刪查改的功能,程式碼如下 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #d

SQL成績統計分析—排名問題

select * from studentScore select ROW_NUMBER() over (order by studentScore desc,id desc) number,* from studentScore 下面介紹下在SQL成績統計分析中遇到的