C语言新手练手—小场景编程

成绩等级判断

注意程序不是一下就写出来的,要经过调试。有一个叫黑盒测试,我的理解是看不到源码,去测试程序功能。
以下程序都是先在主函数里构思好函数,最后再去实现功能模块。

#include <stdio.h>

void display(void);
void scoreSCAN(int *score);
void scorePRIN(int score);

int main(void)
{
	int score=0;
	while(1)
	{
	//1.成绩输入提示
		display();
	//2.成绩输入
		scoreSCAN(&score);
		if(score==111){
			printf("See you!\n");
			break;
		}
	//3.成绩判断并输出结果
		scorePRIN(score);
	}
	return 0;
}

void display(void)
{
	printf("###<><><><><><>$$$$<><><><><>SCORE<><><><><>$$$$<><><><><><>###\n");
	printf("please input score(total score 100,quit is 111):\n");
}

void scoreSCAN(int *score)
{
	Again:
	scanf("%d",score);
	getchar();//有一个问题,我们在电脑键盘上输入时常忽略了回车。
	if(*score == 111)return;
	if(*score <0 || *score >100){
		printf("your input is error!!!\ninput again:");
		goto Again;
	}
}

void scorePRIN(int score)
{
	if(score==100)
	{
		printf("your score is perfect!A+\n");
	}else{
		switch(score/10)
		{
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
				printf("your score no pass.D\n");
					break;
			case 6:
				printf("your score pass.C\n");
					break;
			case 7:
			case 8:
				printf("your score ok.B\n");
					break;
			default:
				printf("your score good.A\n");
		}
	}
}

简易计算器

#include <stdio.h>

void dispaly();
void symbollSCAN(char *sf);
void dataSCAN(int *data1,int *data2);
void conpulter(char sf,int data1,int data2);

int main(void)
{
	char sf;
	int data1,data2;
	//1.提示
	dispaly();
	while(1)
	{
		//2.计算方式选择
		symbollSCAN(&sf);
		if(sf=='q')break;
		//3.计算数值输入
		dataSCAN(&data1,&data2);
		//4.计算并输出结果
		conpulter(sf,data1,data2);	
	}
	printf("See you again.\n");
	return 0;
}

void dispaly()
{
	int i=5;
	while(i--)
	{	
		if(i==2)printf("$$$     simple calculator     $$$\n");
		else printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
	}
}

void symbollSCAN(char *sf)
{
	while(1)
	{
		printf("please input (+ - * / %%,<q> is quit):");
		scanf("%c",sf);
		getchar();
		if(*sf!='+' && *sf!='-' && *sf!='*' && *sf!='/' && *sf!='%' && *sf!='q')
		{
			printf("input error,please input again.\n");
		}else break;
	}
}

void dataSCAN(int *data1,int *data2)
{
	printf("please input data1:");
	scanf("%d",data1);
	getchar();
	printf("please input data2:");
	scanf("%d",data2);
	getchar();
}

void jia(int data1,int data2)
{
	int result=0;
    result=data1+data2;
	printf("result:%d+%d=%d\n",data1,data2,result);
}

void jian(int data1,int data2)
{
	int result=0;
	result=data1-data2;
	printf("result:%d-%d=%d\n",data1,data2,result);
}

void cheng(int data1,int data2)
{
	int result=0;
	result=data1*data2;
	printf("result:%d*%d=%d\n",data1,data2,result);
}

void chu(int data1,int data2)
{
	float result=0;
	result=(float)data1/data2;   //此处为类型强转
	printf("result:%d/%d=%.2f\n",data1,data2,result);
}

void quyu(int data1,int data2)
{
	int result=0;
	result=data1%data2;
	printf("result:%d%%%d=%d\n",data1,data2,result);
}

void conpulter(char sf,int data1,int data2)
{
	switch(sf) //虽然比较LOW 但是我还是用拼音命名变量名,尽情笑话我吧!因为我TM自己都笑了。其实我平时很严肃的,所以偶尔的傻逼行为给我带来了不一样的感触.当然工作中可不能这么搞。
	{
		case '+':jia(data1,data2);break;
		case '-':jian(data1,data2);break;
		case '*':cheng(data1,data2);break;
		case '/':chu(data1,data2);break;
		case '%':quyu(data1,data2);break;
	}
}

数组模拟学生成绩操作应用

#include <stdio.h>

void scoreSCAN(int score[],int len);
void scorePRIN(int *score,int len);
int foundMAXscore(int *score,int len);
int foundMINscore(int *score,int len);
float foundAVEscore(int *score,int len);

