C++ 指针相关练习题

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值