机试入门(一)

146 阅读12分钟

日期时间输入输出I

题目描述

按 YYYY-MM-DD HH:MI:SS 的格式输入年、月、日、时、分、秒,然后输出它们。

注:

  1. 不要使用读入字符串然后分割子串的方式

输入描述

满足格式 YYYY-MM-DD HH:MI:SS 的字符串(时间范围为 1900-01-01≤DAY≤2199-12-31)。数据保证一定合法。

输出描述

分 6 行按整数形式分别输出年、月、日、时、分、秒。

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int yyyy, mm, dd, hh, mi, ss;

    scanf("%d-%d-%d %d:%d:%d", &yyyy, &mm, &dd, &hh, &mi, &ss); //利用scanf进行指定格式化输入
    cout << yyyy << endl;
    cout << mm << endl;
    cout << dd << endl;
    cout << hh << endl;
    cout << mi << endl;
    cout << ss << endl;

    return 0;
}

日期时间输入输出II

题目描述

按 YYYY-MM-DD HH:MI:SS 的格式输入年、月、日、时、分、秒,然后输出它们。

注:

  1. 不要使用读入字符串然后分割子串的方式

输入描述

满足格式 YYYY-MM-DD HH:MI:SS 的字符串(时间范围为 1900-01-01≤DAY≤2199-12-31)。数据保证一定合法。

输出描述

分 6 行按整数形式分别输出年、月、日、时、分、秒,要求高位不满对应位数时用 0 补齐。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

string fillPrefixZero(int n)
{
    if(n > 10)
        return to_string(n);
    else
        return "0" + to_string(n);
}

int main()
{
    int yyyy, mm, dd, hh, mi, ss;
    scanf("%d-%d-%d %d:%d:%d", &yyyy, &mm, &dd, &hh, &mi, &ss);
    cout << to_string(yyyy) << endl;
    cout << fillPrefixZero(mm) << endl;
    cout << fillPrefixZero(dd) << endl;
    cout << fillPrefixZero(hh) << endl;
    cout << fillPrefixZero(mi) << endl;
    cout << fillPrefixZero(ss) << endl;
    
    return 0;
}
/*
    在上一问题基础上增加了前导零
    不足10的要加前导0,足10的不用加前导0
    to_string(int)将一个整型数字改成string型,以便后续补0操作
    也就是说如果有需要,可以用int类型输入数据,然后转成string类型进行操作
*/

数学函数系列I

题目描述

输入一个浮点数,分别输出它的绝对值、向下取整、向上取整、四舍五入、五次方的结果。

输入描述

一个浮点数d(−10≤d≤10)。

输出描述

在一行输出d的绝对值(精确到小数点后2位)、向下取整、向上取整、四舍五入、五次方(精确到小数点后2位)的结果,用一个空格分隔。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double d;
    cin >> d;

    printf("%.2lf %.0lf %.0lf %.0lf %.2lf", fabs(d), floor(d), ceil(d), round(d), pow(d, 5));
    return 0;
}

数学函数系列II

题目描述

输入一个非负浮点数,分别输出它的开根号、以自然对数为底的对数的结果。

输入描述

一个浮点数d(0≤d≤10)。

输出描述

在一行输出d的开根号、以自然对数为底的对数的结果(全部精确到小数点后2位),用一个空格分隔。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    double d;
    cin >> d;

    printf("%.2lf %.2lf", sqrt(d), log(d));
    return 0;
}

switch语句

题目描述

输入一个非负整数n(0≤n≤9),如果0≤n≤5,那么输出对应的英文单词:Zero、One、Two、Three、Four、Five,否则输出"Greater than 5"。

注:

  1. 使用switch语句实现效果

输入描述

一个非负整数n(0≤n≤9)。

输出描述

