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;
}