int main(void)
{
	int score[7];
	int len=sizeof(score)/sizeof(score[0]);
	int max, min;
	float ave;
	
	//1.成绩录入
	scoreSCAN(score,len);
	//2.成绩输出
	scorePRIN(score,len);
	//3.找最高分
	max=foundMAXscore(score,len);
	//4.找最低分
	min=foundMINscore(score,len);
	//5.找平均分
	ave=foundAVEscore(score,len);
	//6.结果输出
	printf("MAX:%d\nMIN:%d\nAVE:%.2f\n",max,min,ave);
	return 0;
}

void scoreSCAN(int score[],int len)
{
	int i;
	for(i=0;i<len;i++)
	{
		printf("please input %d student score:",i+1);
		scanf("%d",&score[i]);
		getchar();
	}
}

void scorePRIN(int *score,int len)
{
	while(len--)
	{
		printf("%d ",*score++);
	}
	putchar('\n');
}

int foundMAXscore(int *score,int len)
{
	int mx=score[0];
	int i;
	for(i=0;i<len;i++)
	{
		if(mx<score[i])mx=score[i];
	}
	return mx;
}

int foundMINscore(int *score,int len)
{
	int mx=*score;
	while(len--)
	{
		if(mx>*score)mx=*score;
		score++;
	}
	return mx;
}

float foundAVEscore(int *score,int len)
{
	int ch=len;
	float ave;
	int total=0;
	while(len--)
	{
		total+=*score++;
	}
	return (float)total/ch;
}

进阶——使用结构体数组和结构体指针

下面两个程序是之前好久写得,现在回头看会觉得有很多问题,代码臃肿,有许多地方可以优化
结构体指针学生成绩进阶

