一个完整的程序由程序号, 程序内容和程序结束三部分组成。
1,头文件:头文件包含要在程序中调用的库函数(例如printf、scanf等)包含在头文stdio.h中。Sin、Tan、sqrt和数学计算中使用的其他函数包含在头文件math.h中。在程序中调用库函数,和#include或#include“头文件名”必须写在程序的开头。
2. 主要功能:程序的主体部分,算法的主干部分。
3. 子函数:在主函数中使用的方法。为了避免主函数过长所带来的误差,算法中的某个过程将被挑选出来并用子函数实现。子函数在主函数中调用,并在主函数外部定义。
4. Struct:可选,是一种特殊的数据类型,由程序员根据需要定义。
#include <stdio.h>#include <stdlib.h>
#include<string.h>
#define MENU_NUM 7
#define N 3
typedef struct s1
{
char no[11]/*学号由10个字符组成*/
char name[15]/*学生姓名*/
float score[N]/*各门课成绩*/
float sum/*总分*/
float average/*平均分*/
int order/*名次*/
struct s1 *next/*指向后继结点的指针*/
}STUDENT/*定义结构体类型*/
STUDENT * head=NULL
void InputData( STUDENT * ptr )
void PrintMenu( )
int Menu_Select( )
void Init( )
void create( )
void print( )
void Delete( )
void append()
void computer()
main()
{
int key
while(1) {
key=Menu_Select()
switch(key)
{
case 0: Init()
//初试化链表。也就是若链表不为空则释放链表中所有数据,将head置为空(NULL)
break
case 1: create()
//创建链表,输入数据
break
case 2: Delete()
//删除一个指定学号的记录数据
break
case 3: print()
//打印链表中所有数据
break
case 4: computer()
//计算链表中所有人的总分和平均分
break
case 5: append()
//追加一个数据到链表的尾部
break
case 6: Init()
//释放链表
exit(0)
}
}
}
void PrintMenu( )
{
int i
char * menu[]={
"0. Init list",
"1. Enter list",
"2. Delete a record from list",
"3. Print list",
"4. Compute the score",
"5. Insert record to list",
"6. Quit"
}
printf("\n\n")
for (i=0i<MENU_NUMi++)
printf("%s\n",menu[i])
printf("\nEnter your choice(0-6):")
}
int Menu_Select( )
{
int key
PrintMenu( )
scanf("%d",&key)
return key
}
void Init( )//初始化单链表。也就是释放链表中的所有数据
{
STUDENT *p,*ptr//定义两个临时指针变量p,ptr
p=headptr=head//将两个临时变量指向头指针head ;
while(ptr!=NULL)
{
ptr=ptr->next//ptr指向下一个结构数据
free(p)//释放p所指向的结构数据的内存
p=ptr//将p指向ptr所指向的数据
}
head=NULL//将head指向NULL
}
void create( )//创建单链表
{
STUDENT *pt, *pth=NULL//定义两个指针变量:pt指向即将申请新的数据内存,pth指向当前数据
while(1)
{
pt=(STUDENT *)malloc(sizeof(STUDENT))//让pt指向新申请的内存空间
InputData(pt)//输入数据,存放到pt所指向的结构数据。注意让pt的next指向NULL
if (strcmp(pt->no,"@")==0)
{
free(pt)//释放pt所指向的内存空间
break//退出循环
}
else if (head==NULL)
{
pth=pt
head=pt//将头指针head和pth指向pt
}
else
{
pth->next=pt//将pth的next指向pt
pth=pt//将pth指向pt
}
}
}
void print( ) //打印单链表中所有数据
{ int i=0
STUDENT *p//第一个指针p
p=head//将p指向head
printf("\n")
printf("******************************STUDENT******************************\n")
printf("|rec|no| name | sc1| sc2| sc3| sum | ave |order|\n")
printf("|---|----------|----------------|----|----|----|------|-----|-----|\n")
//打印表头
while (p!=NULL)
{
printf("|%3d|%10s|%-16s|%4.1f|%4.1f|%4.1f|%6.2f|%5.1f|%5d|\n",
++i,p->no,p->name,p->score[0],p->score[1],p->score[2],
p->sum,p->average,p->order)//打印p所指向的结构中的所有数据。注意打印数据间的分隔线
p=p->next//将p指向p的下一个结构数据
}
printf("********************************END********************************\n")//打印表尾
}
void Delete( ) //删除一个记录
{
STUDENT *p,*pth//定义两个指针p,pth
char no[11]//定义一个整数no(用来存储输入的学号)
printf("intput delete no\n")
scanf("%s",no)//用输入语句输入一个学号存储到no中
p=headpth=head//将p和pth都指向头指针
if (strcmp(p->no,no)==0) //也就是若头指针指向的数据需要删除
{
head=head->next//将head指针指向head的下一个数据;
free(p)//释放p所指向的数据
}
else
{
p=p->next//将p指向p的下一个数据
while ( p!=NULL)
{
if (strcmp(p->no,no)==0) //找到了要删除的数据
{
pth->next=p->next//将pth的next指向p的next
free(p)//释放p
break//退出循环
}
else
{
pth=pth->next//将pth指向pth的next 或 将pth指向p
p=p->next//将p指向p的next
}
}
}
}
void append()
{
STUDENT *p,*pth//定义两个指针变量p,pth
pth=head//将pth指向head
while ( pth->next!=NULL)
{
pth=pth->next//ptr指向ptr的next
}
p=(STUDENT *)malloc(sizeof(STUDENT))//将p指向新申请的内存空间
InputData(p)p->next=NULL//数据数据存储到p所指向的内存空间,注意将p的next置为NULL
pth->next=p//将ptr的next指向p
}
void InputData( STUDENT *ptr )
{ int i
printf("enter no:")
scanf("%s",ptr->no)
if (strcmp(ptr->no,"@")==0 ) return
printf("enter name:")
scanf("%s",ptr->name)
for(i=0i<3i++)
{
printf("shuru chengji\n")
scanf("%f",&ptr->score[i])
}
ptr->sum=0
ptr->average=0
ptr->order=0
ptr->next=NULL
}
void computer()
{
STUDENT *p
p=head
for(pp=p->next)
{
p->sum=p->score[0]+p->score[1]+p->score[2]
p->average=(p->score[0]+p->score[1]+p->score[2])/3
}
}
1.判别闰年可以用这个函数。
返回1为闰年,0为非闰年(平年)
int
IsLeapYear(int
year)
{
if(year%400
==
0)
return
1
if(year%4
==
0
&&
year%100
!=0)
return
1
return
0
}
2.这个可以用循环来做。也可以用公式。
循环的话比较简单,公式效率比较高。
int
sum
=
0
for(i=1i<=100i++)
sum
+=
i
3.角度换弧度,在math.h里好像有相关的函数。可以参照数学公式,用角度除以360就可以了。但是要注意的是,这里要采用浮点型。
4.这个问题不是很明白。你输入的时候难道不能确定它的类型吗?难道你是用字符串来输入的?
如果是用字符串输入的话,只需要观察字符串中有没有小数点就可以了。如果有的话,小数点后如果是全0的话,就是整数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)