按题意输出结果。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;

    switch(n)
    {
        case 0:
            cout << "Zero";
            break;
        case 1:
            cout << "One";
            break;
        case 2:
            cout << "Two";
            break;
        case 3:
            cout << "Three";
            break;
        case 4:
            cout << "Four";
            break;
        case 5:
            cout << "Five";
            break;
        default:
            cout << "Greater than 5";
    }
    return 0;
}

memset函数

题目描述

输入一个整数x,对一个整型数组A执行memset函数:memset(A, X, sizeof(A)),然后输出该数组的第一个元素。

输入描述

一个整数x(−2≤x≤2)。

输出描述

按题意输出一个整数。

#include <bits/stdc++.h>
using namespace std;

const int N = 5;
int a[N];

int main()
{
    int x;
    cin >> x;
    memset(a, x, sizeof(a));

    cout << a[0];

    return 0;
}
//memset函数以字节为单位,对数组中每个元素进行赋值

字符串输入输出I

题目描述

输入一行字符串,然后直接输出这行字符串本身。

#include <bits/stdc++.h>
using namespace std;

const int N = 55;
char str[N];

int main()
{
    cin.getline(str, N);
    cout << str;
    return 0;
}
// cin.getline(int a[], 长度):读入指定长度的字符到a数组中

字符串输入输出II

题目描述

输入n行字符串,然后直接输出这些字符串本身。

输入描述

第一行一个正整数n(1≤n≤5),表示字符串的行数;

接下来n行,每行均为由大小写字母或空格组成的字符串,每行至少一个字符,且不超过50个字符。

输出描述

共n行,原样输出每一行输入的字符串。

#include <bits/stdc++.h>
using namespace std;

const int N = 55;

int main()
{
    int n;
    cin >> n;
    getchar();  //用getchar()吸掉一个回车
    while(n--)
    {
        char a[N];
        cin.getline(a, N);
        cout << a << endl;
    }

    return 0;
}

字符串的长度

题目描述

输入一行字符串,输出它的长度。

输入描述

一行由大小写字母或空格组成的字符串,至少一个字符,不超过50个字符。

输出描述

输出一个整数,表示字符串的长度。

#include <bits/stdc++.h>
using namespace std;


const int N = 55;

int main()
{
    char str[N];
    cin.getline(str, N);
    cout << strlen(str);  //其他都和上面问题一样,只有最后使用了strlen()函数获得字符串长度
        
    return 0;
}

字符串比较

题目描述

给定两个字符串,比较它们的字典序大小。

输入描述

两行仅由小写字母组成的字符串,至少一个字符,不超过50个字符。

输出描述

如果第一个串的字典序小于第二个串,输出"<";

如果第一个串的字典序等于第二个串,输出"=";

如果第一个串的字典序大于第二个串,输出">"。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string str1, str2;
    cin >> str1 >> str2;
    if(str1 < str2)     cout << '<';
    else if(str1 == str2)   cout << '=';
    else    cout << '>';
    
    return 0;
}
//使用string类型字符串可以直接比较字符串的字典大小关系

字符串拼接

题目描述

给定两个字符串,输出将它们前后拼接后的字符串。

注:

  1. 请先将字符串拼接成一个串,然后再输出,而不要直接输出两个字符串

输入描述

两行仅由小写字母组成的字符串,至少一个字符,不超过50个字符。

输出描述

输出将两个字符串前后拼接后的字符串。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string str1, str2;
    cin >> str1 >> str2;
    
    cout << str1 + str2;

    return 0;
}
//使用string类型可以直接拼接字符串

sscanf函数

题目描述

给定一个字符串,它可能是以下三种格式中的一种:

  1. A is greater than B
  2. A is equal to B plus C
  3. No Information

其中前两种情况中的A、B、C均为正整数,而第三种情况中没有数字。请确认字符串代表的信息是否从算术上成立,如果成立,那么输出Yes;否则输出No;如果是第三种情况,那么输出三个问号(即???)。

注:

  1. 请将字符串整行读入后使用sscanf函数进行处理