#include <stdio.h>
#include <stdlib.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
typedef struct student 
{
	char *name;
	int score;
}STU;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
STU* informationSCAN(int len)
{
	int i;
	STU *head=(STU*)malloc(sizeof(STU)*len);
	for(i=0;i<len;i++)
	{
		printf("please input student name:");
		head[i].name=(char*)malloc(30);
		scanf("%s",head[i].name);
		printf("please input student score:");
		scanf("%d",&head[i].score);
	}
	return head;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void informationPRIN(STU *head,int len)
{
	while(len--)
	{
		printf("Student:%d   %s\n",head->score,head->name);
		head++;
	}
	putchar('\n');
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void maopaoSX(STU *head,int len)
{
	int i, j;
	i=j=0;
	STU temp;
	for(i=0;i<len;i++)
	{
		for(j=i+1;j<len;j++)
		{
			if(head[i].score>head[j].score)
			{
				temp=head[i];
				head[i]=head[j];
				head[j]=temp;
			}
		}
	}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void maopaoJX(STU *head,int len)
{
	int i, j;
	i=j=0;
	STU temp;
	for(i=0;i<len;i++)
	{
		for(j=i+1;j<len;j++)
		{
			if(head[i].score<head[j].score)
			{
				temp=head[i];
				head[i]=head[j];
				head[j]=temp;
			}
		}
	}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
STU maxSTU(STU *head,int len)
{
	STU max=*head;
	int i;
	for(i=0;i<len;i++)
	{
		if(max.score<head[i].score)max=head[i];
	}
	return max;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
STU minSTU(STU *head,int len)
{
	STU min=*head;
	int i;
	for(i=0;i<len;i++)
	{
		if(min.score>head[i].score)min=head[i];
	}
	return min;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
float aveSTU(STU *head,int len)
{
	int total=0;
	int i;
	for(i=0;i<len;i++)
		{
		total+=head->score;
		head++;
	}
	return (float)total/len;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void display()
{
	int i;
	for(i=0;i<5;i++)
	{
		if(i==2)
		{
			printf("[]-------------> STUDENT SCORE SYSTEM <-------------[]\n");
		}else{
			printf("[][][][][][][][][][][][][][][][][][][][][][][][][][][]\n");
		}
		
	}
}

int main()
{
	int len;
	
	display();

	printf("How many student:");
	scanf("%d",&len);
	STU *stu1=informationSCAN(len);
	informationPRIN(stu1,len);
	
	maopaoJX(stu1,len);
	informationPRIN(stu1,len);	
	maopaoSX(stu1,len);
	informationPRIN(stu1,len);

	STU max=maxSTU(stu1,len);
	STU min=minSTU(stu1,len);
	float ave=aveSTU(stu1,len);
	printf("MAX:%s %d\nMIN:%s %d\nAVE:%f\n",max.name,max.score,min.name,min.score,ave);
	
	free(stu1);
	printf(">>>>>>>>>>>>>>>>>>>>> See You! <<<<<<<<<<<<<<<<<<<<<<\n");
	return 0;
}

结构体数组功能扩展版——学生成绩系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*----------------------------------------------*/
typedef struct student
{
	char name[30];
	char xb[10];
	int Cscore;
	int Mscore;
	int Escore;
}STU;
/*----------------------------------------------*/
STU* stuNUM(int len)
{
	STU *stu=(STU*)malloc(len*sizeof(STU));
	return stu;
}
//..............................................................................................*/
void informationSCAN(STU *head,int len)
{
	int i=0;
	for(i=0;i<len;i++)
	{
		printf("please input student %d ------------------------------>name:",i+1);
		scanf("%s",head[i].name);
		printf("please input student %d ----------------------->xinbie:",i+1);
		scanf("%s",head[i].xb);
		printf("please input student %d ---------------->Cscore:",i+1);
		scanf("%d",&head[i].Cscore);
		printf("please input student %d --------->Mscore:",i+1);
		scanf("%d",&head[i].Mscore);
		printf("please input student %d -->Escore:",i+1);
		scanf("%d",&head[i].Escore);
	}
}
/*-------------------------------------------------------------*/
void informationPRIN(STU *head,int len)
{
	printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n");
	printf("Student:       XB:     total:     ave:          C:      M:      E:\n");
	while(len--)
	{
		int total=0;
		float ave;
		total=head->Cscore+head->Mscore+head->Escore;
		ave=(float)total/3;
	printf("%10s    %6s     (%5d)   (%6.2f)     %5d   %5d   %5d \n",head->name,head->xb,total,ave,head->Cscore,head->Mscore,head->Escore);
		head++;
	}
	printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n");
}
/*-------------------------------------------------------------*/
void CscorePX(STU *head,int len)
{
	int i, j;
	STU temp;
	i=j=0;
	for(i=0;i<len;i++)
	{
		for(j=i+1;j<len;j++)
		{
			if(head[i].Cscore<head[j].Cscore)
			{
				temp=head[i];
				head[i]=head[j];
				head[j]=temp;		
			}
		}
	}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void MscorePX(STU *head,int len)
{
	int i, j;
	STU temp;
	i=j=0;
	for(i=0;i<len-1;i++)
	{
		for(j=0;j<len-i-1;j++)
		{
			if(head[j].Mscore<head[j+1].Mscore)
			{
				temp=head[j];
				head[j]=head[j+1];
				head[j+1]=temp;
			}
		}
	}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void EscorePX(STU *head,int len)
{
	int i, j;
	STU temp;
	i=j=0;
	for(i=0;i<len-1;i++)
	{
		int jh=0;
		for(j=0;j<len-i;j++)
		{
			if(head[jh].Escore>head[j].Escore)jh=j;
		}
		temp=head[jh];
		head[jh]=head[len-i-1];
		head[len-i-1]=temp;
	}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void totalscorePX(STU *head,int len)
{
	int i, j;
	STU temp;
	i=j=0;
	for(i=0;i<len;i++)
	{
		for(j=i+1;j<len;j++)
		{
			if((head[i].Cscore+head[i].Mscore+head[i].Escore)<(head[j].Cscore+head[j].Mscore+head[j].Escore))
			{
				temp=head[i];
				head[i]=head[j];
				head[j]=temp;
			}
		}
	}
}
/*------------------------------------------------------------------------------------*/
void scoreDPX(STU *head,int len,void (*p)())
{
	int px=0;
	int cnt=4;
	while(cnt--)
	{
		printf("please input pai_xu_fang_shi(1.Cscore 2.Mscore 3.Escore 4.totalscore)\nplease input number(1 2 3 4):");
		scanf("%d",&px);
		switch(px)
		{
			case 1: CscorePX(head,len);break;
			case 2: MscorePX(head,len);break;
			case 3: EscorePX(head,len);break;
			case 4: totalscorePX(head,len);break;
			default:printf("your input is error!\n");
				exit(-1);
		}
//		if(px==1 || px ==2 || px==3 || px==4)break;
		p(head,len);
	}
	p(head,len);
}
/*-----------------------------------------------------------------------------------*/
void scoreAVE(STU *head,int len)
{
	float ave;
	int total=0;
	int chushu=len;
	while(len--)
	{
		total+=head->Cscore+head->Mscore+head->Escore;
		head++;
	}
	ave=(float)total/chushu;
	printf("Student total average score is %.2f\n",ave);
}
/*--------^----------------------------^_^_^_^_^_^_^_^_^_^----------*/
void nameXG(STU *head,int len,char *name,char *Nname)
{
	while(len--)
	{
		if(!strcmp(head->name,name))
		{
			strcpy(head->name,Nname);
			return;
		}
		head++;
	}
	printf("NO point the Student Name!\n");
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void xinbieXG(STU *head,int len,char *name,char *Nxb)
{
	while(len--)
	{
		if(!strcmp(head->name,name))
		{
			strcpy(head->xb,Nxb);
			return;
		}
		head++;
	}
	printf("NO point the Student Name!\n");	
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void CscoreXG(STU *head,int len,int score,int Nscore)
{
	while(len--)
	{
		if(head->Cscore==score)
		{
			head->Cscore=Nscore;
			return;
		}
		head++;
	}
	printf("NO point the Chinses SCORE!\n");
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void MscoreXG(STU *head,int len,int score,int Nscore)
{
	while(len--)
	{
		if(head->Mscore==score)
		{
			head->Mscore=Nscore;
			return;
		}
		head++;
	}
	printf("NO point the Math SCORE!\n");
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void EscoreXG(STU *head,int len,int score,int Nscore)
{
	while(len--)
	{
		if(head->Escore==score)
		{
			head->Escore=Nscore;
			return;
		}
		head++;
	}
	printf("NO point the English SCORE!\n");
}
/*------------------------------------------------------------------------------------*/
void informationXG(STU *head,int len,void (*p)())
{
	int a=100;
	int b=0;
	int cnt=0;

	char targetName[30];
	char newName[30];

	char newXB[10];
	
	int score;
	int newScore;

	printf("Whether to modify the information?\nYES is (1):");
	scanf("%d",&a);
	if(a==1)
	{
		printf("How many do you want write?:");
		scanf("%d",&cnt);
		while(cnt--)
		{
			printf("modify(1.name 2.xinbie 3.Cscore 4.Mscore 5.Escore):");
			scanf("%d",&b);
			switch(b)
			{
				case 1:printf("please input modify name target:");
				       scanf("%s",targetName);
				       printf("please input new name:");
				       scanf("%s",newName);
				       		nameXG(head,len,targetName,newName);
						break;			
				case 2:printf("please input modify name target:");
                                       scanf("%s",targetName);  
                                       printf("please input new xinbie:");
                                       scanf("%s",newXB);     
                                                xinbieXG(head,len,targetName,newXB);
                                                break;
				case 3:printf("please input modify Cscore target:");
				       scanf("%d",&score);
                                       printf("please input new Cscore:");
                                       scanf("%d",&newScore);     
                                                CscoreXG(head,len,score,newScore);
                                                break;
				case 4:printf("please input modify Mscore target:");
				       scanf("%d",&score);
                                       printf("please input new Mscore:");
                                       scanf("%d",&newScore);     
                                                MscoreXG(head,len,score,newScore);
                                                break;
				case 5:printf("please input modify Escore target:");
				       scanf("%d",&score);
                                       printf("please input new Escore:");
                                       scanf("%d",&newScore);     
                                                EscoreXG(head,len,score,newScore);
                                                break;
				default:printf("your input is error!\n");	
					exit(-1);
			}
			//if(b==1||b==2||b==3||b==4||b==5)break;
			p(head,len);
		}
	}
}
/*------------------------------------------------------------------------------------*/
void display()
{
	printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
	printf("$$$oooooooooooooooooooooooooooooooooooooooooooooooooooo$$\n");
	printf("$$$                                                   $$$\n");
	printf("$$$                STUDENT SCORE SYSTEM               $$$\n");
	printf("$$$                                                   $$$\n");
	printf("$$ooooooooooooooooooooooooooooooooooooooooooooooooooooo$$\n");
	printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
}
/*------------------------------------------------------------------------------------*/
int main()
{
	void (*p)();
	display();
	
	int len;
	printf("How many student?:");
	scanf("%d",&len);
	STU *stu=stuNUM(len);

	informationSCAN(stu,len);		
	informationPRIN(stu,len);
	
	p=informationPRIN;
	scoreDPX(stu,len,p);
	scoreAVE(stu,len);
	
	informationXG(stu,len,p);
	printf("\n################## See you! ###################\n");
	free(stu);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值