十进制转为任意进制,发糖果

这篇博客包含了两个编程题目,一是根据给定条件解决三个人糖果分配的问题,二是实现十进制到任意进制的转换。问答部分涉及计算机科学的基础知识,如指针操作、函数特性、纯虚函数的含义以及拷贝构造函数的调用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问答题

问答题1:下列指令运行的结果为?

int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(%d,%d”,*(a+1)*(p-1));

提示:对 a 取地址后+1,这时候 a 指向了9的下一位,然后-1解引用后得到 9,对于 a + 1 解引用得到 3

问答题2:print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是?

(A) const void print();
(B) void const print();
(C) void print() const;
(D) void print(const);

提示:const 在函数参数中表示参数不可修改,const 在函数最前面表示返回值不可修改,const 在函数最后面表示的是常成员函数,常成员函数一般出现在类中,表示类中的常成员变量不可修改. const 在函数名前面,类型后面起的作用也是返回值不可修改.

答案:C

问答题3:以下关于纯虚函数的说法,正确的是?
A 声明纯虚函数的类不能实例化
B 声明纯虚函数的类成虚基类
C 子类必须实现基类的
D 纯虚函数必须是空函数

提示a:声明纯虚函数的类叫抽象类,无法实例化对象,因为抽象类的作用就是产生子类的同时给于子类一些特定的属性和方法.由子类实例化出对象.

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,就比如:苹果实现一个子类,葡萄实现一个子类,但是在抽象类中只有些他们共同的特点,是水果,有皮,但是却无法具体描述他们是什么,具体都在子类中实现.所以在抽象类实例化对象时没有意义的.

提示b:基类被虚继承才是虚基类

提示c:没有规定子类必须实现基类,如果没有完全实现基类的方法,那么子类也依然是抽象类.

提示d: 空函数指的是什么都不做,比如:

void fun(){
}

但是虚函数是指在函数后面加 ‘等于号和0’

virtual int fun(int x int y)=0;

问答题4:下列情况中,不会调用拷贝构造函数的是?

(A) 用一个对象去初始化同一个类的另一个新对象时
(B) 将类的一个对象赋值给该类的另一个对象时
(C) 函数的形参对象,调用函数进行形参和实参结合时
(D) 函数的返回值是类的对象,函数执行返回调用时

提示a:由于另一个新的对象没有被构造好,所以会调用拷贝构造函数

提示b:无法直接将一个类对象赋值给另一个类对象,必须进行类型转换

提示c:函数的形参和实参相结合的时候,可能会调用拷贝构造函数,但是如果传指针,或者传引用就不会调用了.

提示d:函数在返回前,如果返回的是类对象,会调用拷贝构造函数,例如:

要调用拷贝构造函数一定是被拷贝的对象还没有构造,赋值的对象已经构造好了,如果都已经构造好了,那就会调用赋值函数.单纯的构造一个对象,会调用构造函数.

问答题5:下面程序输出什么?

#include<iostream>
using namespace std;
 
class A{  
public:     
	A(char *s){cout<<s<<endl;}
 };
 
class B:virtual public A{  
public: 
	B(char *s1,char*s2):A(s1){cout<<s2<<endl;}   
};
 
class C:virtual public A{  
public: 
	C(char *s1,char*s2):A(s1){cout<<s2<<endl;}  
 };
 
class D:public B,C{
public:
	D(char*s1,char *s2,char *s3,char *s4):B(s1,s2),C(s3,s4),A(s1){cout<<s4<<endl;}

int main(){
	D *p = new D("class A", "class B", "class C", "class D");
	delete p;
	return 0;
}

提示:D 对象进入类的初始化区,那个顺序是和类的创建顺序有关,和书写的顺序没有关系,所以首先 执行 A(s1) 然后是 B(s1,s2),C(s3,s4),最后执行cout<<s4<<endl; 如果构造好的对象,就不会重复构造了.

答案:class A    class B    class C    class D

编程题

编程题1:发糖果

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:

A - B,B - C, A + B,B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C 这里保证最多只有一组整数A,B,C 满足所有题设条件

输入为一行,一共4个整数,分别为A - BB - CA + BB + C,用空格隔开,范围均在 -30 到 30 之间(闭区间)

#include <iostream>
using namespace std;

int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int A = (a+c)/2;
    int C = (d-b)/2;
    int B1 = (b+d)/2;
    int B2 = (c-a)/2;
    if(B1==B2){
        cout<<A<<" "<<B1<<" "<<C<<endl;
    }else{
        cout<<"No"<<endl;
    }
    return 0;
}

B1==B2 比较用两种方法计数出来的 B 是否相等,如果相等就说明数字是有效的,但是如果不相等,则说明给出的数字是有误的,不满足题意;

编程题2: 十进制转为任意进制

给定一个十进制数M,以及需要转换的进制数N,将十进制数M转化为N进制,

提示:将16进制所有数都写出来

table = “0123456789ABCDEF”;

然后通过取模的方式,将对应的字符添加到输出字符串中,最后要进行翻转.另外负数需要标记一下

#include <iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
	string s, table = "0123456789ABCDEF";
	int m, n;
	cin >> m >> n;
	bool flag = false;
	// 如果是负数,则转成正数,并标记一下
	if (m < 0){
		m = 0 - m;
		flag = true;
	}
	// 按进制换算成对应的字符添加到s
	while (m){
		s += table[m%n];
		m /= n;
	}
	if (flag){
		s += '-';
	}
	reverse(s.begin(), s.end());
	cout << s << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值