1、考试成绩#1
请编写一个程序,动态分配一个足够大的数组来保存用户定义的考试成绩。一旦输入了所有的分数,数组就应该被传递给一个按照升序排序的函数。应该调用另一个函数来计平均分数。程序应该显示已排序的分数列表和平均分,并加上恰当的标题。请尽可能使用指针表示法而不是数组表示法。
输入验证:考试成绩不接受负数。
#include <iostream>
using namespace std;
void sort(double *s,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(*(s+j+1)>*(s+j))
{
double tmp=*(s+j+1);
*(s+j+1)=*(s+j);
*(s+j)=tmp;
}
}
}
}
double adv(double *s,int n)
{
double sum=0.0;
for(int i=0;i<n;i++)
sum+=*(s+i);
return sum/n;
}
void print(double *s,int n,double advscore)
{
cout<<'\t'<<"考试成绩表"<<endl;
cout<<"------------------------"<<endl;
for(int i=0;i<n;i++)
{
cout<<i+1<<'\t'<<*(s+i)<<endl;
}
cout<<"平均成绩为:"<<advscore;
}
int main()
{
double *score=new double[1000];
cout<<"请输入成绩(输入101结束):"<<endl;
int i=0;//计数
while(1)
{
cin>>*(score+i);
if(*(score+i)<0)
{
cout<<"输入非法!请重新输入:"<<endl;
cin>>*(score+i);
}
else if(*(score+i)==9999)
break;
i++;
}
sort(score,i); //排序
double advscore=adv(score,i);//计算平均分
print(score,i,advscore);//输出
return 0;
}
2、考试成绩#2
修改编程挑战1的程序以允许用户输入名称-分数对。对于每个参加考试的学生,用户先输入代表学生姓名的字符串,然后输入代表学生成绩的整数。修改排序和平均分计算函数,以便它们采用结构数组,每个结构包含单个学生的名称和分数。在遍历数组时,使用指针而不是数组索引。
#include <iostream>
#include <string>
using namespace std;
struct student
{
string name;//名字
int score;//分数
};
void sort(student *s,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(s[j+1].score>s[j].score)
{
student tmp=s[j+1];
s[j+1]=s[j];
s[j]=tmp;
}
}
}
}
double adv(student *s,int n)
{
int sum=0;
for(int i=0;i<n;i++)
sum+=s[i].score;
return sum/n;
}
void print(student *s,int n,double advscore)
{
cout<<'\t'<<"考试成绩表"<<endl;
cout<<"------------------------"<<endl;
for(int i=0;i<n;i++)
{
cout<<i+1<<'\t'<<s[i].name<<'\t'<<s[i].score<<endl;
}
cout<<"平均成绩为:"<<advscore;
}
int main()
{
student *p=new student[1000];
cout<<"请输入姓名和成绩(输入#结束):"<<endl;
int i=0;//计数
while(1)
{
cin>>p[i].name;
cin>>p[i].score;
if(p[i].score<0)
{
cout<<"输入非法!请重新输入:"<<endl;
cin>>p[i].score;
}
else if(p[i].score==9999)
break;
i++;
}
sort(p,i); //排序
double advscore=adv(p,i);//计算平均分
print(p,i,advscore);//输出
return 0;
}
3、通过指针间接排序#1
某公司有一个包含Person类型结构的Person data[10]数组,需要按姓名对该数组排序
struct Person
{
string name;
int age;
};
在真实的程序中,Person 结构可能拥有许多成员,占用大量内存。在这种情况下,排序和移动Person 对象都可能消耗大量的计算资源。因此,可以考虑定义一个辅助数组 Person*pData[10],设置pData[k]的每个元都指向data[k]的对应元素。请编写一个程序,对该指针数组进行排序,这样,当按索引k的升序遍历pData数组时,pData[k]元素即指向按字母顺序的升序排序的Person对象。
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
struct Person
{
string name;
int age;
};
void sort(Person *p,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(p[j].name>p[j+1].name)
{
Person x=p[j];
p[j]=p[j+1];
p[j+1]=x;
}
}
}
}
int main()
{
Person data[10];
Person *pData[10];
cout<<"请输入员工的姓名和年龄:"<<endl;
for(int i=0;i<10;i++)
cin>>data[i].name>>data[i].age;
//pData[k]的每个元都指向data[k]的对应元素
for(int i=0;i<10;i++)
pData[i]=&data[i];
sort(*pData,10);
cout<<'\t'<<"姓名排序表"<<endl;
cout<<"----------------------------"<<endl;
for(int i=0;i<10;i++)
cout<<setw(15)<<left<<pData[i]->name<<pData[i]->age<<endl;
return 0;
}
/*
Alice 31
Lucy 20
Linda 25
Cathy 26
Caroline 23
Bob 27
John 29
Peter 24
Justin 23
Jack 30*/
4、通过指针间接排序#2
请编写一个程序,解决编程挑战3提出的问题,但是指针数组现在应该指向按年龄降序排序的数据数组。
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
struct Person
{
string name;
int age;
};
void sort(Person *p,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(p[j].age<p[j+1].age)
{
Person x=p[j];
p[j]=p[j+1];
p[j+1]=x;
}
}
}
}
int main()
{
Person data[10];
Person *pData[10];
cout<<"请输入员工的姓名和年龄:"<<endl;
for(int i=0;i<10;i++)
cin>>data[i].name>>data[i].age;
//pData[k]的每个元都指向data[k]的对应元素
for(int i=0;i<10;i++)
pData[i]=&data[i];
sort(*pData,10);
cout<<'\t'<<"姓名排序表"<<endl;
cout<<"----------------------------"<<endl;
for(int i=0;i<10;i++)
cout<<setw(15)<<left<<pData[i]->name<<pData[i]->age<<endl;
return 0;
}
5、馅饼吃货可知否
在统计作业中,一组值得众数是经常出现得值。请编写一个程序,确定大多数人每年吃多少块馅饼。设置一个可以保存30人得回答的整数数组,输入每个人所说的一年中所吃的馅饼块数。然后编写一个函数来查找这30个值得众数,这将是大多数人吃的馅饼的块数。查找和返回众数得函数应该接受两个实参,其中一个是整数数组,另一个是指示数组中有多少元素。
#include <iostream>
using namespace std;
int Mode(int *s,int n)
{
int num=1,x=1;
//从大到小排序
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(*(s+j)<*(s+j+1))
{
int tmp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=tmp;
}
}
}
int m;//记录众数的值
int current=0;//当前正在访问的数字的个数
int most=0;//目前的众数个数
for(int i=0;i<n;i++)
{
current++;
if(*(s+i)!=*(s+i+1) || i==n-1)
{
if(current>most)
{
most=current;
m=*(s+i);
}
current=0;
}
}
return m;
}
int main()
{
int *p=new int[30];
cout<<"请输入每年吃的馅饼块数:"<<endl;
int i=0;
while(1)
{
cin>>*(p+i);
if(*(p+i)<0)
{
cout<<"输入有误!不能为负数!请重新输入:"<<endl;
cin>>*(p+i);
}
else if(*(p+i)==0000)
break;
i++;
}
cout<<"所吃馅饼的众数为:"<<Mode(p,i);
return 0;
}
6、中值函数
在统计作业中,一组值的中值是当值按照排序顺序排列时位于中间的值。如果该组具有偶数个值,则取中位数为两个中间值的平均值。请编写一个函数来确定排序数组的中值。该函数应该接收一个数字数组和一个指示数组大小的整数,并返回该数组的中值。可以假设该数组已经排序,并尽可能使用指针表示法。
#include <iostream>
using namespace std;
double middle(double *p,int n)
{
double x;
//首先进行排序,从小到大
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(*(p+j)>*(p+j+1))
{
int tmp=*(p+j+1);
*(p+j+1)=*(p+j);
*(p+j)=tmp;
}
}
}
if(n%2==0)
x=(*(p+n/2)+*(p+n/2-1))/2.0;
else
x=*(p+n/2);
return x;
}
int main()
{
double *p=new double[1000];
cout<<"请输入数组中的值(输入99999结束):"<<endl;
int i=0;
while(1)
{
cin>>*(p+i);
if(*(p+i)==99999)
break;
i++;
}
double x=middle(p,i);
cout<<"中位数为:"<<x<<endl;
return 0;
}
7、观影统计
请编写一个程序,可以用来收集有关大学生在一个月内所看过的电影数量的统计数据。程序应询问用户调查了多少个学生,并动态分配相应大小的数组。程序还应该允许用户输入每个学生所看过的电影数量,最后计算输入值的平均值、中值和众数。
#include <iostream>
using namespace std;
//从大到小排序
void sort(double *p,int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(*(p+j)<*(p+j+1))
{
double tmp=*(p+j+1);
*(p+j+1)=*(p+j);
*(p+j)=tmp;
}
}
}
}
//求平均值
double avg(double *p,int n)
{
double sum=0.0;
for(int i=0;i<n;i++)
sum+=*(p+i);
return sum/n;
}
//求中位数
double middle(double *p,int n)
{
if(n%2==0)
return (*(p+n/2)+*(p+n/2-1))/2;
else
return *(p+n/2);
}
//求众数
double mode(double *p,int n)
{
double m;//记录众数的值
int current=0;//当前正在访问的数字的个数
int most=0;//目前的众数个数
for(int i=0;i<n;i++)
{
current++;
if(*(p+i)!=*(p+i+1) || i==n-1)
{
if(current>most)
{
most=current;
m=*(p+i);
}
current=0;
}
}
return m;
}
int main()
{
int n;
cout<<"一共调查了多少个学生?";
cin>>n;
while(n<0)
{
cout<<"输入错误!不能为负!请重新输入:";
cin>>n;
}
double *p=new double[n];
cout<<"请输入每个人的观影数量:"<<endl;
for(int i=0;i<n;i++)
{
cin>>*(p+i);
if(*(p+i)<0)
{
cout<<"不能为负!输入错误!"<<endl;
return 0;
}
}
sort(p,n);
double a=avg(p,n);
double b=middle(p,n);
double c=mode(p,n);
/* for(int i=0;i<n;i++)
cout<<*(p+i)<<" "<<" ";*/
cout<<"平均值为:"<<a<<"\n中值为:"<<b<<"\n众数为:"<<c<<endl;
return 0;
}
8、妙算一月有几天
请编写一个程序,可以确定某个指定的年月中该月所包含的天数。程序应该允许用户输入代表年份和月份的两个整数,并且应该确定指定月份中有多少天。整数1~12将被用来识别对应的1 ~12月。用户通过在月份和年份中输入“00”来指示输入的结束。此时程序将打印当前月份的天数并终止。
请使用以下标准来确定闰年:
(1)年份值Y可以被100整除。然后它必须还可以被400整除才是闰年。例如,2000年是闰年,但2100年不是闰年。
(2)年份值Y不能被 100 整除。但是如果它可以被4整除,那么它也是闰年。例如,2008年是闰年,但2009年就不是闰年。
以下是程序运行的示例:
Enter month and year:2 2008【按回车键】
29 days
Enter month and year:0 0【按回车键】
The current month,September 2009,has 30 days.
#include <iostream>
using namespace std;
int getDays(int year,int month)
{
int days;
if(year%100==0 && year%400==0 || year%100!=0 && year%4==0)
{
if(month==2)
days=29;
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
days=31;
else
days=30;
}
else
{
if(month==2)
days=28;
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
days=31;
else
days=30;
}
return days;
}
int main()
{
int year,month;
while(1)
{
cout<<"Enter month and year:";
cin>>month>>year;
if(month>13 || month<0)
{
cout<<"Error!Please enter again:";
continue;
}
if(year==0 && month==0)
break;
else
{
cout<<getDays(year,month)<<" Days"<<endl;
}
}
cout<<"The current month,June 2020,has "<<getDays(2020,6)<<" days.";
return 0;
}
9、暴露年龄的时候到了
请编写一个程序,要求用户输入姓名和出生年份,然后使用用户的名字问候用户,并告诉他/她的年龄。用户被假定出生于1800年至2099年,并且以18XX、19XX或20XX这三种格式之一输入出生年份。一个典型的输出应该是“Hello Caroline,you are 23 years old.”。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name, year;
cout<<"Enter your name and the year of birth(18XX、19XXor20XX):"<<endl;
cin>>name>>year;
string y=year.substr(0,2);//从0号位置开始,取两个
int a=atoi(year.c_str());
while(y!="18" && y!="19" && y!="20" || a>2020)
{
cout<<"Error!Please enter again:";
cin>>name>>year;
y=year.substr(1,2);
}
cout<<"Hello "<<name<<",you are "<<2020-a<<" years old."<<endl;
return 0;
}