输入描述

一行满足题意的字符串,其中A、B、C为不超过100的正整数。

输出描述

根据题意输出Yes、No或???。

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
char str[N];

int main()
{
    cin.getline(str, N);   //正常读入字符串str
    int a, b, c;
    if(sscanf(str, "%d is greater than %d", &a, &b) == 2)
        a > b ? cout << "Yes" : cout << "No";
    else if(sscanf(str, "%d is equal to %d plus %d", &a, &b, &c) == 3)
        a == b+c ? cout << "Yes" : cout << "No";
    else
        cout << "???";

    return 0;
}
/*
`sscanf` 可以将字符数组按某个格式匹配提取出其中的某些部分,并将这些部分赋值到变量中。
使用的方式和 `scanf` 类似,我们可以把 `scanf(格式串, &变量)` 视为从程序输入中按格式字符串的格式提取出变量
返回值为成功读入的变量个数
*/

sprintf函数

题目描述

给定年、月、日、时、分、秒,生成 YYYY-MM-DD HH:MI:SS 格式的字符串并输出。

注:

  1. 请先使用sprintf函数生成字符串后再输出

输入描述

6个非负整数YYYY、MM、DD、HH、MI、SS(0≤YYYY≤9999, 1≤MM≤12, 1≤DD≤12, 0≤HH≤23, 0≤MI≤59, 0≤SS≤59)。

输出描述

按题意输出一行字符串。

#include <bits/stdc++.h>
using namespace std;

const int N = 55;
char str[N];

int main()
{
    int yyyy, mm, dd, hh, mi, ss;
    cin >> yyyy >> mm >> dd >> hh >> mi >> ss;
    
    sprintf(str, "%04d-%02d-%02d %02d:%02d:%02d", yyyy, mm, dd, hh, mi, ss);
    cout << str;
    
    return 0;
}
//sprintf按照指定格式设计出一个字符串str,然后将str输出即可
//sprintf和sscanf是相反的过程,sprintf将变量塞进字符串;sscanf从字符串提取变量值

交换指针变量

题目描述

实现一个函数void swap(int* a, int* b),使交换*a*b的值。

在main函数中输入两个正整数,调用swap函数交换两个变量地址中存储的值,然后输出交换后的两个值。

注:

  1. 请使用指针变量来完成功能,不要直接颠倒输出

输入描述

两个正整数a、b(1≤a,b≤100)。

输出描述

输出交换后的结果。

#include <bits/stdc++.h>
using namespace std;

