第十二周C++作业

1.调试分析课本每一个例题,有可能的话更改成2-3个方法的新程序;

/***********对结构体变量的成员进行操作*****************/


#include<iostream>
using namespace std;

struct date
{
	int month;
	int day;
	int year;
};

struct student
{
	int num;
	char name[20];
	struct date birthday;
	char addr[30];
};

int main()
{	
	student stu1;
	stu1.num=1001;
	stu1.birthday.month=8;
	stu1.birthday.day=20;
	stu1.birthday.year=1980;
	cout<<stu1.num<<"  ";
	cout<<stu1.birthday.month<<"  ";
	cout<<stu1.birthday.day<<"  ";
	cout<<stu1.birthday.year<<endl;

	return 0;

}

/***********将变量stu1中的成员赋给stu2中相应成员*****************/


#include<iostream>
using namespace std;

int main()
{	
	struct
	{
		int num;
		int age;

	}stu1,stu2;
	stu1.num=1001;
	stu1.age=20;
	stu2=stu1;
	cout<<stu2.num<<endl;
	cout<<stu2.age<<endl;

	return 0;

}

/***********将包含3名学生成绩单的成绩按大到小排序输出*****************/


#include<iostream>
using namespace std;

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

int main()
{	
	student stu[3]={{1001,"liu jin",75},{1002,"li lan",82},{1003,"ma kai",80}};
	student temp;
	for(int i=1;i<3;i++)
		for(int j=0;j<=2-i;j++)
			if(stu[j].score<stu[j+1].score)
			{
				temp=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=temp;
			}
	cout<<"Num"<<"       Name"<<"   Score"<<endl;
	for(int k=0;k<3;k++)
		cout<<stu[k].num<<'\t'<<stu[k].name<<'\t\t'<<stu[k].score<<endl;

	return 0;

}
</pre><pre name="code" class="cpp">

#include<iostream>
using namespace std;

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

int main()
{	
	student stu[3]={{1001,"liu jin",75},{1002,"li lan",82},{1003,"ma kai",80}};
	student *s=stu;
	cout<<"Num"<<"\tName"<<"\t\tScore"<<endl;
	for(;s<stu+3;s++)     //s小于stu首地址右移3位
		cout<<s->num<<"\t"<<s->name<<"\t\t"<<s->score<<endl;

	return 0;

}

/***********结构体指针作形参*****************/


#include<iostream>
using namespace std;

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

void print(student *ps)
{
	cout<<ps->num<<" "<<ps->name<<"  "<<ps->score<<endl;
}
int main()
{	
	student stu[3]={{1001,"liu jin",75},{1002,"li lan",82},{1003,"ma kai",80}};
	for(int i=0;i<3;i++)
		print(&stu[i]);

	return 0;

}


/***********链表的建立、输出、删除、增加*****************/


#include<iostream>
using namespace std;


struct student
{
	long num;
	float score;
	student *next;
};

int n=0;

student *creat()	//建立链表
{
	student *head,*p1,*p2;
	head=NULL;
	p1=new(student);			//开辟动态内存存储空间存放新结点
	p2=p1;
	cout<<"请输入学生学号和成绩,当学号为0时,停止输入"<<endl;
	cin>>p1->num>>p1->score;
	while(p1->num!=0)
	{
		n++;
		if(n==1)
			head=p1;			//第一个结点赋给头结点
		else
		{
			p2->next=p1;		//往下链接新建立的结点
			p2=p1;
		}
		p1=new(student);		//继续开辟动态内存存储空间存放新结点
	cin>>p1->num>>p1->score;
	}
	delete p1;					//停止建立新结点
	p2->next=NULL;				
	return head;
}
void print(student *head)//输出链表
{
	student *p;
	p=head;
	if(p==NULL)
		return;
	do
	{
		cout<<p->num<<"    "<<p->score<<endl;
		p=p->next;
	}
	while(p!=NULL);

}
student *del(student *head,int num)			//删除结点
{
	student *p1,*p2;
	if(head==NULL)			//如果原先链表为空
	{
		cout<<"list NULL"<<endl;
		return head;
	}
	p1=head;
	while(num!=p1->num && p1->next!=NULL)		//找不到相应的结点就往下继续搜索
	{
		p2=p1;
		p1=p1->next;
	}
	if(num==p1->num)			//找到结点
	{
		if(p1==head)			//结点是第一位
			head=p1->next;
		else					//结点不是第一位
			p2->next=p1->next;
		cout<<"delete: "<<num<<endl;
		n--;
	}
	else
		cout<<num<<"not been found"<<endl;

	return head;
}

