C语言/C++常见习题问答集锦(二十二)

C语言/C++常见习题问答集锦(二十二)

程序之美

在这里插入图片描述
1、设计一个程序,要求输入一个正整数(小于32768),并能诸位正序和逆序输出。要求分别设计两个递归函数,一个实现正序输出,一个实现逆序输出。将源程序保存为06_3.c。
测试举例:输入数据3456,正序函数输出为3456,逆序函数输出为:6543。
注:提示使用语句“printf("%d", i%10);”和"if(i>9) f(i/10);",这两个语句的先后顺序决定了正序函数和逆序函数不同的输出结果。

#include <stdio.h>

//输入一个正整数(小于32768),并能逐位正序和反序输出
//分别涉及两个递归函数,一个实现正序输出,一个实现反序输出

int exponent(int x)         //判断输入的这个数是几位数
{
        int i=10,j=0;
        if (x<10) return 1;
        for(;;)
        {   
            j++;
            x/=i;
            if (x==0) break;
        }
        return j;
}

 

void upright(int x)
{
    int a[10],b,i,j;    
    b=exponent(x);
    
    for (i=0;;i++)
    {   
    	a[i]=x%10;x/=10; 
          if (x==0) break; 
    }
    j=i;
    
    for (;j>=0;j--) 
    printf("%d",a[j]);
}

void upsidedown(int x)         //递归倒叙输出
{
    if (x<10) printf("%d",x);
    else {
                printf("%d",x%10);
                x/=10;
                upsidedown(x);
            }
}

int main()
{
    int x,j;
    printf("输入一个正整数(小于32768)\n");
    scanf("%d",&x);
    printf("正序输出:\n");
    upright(x);
    printf("\n");
    printf("反序输出:\n");
    upsidedown(x);
    printf("\n");
}

2、用C语言或C++编程
定义一个学生类 Student,学生类中有 3 个私有数据成员:name(姓名)、cls(班级)、grade(年级);3 个公有成员函数;Student(构造函数)、display、~Student(析构函数)。使用构造函数为 Student 类的对象赋值(name 使用动态内存分配空间),display 负责显示学生的基本信息,在析构函数中释放动态分配的内存。

解法一:

class Student
{
	public:
	
	 Student(const char * name, const char * cls, const char * grade);
	 void Dispaly();
	 ~Student();
	
	private:
	 char * m_strName;
	 char * m_strCls;
	 char * m_strGrade;
};

Student::Student(const char * name, const char * cls, const char * grade)
{
	 assert(name !=NULL);
	 assert(cls !=NULL);
	 assert(grade !=NULL);
	
	 m_strName = new char[strlen(name)+1];
	 strcpy(m_strName,name);
	 m_strCls = new char[strlen(cls)+1];
	 
	 strcpy(m_strCls,cls);
	
	 m_strGrade = new char[strlen(grade)+1];
	
	 strcpy(m_strGrade,grade);

}

Student::~Student()
{
	 delete [] m_strName;
	 delete [] m_strCls;
	 delete [] m_strGrade;
}

void Student::Dispaly()
{
 	printf("Studnet'name is %s,class is%s,grade is%s",m_strName,m_strCls,m_strGrade);
}

解法二:

#include<iostream>
#include <string>
using namespace std;
class Student
{
public:
	Student(int ,int, string );
	~Student()
	{
		cout << "执行析构函数成功!" << endl;
		delete name;
	}
	void display();
private:
	string* name;
	int cls;
	int grade;
};

Student::Student(int c,int g, string  s)
{
	cout << "构造函数执行成功!" << endl;
	name = new string(s);
	cls = c;
	grade = g;
}
void Student::display()
{
	cout << "该学生的名字:" << *name << endl;
	cout << "该学生的班级:" << cls << endl;
	cout << "该学生的年纪:" << grade << endl;
}

int main()
{
	Student stud(1,2,"ss");
	stud.display();
	return 0;
}

在这里插入图片描述

3、编写一个学生类,学生信息包含姓名、学号、年龄、性别和成绩;(1)输出每个学生的姓名、学号和成绩。(2)统计并输出学生的总人数、总成绩、平均成绩、最高成绩和最低成绩。

/*编写一个学生类,学生信息包含姓名、学号、年龄、性别和成绩;(1)输出每个学生

的姓名、学号和成绩。(2)统计并输出学生的总人数、总成绩、平均成绩、最高成绩和最低

成绩。*/

 

#include <iostream>
#include <string>

using namespace std;

class Student
{
public:
    Student(string nam, int num, int a, char s, float gra);  //带参数的构造函数
    ~Student()                                               //析构函数
    {
    }
    void display();                                          //用于学生信息的打印函数
    string name;
    int number;
    int age;
    char sex;
    float grade;
//在这里将要用到的数据成员都声明为公有的,原因请往下看。
};

Student::Student(string nam, int num, int a, char s, float gra) //类外定义构造函数
{
    name = nam;
    number = num;
    age = a;
    sex = s;
    grade = gra;
}

void Student::display()                                        // 类外定义打印函数
{
	    cout << "该学生的信息如下:" << endl;
	    cout << name <<"—"<< number <<"—"<< age <<"—"<< sex <<"—" << grade << endl;
}

//计算学生总成绩
int grade_total(Student* p, int length)        
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum = sum + p->grade;
        p = p + 1;
    }
    return sum;
}

//计算学生平均成绩
int grade_average(int a, int length)
{
    return (a / length);
}

//统计学生中的最高成绩并输出该学生的相关信息
float grade_max(Student *p, int length)  
{
    while (p != NULL)                       
    {
        if ((*p).grade >= (*(p + 1)).grade) 
        {
            cout << (*p).name <<"—"<< (*p).number << "—" << (*p).age << "—" << (*p).sex << "—" << (*p).grade << endl;
            return((*p).grade);   
        }
        else
        {
            p = p + 1;
        }
    }
}

float grade_min(Student *p, int length)
{
    while (p!= NULL)    //不可写成    while (p) ,会报错:警告 C6011:取消引用 NULL 指针 <name>
    {
        if ((*p).grade <= (*(p + 1)).grade)
        {
            cout << (*p).name << "—" << (*p).number << "—" << (*p).age << "—" << (*p).sex << "—" << (*p).grade << endl;
            return((*p).grade);
        }
        else
        {
            p = p + 1;
        }
    }
}

int main()
{
    Student stud[3] = { Student("liming",191,18,'m',78),Student("wangying",192,18,'m',89),Student("liming",193,19,'f',99) };
    
    for (int i = 0; i < 3; i++)
    {
        stud[i].display();
    }
    
    cout << "这几个学生的总成绩:" << grade_total(stud, 3) << endl;
    cout << "这几个学生的平均成绩:" << grade_average(grade_total(stud, 3), 3) << endl;
    cout << "这几个学生中的最高成绩:" << grade_max(stud, 3) << endl;
    cout << "这几个学生中的最低成绩:" << grade_min(stud, 3) << endl;

    return 0;
}
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值