8.发言统计

目录

题目

思路

C语言代码

说明

C++代码

vector使用

什么是Vector?

Vector的基本使用

本题思路


题目

Description
DarkDawn作为小学期的助教,工作之一便是统计讨论区同学们的发言情况。

DarkDawn是真的很严格,他认为一条发言不超过10个字符是没有营养的,同时如果一条发言在先前出现过一次,也是没有营养的发言。

DarkDawn很想立刻统计出结果,但他真的太累了,所以请你帮帮忙,帮他统计出结果。如果你帮他完成了任务,他就奖励你一个A C。

Input
第一行一个整数n(1 ≤ n ≤ 1000),表示发言条数

接下来有n行,每行一个字符串s(1 ≤ | s | ≤ 20),表示一条发言,发言仅由大小写字母组成且区分大小写

Output
一个整数,表示有营养的发言的条数。


思路

本题思路很清晰。

首先记录n,依次遍历n条发言:

如果这条发言超过十个字符并且先前未出现过,该发言就是有营养的。

可以利用字符串动态数组来记录之前的发言。

下面我将给出C语言和C++的代码以及相关注意事项。


C语言代码

说明

在 C 语言中,我们使用 scanf 函数来读取输入,使用 printf 函数来输出结果。为了存储字符串,我们使用了动态内存分配,使用字符指针数组 char** vec 来存储字符串的地址,并使用 malloc 和 free 来分配和释放内存。

在循环中,我们使用 strlen 函数来获取字符串的长度,使用 strcmp 函数来比较字符串是否相等。当字符串长度大于 10 且不在 vec 数组中时,我们将它复制到 vec 数组中,并增加 vecSize 的值。

最后,我们输出 vecSize 的值,并释放动态分配的内存。

#include 
#include 
#include 

int main() {
    int n;
    scanf("%d", &n);
    
    char** vec = (char**)malloc(n * sizeof(char*));//存储字符串的地址
    int vecSize = 0;

    for (int i = 0; i < n; i++) {
        char str[100];
        scanf("%s", str);

        if (strlen(str) > 10) {
            int found = 0;
            for (int j = 0; j < vecSize; j++) {
                if (strcmp(vec[j], str) == 0) {
                    found = 1;
                    break;
                }
            }

            if (!found) {
                vec[vecSize] = (char*)malloc((strlen(str) + 1) * sizeof(char));
                strcpy(vec[vecSize], str);
                vecSize++;
            }
        }
    }

    printf("%d\n", vecSize);

    for (int i = 0; i < vecSize; i++) {
        free(vec[i]);
    }
    free(vec);

    return 0;
}

C++代码

C++比C语言的代码简短很多。

#include 
#include 
#include 
#include 
using namespace std;
int main() {
	int n;
	cin >> n;
	vector vec;
	for (int i = 0; i < n; i++) {
		string str;
		cin >> str;
		auto iter = find(vec.begin(), vec.end(), str);
		if (str.size() > 10 && iter == vec.end()) vec.push_back(str);//str大于十个字符并且在数组中没有找到相同的字符串
	}
	cout << vec.size() << endl;
	return 0;
}

vector使用

什么是Vector?

vector是【C++】中一个多功能的,能够操作多种数据结构和算法的模板类函数库。我们可以将它理解为一个能够存放任意类型的动态数组,能够增加和压缩数据。

Vector的基本使用

Vector头文件:#include

声明一个vector容器:vector<数据类型> 名称;

添加元素到容器中:名称.push_back(元素);

判断某一元素是否存在于容器中:

vector<数据类型> :: iterator iter;

iter = find(容器名.begin(), 容器名.end(), 匹配元素);

if(iter != 容器名.end())

{

    // 存在于容器中

}

vector<数据类型>::iterator 是用来声明一个迭代器的语法。它用于指向 vector 容器中的元素,并且可以用来遍历容器中的元素。

下面是一个示例代码,演示了如何声明一个 vector 迭代器 iter

#include 
#include 

int main() {
    std::vector vec = {1, 2, 3, 4, 5};

    // 声明一个 vector 迭代器
    std::vector::iterator iter;

    // 使用迭代器遍历 vector 容器中的元素
    for (iter = vec.begin(); iter != vec.end(); ++iter) {
        std::cout << *iter << " ";
    }

    return 0;
}

在上面的示例代码中,我们定义了一个整数类型的 vector 容器 vec,并且声明了一个 vector 迭代器 iter。然后,我们使用 for 循环和迭代器来遍历 vec 容器中的元素,并将每个元素打印出来。

注意,在 C++11 之后,可以使用 auto 关键字来自动推导迭代器类型,简化代码。示例如下:

#include 
#include 

int main() {
    std::vector vec = {1, 2, 3, 4, 5};

    // 使用 auto 关键字自动推导迭代器类型
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
        std::cout << *iter << " ";
    }

    return 0;
}

在上面的示例代码中,我们使用 auto 关键字来自动推导迭代器类型,无需显式声明迭代器类型。这样可以使代码更加简洁和易读。

获取容器中元素个数:名称.size();

本题思路

借助vector的便利性,我们可以轻松实现本题功能。

在读入一个 String 后,我们可以先【查找】该字符串是否存在于vector容器中,如果【不存在】且【长度符合要求(使用String的size()方法)】时,我们将该字符串【添加(vector的push_back()方法)】到vector容器中。

在完成所有数据读入后,我们可以使用vector容器的size()方法来获取所有有效回答数量,输出即可。

你可能感兴趣的:(程序设计方法与实践,算法,数据结构,c语言,c++)