student *insert(student *head,student *stud)			//增加结点
{
	student *p0,*p1,*p2;
	p1=head;
	p0=stud;
	if(head==NULL)		//若原本的链表为空
	{
		head=p0;
		p0->next=NULL;
	}
	else
		while((p0->num>p1->num)&&(p1->next!=NULL))	//当p0所指向的数字大于p1所指向的数字,继续往下搜索
		{
			p2=p1;
			p1=p1->next;
		}
	if(p0->num<=p1->num)		//找到插入点	
	{
		if(head==p1)			//如果插入点是首位
			head=p0;
		else					//插入点在中间
			p2->next=p0;
		p0->next=p1;
	}
	else						//插入点在末尾
	{
		p1->next=p0;
		p0->next=NULL;
	}
	n++;
	return head;
}
int main()
{	
	student *head=creat();
	cout<<"新建的链表为:"<<endl
		<<"学号\t成绩"<<endl;
	print(head);

	int num;
	cout<<"请输入要删除的学号:";
	cin>>num;
	head=del(head,num);
	cout<<"目前的链表为: "<<endl;
	print(head);

	student *pt=new(student);
	cout<<"请输入要插入学生的学号和成绩: ";
	cin>>pt->num>>pt->score;
	head=insert(head,pt);
	cout<<"目前的链表为:"<<endl;
	print(head);

	return 0;


}

/***********使用共用体将一个整数转换成为对应的ASCII码字符*****************/


#include<iostream>
using namespace std;


union pw
{
	int i;
	char ch[2];

};

int main()
{	
	cout<<"请输入一个整数,若大于127则退出"<<endl;
	pw password;
	while(1)
	{
		cin>>password.i;
		if(password.i>127)
		 break;
		cout<<password.i<<"对应的字符为:"<<password.ch<<endl;
	}
	return 0;

}

/***********用枚举类型处理和、查、积*****************/


#include<iostream>
using namespace std;


int main()
{
	enum en{plus,minus,times}op1;
	int x,y;
	cout<<"请输入两个数";
	cin>>x>>y;
	op1=plus;
	while(op1<=times)
	{
		switch(op1)
		{
		case plus:cout<<x<<"+"<<y<<"="<<x+y<<endl;break;
		case minus:cout<<x<<"-"<<y<<"="<<x-y<<endl;break;
		case times:cout<<x<<"*"<<y<<"="<<x*y<<endl;break;
		}
		int i=(int)op1;		//	强制类型转换为int型,因为枚举类型变量不能自增
		op1=en(++i);
	}
	return 0;
}

2.编程实现课本每一个编程习题。

/***********有一个结构体变量,内含学生学号、姓名
和三门课程成绩。要求在MAIN函数中给数据赋值,在另
一个函数print中将它们打印出来****************/


#include<iostream>
using namespace std;

struct student
	{
		char name[40];
		long int num;
		int mark[3];
	}stu1;

void print(student stu);
int main()
{
	
	cout<<"请输入学生姓名:";
	cin>>stu1.name;
	cout<<"请输入学生学号:";
	cin>>stu1.num;
	cout<<"请输入学生的三门成绩:";
	cin>>stu1.mark[0]>>stu1.mark[1]>>stu1.mark[2];
	print(stu1);

	return 0;
}
void print(student stu)
{
	cout<<"学生姓名:"<<stu.name<<endl;
	cout<<"学生学号:"<<stu.num<<endl;
	cout<<"学生三门成绩分别为:"<<stu.mark[0]<<'\t'<<stu.mark[1]<<" "<<stu.mark[2]<<'\t'<<endl;
}


/***********将上题改成指向结构体变量的指针作为实参来实现****************/


#include<iostream>
using namespace std;

struct student
	{
		char name[40];
		long int num;
		int mark[3];
	};

void print(student *stu);
int main()
{
	
	student stu,*p=&stu;
	cout<<"请输入学生姓名:";
	cin>>p->name;
	cout<<"请输入学生学号:";
	cin>>p->num;
	cout<<"请输入学生的三门成绩:";
	cin>>p->mark[0]>>p->mark[1]>>p->mark[2];
	print(p);

	return 0;
}
void print(student *stu)
{
	cout<<"学生姓名:"<<stu->name<<endl;
	cout<<"学生学号:"<<stu->num<<endl;
	cout<<"学生三门成绩分别为:"<<stu->mark[0]<<'\t'<<stu->mark[1]<<" "<<stu->mark[2]<<'\t'<<endl;
}

