PTA c++ week3

本文探讨了C++中的函数重载概念,明确了返回值不同并不构成重载,并通过代码实例展示了正确的重载实现。同时,讲解了const在函数参数中的应用,强调了内联函数优化程序速度的作用。此外,还提供了日期处理函数的实现,包括初始化、增加天数和显示日期,以及文件名合法性的检查和转换。

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

这一周一切慢慢好起来了!

1.函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。    (T)

2.两个以上的函数,具有相同的函数名,且形参的个数或形参的类型不同,或返回的数据类型不同,则称之为函数的重载。               (F)

3.下列说法中正确的是( )        (A)

A.在函数参数定义中可以使用const说明符,其值在函数体内不可改变

B.在函数参数定义中可以使用const说明符,但必须指定缺省值

C.在函数参数定义中可以使用const说明符,但只能有一个参数使用const

D.在函数参数定义中不可以使用const说明符

4.const char * pc与char const * pc的作用完全相同   (T)

5.对定义重载函数的下列要求中,( )是错误的。   (C)

A.要求参数的个数不同

B.要求参数中至少有一个类型不同

C.要求函数的返回值不同

D.要求参数个数相同时,参数类型不同

6.一个函数为void f(int x, char y = ‘a’),另一个函数为void f(int),则它们____。 (B)

A.不能在同一程序块中定义

B.可以在同一个程序块中定义并可重载

C.可以在同一个程序块中定义,但不可以重载

D.以上说法均不正确

7.使用内联函数的目是提高程序运行速度。  (T,空间换时间)

8.(记住那些规则哦)

int const x = 3;
auto y { x };
auto& z { x };

则y和z的类型分别是

A.const int 和 int

B.int 和 int

C.int 和 const int

D.int 和 int&

9.代码实例1:auto与重载:

设计一个重载函数add,该函数有两个参数,可以实现两个类型相同的参数相加的操作,函数返回相加的结果。两个参数可以是整数、实数和字符串,但必须保证两个参数类型相同。

我的代码:(其实可以return Pa+Pb;)

auto add(int pa,int pb)
{   int t;
    t=pa+pb;
    return t;
}
auto add(double pa,double pb)
{  double t;
    t=pa+pb;
    return t;
}
auto add(string pa,string pb)
{   string t;
    t=pa+pb;
    return t;
}

10.代码实例2:有代表性与过渡性的年月日编辑题

void init(Date& date, int year, int month, int day);
init函数用于设置日期结构体变量date的年、月、日的信息。在设置数据值时,对参数给出的日期数据做有效性检查,检查顺序为如果年的数据小于1900年或者大于2120年,则视为非法数据,输出字符串“year is invalid”,,程序结束;如果月的数据小于1或者大于12,则视为非法数据,输出字符串“month is invalid”,程序结束;如果日的数据不在当前年和月份的有效数据范围内(注意2月的天数闰年和非闰年的区别),则视为非法数据输出字符串“day is invalid”,程序结束。程序结束。
void addDay(Date& date, int n);
addDay函数用于根据给定的整型参数值n(28>n>0),用于设定当前date的n天后的日期;
void show(Date date, char spor);
show函数用于根据参数spor给出的分隔符输出日期date的年月日信息。

提示:exit() 函数可以强行退出程序,该函数在头文件<cstdlib> 当日期年、月、日不符合逻辑时,仅输出规定的字符串,不要输出任何多余信息;(实际我们后面用的时候返回exit(0))

输入格式:

三个由空格分隔的整数,分别代表日期的年、月、日。

输出格式:

如果输入年数据非法,输出字符串“year is invalid”,程序结束

如果输入月数据非法,输出字符串“month is invalid”,程序结束

如果输入日数据非法,输出字符串“day is invalid”,程序结束

如果输入日期数据均合法,以"年-月-日"的格式输出该日期,换行,接着输出2021/3/18,换行,接着以"年-月-日"的格式输出该日期十天后的日期。

标准代码:(这里直接标准代码,因为它体现了我的所有,还做到了我没注意的,比如%,if与else的顺序安排,使得整个代码量更小)

int area(int a,int b)
{
	return a * b;
 } 
int area(int a,int b,int c)
{
	return 2 * (a * b + a * c + b * c);
}
6-2
int add(int a, int b)
{
	return a + b; 
}
double add(double a, double b)
{
	return a + b;
}
string add(string a, string b)
{
	return a + b;
}
6-3
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
struct Date{
    int year;
    int month;
    int day;
    int maxDay[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
};
void init(Date& date, int year, int month, int day);
void addDay(Date& date, int n);
void show(Date date, char spor);
int main()
{

    int year, month, day;

    cin >> year >> month >> day;

    Date myBirth;

	init(myBirth, year, month, day);

    Date startTime;

	init(startTime, 2021, 3, 18);

    show(myBirth, '-');

    show(startTime, '/');

    addDay(myBirth, 10);

	show(myBirth, '-');

    return 0;

}
void init(Date& date, int year, int month, int day)
{
    if(year >= 1900 && year <= 2120)
        if(month >= 1 && month <= 12)
            if(day >= 1 && day <= date.maxDay[(year % 4 == 0 && year % 100 != 0) || year % 400 == 0][month])
            {
                date.year = year;
                date.month = month;
                date.day = day;
            }else{
                cout << "day is invalid" << endl;
                exit(0);
            }
        else{
            cout << "month is invalid" << endl;
            exit(0);
        }
    else {
        cout << "year is invalid" << endl;
        exit(0);
    }
}
void addDay(Date& date, int n)
{
    date.day += n;
    if(date.day > date.maxDay[(date.year % 4 == 0 && date.year % 100 != 0) || date.year % 400 == 0][date.month]){
        date.day %= date.maxDay[(date.year % 4 == 0 && date.year % 100 != 0) || date.year % 400 == 0][date.month];
        date.month ++;
        if(date.month > 12){
            date.year ++;
            date.month %= 12;
        }
    }
}
void show(Date date, char spor)
{
    cout << date.year << spor << date.month << spor << date.day << endl;
}

11.代码实例3:合法c->cpp:

本题要求从键盘上输入一行不带空格的字符串,如果该字符串为合法的c程序源文件名,则将重命名为c++源文件名(文件名后缀为.cpp),否则,输出invalid。合法的c程序源文件名为文件名的后缀必须为.c,且“.”不能出现在首位。

  1. 在主函数中定义一个string类型的变量接收键盘输入的不带空格的字符串;
  2. 获取字符'.'的位置;
  3. 获取输入文件的后缀名;
  4. 判断文件名是否为c程序源文件的合法文件名(合法的c程序源文件名为文件名的后缀必须为.c,且“.”不能出现在首位。),如果是,将文件名的后缀.c替换为.cpp,否则输出invalid。
  5. 不得使用C语言中的输入输出函数

输入输出例

如new.c---new.cpp

.c、new.v--- invalid

直接看代码吧,又学到自己哉写时不知道的几个函数:

#include<iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main()
{
	string file_name;
	cin >> file_name;
	int last_index =file_name.find_last_of(".");
	int first_index = file_name.find_first_of(".");
    string prefix =file_name.substr(last_index+1);

//很秀,substr函数在s.substr(x)时,返回s字符串从第x位置开始之后的所有字符串

	if (last_index!=string::npos && first_index != 0 && prefix=="c") 
	{


		file_name.replace(last_index+1, 3, "cpp");

//replace函数在s.replace(a,b,"...")时,将s字符串从a位置,将之后的b个字符换成"..."

		cout << file_name;
	}
	else cout << "invalid";
	return 0;
}

加油加油加C加加!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值