void swap(int * a, int * b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

int main()
{
    int a, b;
    cin >> a >> b;
    swap(&a, &b);
    cout << a << ' ' << b;

    return 0;
}

引用

题目描述

实现一个函数void increase(int &x)(其中&表示引用),使x增加1。

在main函数中输入一个正整数n,调用increase函数让n增加1,然后输出n。

注:

  1. 请实现指定函数来完成功能
  2. 引用是C++语言的特性,注意调整提交语言。

输入描述

一个正整数n(1≤n≤100)。

输出描述

输出调用increase函数后n的值。

#include <iostream>
using namespace std;

void increase(int &x)
{
    x++;
}

int main()
{
    int n;
    cin >> n;
    increase(n);
    cout << n;
    return 0;
}
//引用接受参数,只要在形参上加个&即可

结构体与构造函数I

定义如下的结构体:

struct Point {
    int x, y;
}

为该结构体实现两个构造函数:

  1. Point()
  2. Point(int _x, int _y)

在main函数中进行如下步骤:

  1. 定义一个Point类型的变量Point point
  2. 输入两个正整数x、y
  3. 通过Point(x, y)的方式构造一个Point并赋值给前面已定义好的point变量
  4. 输出point.xpoint.y
  5. 体会并理解上面的过程

注:

  1. 请实现结构体的构造函数来完成功能,不要直接输出输入的内容
  2. 以上为 C++ 的实现步骤,如果是 C 语言请在结构体外实现单独的函数
  3. 实现过程有问题可以参考题解中的解释

参考代码:

#include <cstdio>

struct Point {
    int x, y;
    Point() {}
    Point(int _x, int _y) {
        x = _x;
        y = _y;
    }
};

int main() {
    Point point;
    int x, y;
	scanf("%d%d", &x, &y);
    point = Point(x, y);
    printf("%d %d", point.x, point.y);
    return 0;
}
#include <iostream>
using namespace std;

struct Point{
    int x, y;
    Point(){}
    Point(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
};

int main()
{
    int x;
    int y;
    Point point;
    cin >> x >> y;

    point = Point(x, y);
    cout << point.x << ' ' << point.y;

    return 0;
}
// 在结构体的定义中写构造函数,利用构造函数进行赋值操作

结构体与构造函数II

题目描述

定义如下的结构体:

struct Student {
    int id;
    char name[15];
}

为该结构体实现一个构造函数:

  1. Student(int _id, char _name[])

在main函数中进行如下步骤:

  1. 定义一个Student类型的变量Student student
  2. 输入一个正整数id与一行字符串name
  3. 通过Student student = Student(id, name)的方式构造一个Student类型的变量student
  4. 输出student.idstudent.name
  5. 体会并理解上面的过程

注:

  1. 请实现结构体的构造函数来完成功能,不要直接输出输入的内容
  2. 以上为 C++ 的实现步骤,如果是 C 语言请在结构体外实现单独的函数
  3. 实现过程有问题可以参考题解中的解释

参考代码:

#include <cstdio>
#include <cstring>

struct Student {
    int id;
    char name[15];
    Student(int _id, char _name[]) {
        id = _id;
        strcpy(name, _name);
    }
};

int main() {
    int id;
    char name[15];
    scanf("%d%s", &id, name);
    Student student = Student(id, name);
    printf("%d\n%s", student.id, student.name);
    return 0;
}

输入描述

第一行为学生的id(1≤id≤100),第二行为一个长度不超过10的只含有小写字母的字符串,表示学生的姓名。

输出描述

按题意分两行输出student.idstudent.name

#include <bits/stdc++.h>
using namespace std;

struct Student{
    int id;
    char name[15];
    Student(){}
    Student(int _id, char _name[])
    {
        id = _id;
        strcpy(name, _name);        //利用strcpy()完成字符串赋值
    }
};

int main()
{
    int id;
    char name[20];

    cin >> id >> name;
    Student student = Student(id, name);
    cout << student.id << endl << student.name;

    return 0;
}

结构体与构造函数III

题目描述

定义如下的结构体:

struct Node {
    int id;
    Node* left;
    Node* right;
}

为该结构体实现一个构造函数:

  1. Node(int _id, Node* _left, Node* _right)

在main函数中进行如下步骤:

  1. 输入三个正整数id1、id2、id3
  2. 通过Node node1 = Node(id1, NULL, NULL)Node node2 = Node(id2, NULL, NULL)的方式构造两个变量node1和node2
  3. 通过Node node3 = Node(id3, &node1, &node2)的方式构造变量node3,其中&是取地址符
  4. 最后输出node3.left->idnode3.right->id
  5. 体会并理解上面的过程
#include <bits/stdc++.h>
using namespace std;

struct Node{
    int id;
    Node * left;
    Node * right;

    Node(){}
    Node(int _id, Node * _left, Node * _right)
    {
        id = _id;
        left = _left;
        right = _right;
    }
};

int main()
{
    int id1, id2, id3;
    cin >> id1 >> id2 >> id3;
    struct Node node1 = Node(id1, NULL, NULL);
    struct Node node2 = Node(id2, NULL, NULL);
    struct Node node3 = Node(id3, &node1, &node2);

    cout << node3.left->id << ' ';
    cout << node3.right->id;
    return 0;
}