/***********使用共用体的方式将一个整数转换为ASCII码字符****************/


#include<iostream>
using namespace std;

union change
	{
		int i;
		char ch[2];
	}a;

int main()
{
	cout<<"请输入一个小于128的整数"<<endl;
	while(1)
	{
		cin>>a.i;
		if(a.i>127)
			break;
		cout<<a.i<<"对应的ASCII值为:"<<a.ch<<endl;
	}
	return 0;
}


/***********定义一个结构体变量(年月日),计算该日在本年中是第几天(注意闰年)****************/


#include<iostream>
using namespace std;

struct date
	{
		int year;
		int month;
		int day;
	};

int main()
{
	date change;
	int sum=0;
	cout<<"请输入年份:"<<endl;
	cin>>change.year;
	cout<<"请输入月份:"<<endl;
	cin>>change.month;
	while(change.month>12)
	{
		cout<<"输入有误,请重新输入:"<<endl;
		cin>>change.month;
	}
	cout<<"请输入日期:"<<endl;
	cin>>change.day;
	while(change.day>31)
	{
		cout<<"输入有误,请重新输入:"<<endl;
		cin>>change.day;
	}
	

	if(change.year%4==0 && change.month>2)		//判断是否为闰年
	sum++;
	change.month--;
	while(change.month!=0)
	{
		switch(change.month)
		{
			case 1:
			case 3: 
			case 5: 
			case 7:
			case 8:
			case 10:
			case 12: sum+=31;break;
			case 4:
			case 6:
			case 9:
			case 11: sum+=30;break;
			case 2:	 sum+=28;break;
		}
		change.month--;
	}
	sum+=change.day;

	cout<<"该日在本年中是第"<<sum<<"天"<<endl;
	return 0;
}

3. 建立一个链表,每一个学号包括学号、姓名、性别、成绩,输入一个成绩,如果在链表中节点成绩等入输入的成绩,则将其删除。

#include <iostream>
using namespace std;

struct student
{
	int num;
	char name[20];
	char sex;
	float mark;
	student *next;
};

int n=0;

student *creat()	//建立链表
{
	student *head,*p1,*p2;
	head=NULL;
	p1=new(student);			//开辟动态内存存储空间存放新结点
	p2=p1;
	cout<<"请输入学生学号,当学号为0时,停止输入: ";
	cin>>p1->num;
	while(p1->num!=0)
	{
		n++;
		if(n==1)
			head=p1;			//第一个结点赋给头结点
		else	
			p2->next=p1;		//往下链接新建立的结点
			cout<<"请输入学生姓名:";
			cin>>p1->name;
			cout<<"请输入学生性别:";
			cin>>p1->sex;
			cout<<"请输入学生成绩:";
			cin>>p1->mark;
			p2=p1;
			cout<<"请输入学生学号,当学号为0时,停止输入: ";
		p1=new(student);		//继续开辟动态内存存储空间存放新结点
		cin>>p1->num;
	}
	delete p1;					//停止建立新结点
	p2->next=NULL;				
	return head;
}
void print(student *head)//输出链表
{
	cout<<"学号    姓名    性别    成绩"<<endl;
	student *p1;
	p1=head;
	if(p1==NULL)
		return;
	do
	{
		cout<<p1->num<<'\t'<<p1->name<<'\t'
			<<p1->sex<<'\t'<<p1->mark<<endl;
		p1=p1->next;
	}
	while(p1!=NULL);
}

student *del(student *head,int mark)			//删除结点
{
	student *p1,*p2;
	if(head==NULL)			//如果原先链表为空
	{
		cout<<"list NULL"<<endl;
		return head;
	}
	p1=head;
	while(mark!=p1->mark && p1->next!=NULL)		//找不到相应的结点就往下继续搜索
	{
		p2=p1;
		p1=p1->next;
	}
	if(mark==p1->mark)			//找到结点
	{
		if(p1==head)			//结点是第一位
			head=p1->next;
		else					//结点不是第一位
			p2->next=p1->next;
		n--;
	}
	else
		cout<<mark<<"没有这个分数的学生"<<endl;

	return head;
}

int main()
{	
	student *head=creat();
	print(head);

	int mark;
	cout<<"请输入要删除的成绩:";
	cin>>mark;
	head=del(head,mark);
	cout<<"目前的链表为: "<<endl;
	print(head);

	return 0;


}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值