鱼C论坛

 找回密码
 立即注册
查看: 4899|回复: 23

[已解决]统计个数怎么写这程序

[复制链接]
发表于 2022-3-31 21:21:08 | 显示全部楼层 |阅读模式
5鱼币
题目描述
小名的好朋友A送给了小B一大包水果,里面有苹果(apple)、桃子(peach)、香蕉(banana),各种水果放在了一个列表里,请你计算一下苹果的个数。
输入格式
输入一行,包含若干个字符串,字符串之间用空格隔开,字符串只可能是apple、peach、banana,至多有 100100 个字符串。
输出格式
输出一个数字,表示苹果的个数。
输入样例 复制
apple peach peach banana banana banana
输出样例 复制
1


这个程序怎么写有大佬指点一下吗?
最佳答案
2022-3-31 21:21:09
本帖最后由 傻眼貓咪 于 2022-4-1 10:52 编辑

#include <iostream>
#include <map>

int main(){
        std::map<std::string, size_t> fruits = {{"apple", 0}, {"peach", 0}, {"banana", 0}};
        std::string fruit;
        while(std::cin >> fruit) fruits[fruit]++;
        for(auto const& [key, value] : fruits){
                std::cout
                        << key
                        << ": "
                        << value
                        << std::endl;
        }
        return 0;
}
apple: 1
banana: 3
peach: 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-31 21:21:09 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-4-1 10:52 编辑

#include <iostream>
#include <map>

int main(){
        std::map<std::string, size_t> fruits = {{"apple", 0}, {"peach", 0}, {"banana", 0}};
        std::string fruit;
        while(std::cin >> fruit) fruits[fruit]++;
        for(auto const& [key, value] : fruits){
                std::cout
                        << key
                        << ": "
                        << value
                        << std::endl;
        }
        return 0;
}
apple: 1
banana: 3
peach: 2

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-31 21:34:15 | 显示全部楼层
$ cat main.c 
#include <stdio.h>
#include <string.h>

int main(void) {
    char buff[7];
    size_t count = 0;
    while(scanf("%s", buff) == 1) {
        if(!strcmp(buff, "apple")) ++count;
    }
    printf("%lu\n", count);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main 
apple peach peach banana banana banana
1
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-1 08:16:43 | 显示全部楼层

大佬这个是C++的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-1 08:36:11 | 显示全部楼层

#include <iostream>
#include <string.h>
#include <string>
#include <cstring>
using namespace std;
int main()
{
        string a[6];
        int conp=0;
        cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5];
        for(int i=0;i<6;i++)
        {
                if(a[i]=="apple") conp++;
        }
        cout<<conp;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 09:36:59 | 显示全部楼层
asd74827 发表于 2022-4-1 08:16
大佬这个是C++的吗

这代码哪里像C++了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 10:12:21 | 显示全部楼层
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char a[100100],b[7]="apple",c[7];
    int i,j,count=0;
    for (i = -1; a[i++]!='\n'; )
        scanf("%c", &a[i]);
    a[i] = '\0';
    for (i = 0,j=0; a[i]; i++)
    {
        if (a[i] != 32)
            c[j++] = a[i];
        else
        {
            c[j] = '\0';
            if (strcmp(b, c) == 0)
                count++;
            j = 0; c[j] = { 0 };
        }
    }
    printf("%d", count);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 10:31:56 From FishC Mobile | 显示全部楼层
#include <iostream>

int main(){
        std::string fruit;
        int apple = 0;
        while(std::cin >> fruit){
                if(fruit == "apple"){
                        apple++;
                }
        }
        std::cout << apple << std::endl;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 17:20:31 | 显示全部楼层
按照题目要求,这道题并没那么简单。需要用到动态分配内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF 1024

/*
        从字符串str中获取以空格分割的第1个单词,然后修改指针指向下一个单词,直到'\0'为止,最后置*str==NULL。
        参数:
                str 以'\0'结束的字符串。
        返回值:
                成功 返回单词所在的内存指针。
                失败 返回NULL。
*/
char *getWord(char **str)
{
        char *buf=NULL, c;
        int i, len;

        if(*str==NULL)
        {
                return NULL;
        }

        // 判断字符串长度为0返回
        len = strlen(*str);
        if(len==0)
    {
        return NULL;
    }

    // 删除字符串前面的所有空格
        for(i=0; i<=len; i++)
        {
                if((*str)[i]!=' ')
                {
                    break;
                }                
        }
        *str += i;

        // 再次判断字符串长度为0返回(到了尾部的空格处理)
        len = strlen(*str);
        if(len==0)
    {
        return NULL;
    }

        // 为单词分配内存
        buf = (char*)malloc(sizeof(char)*BUF);
        if(buf==NULL)
        {
                printf("内存分配失败。-3");
                return NULL;
        }

        // 获取单词
        for(i=0; i<=len; i++)
        {
                c = (*str)[i];
                if(c==' ' || c=='\0')
                {
                        buf[i] = '\0';
                        break;
                }
                buf[i] = c;
        }
        if(c=='\0')
        {
                *str = NULL;
        }
        else
        {
                *str = *str+i*sizeof(char);
        }

        return buf;
}

/*
        从用户输入的字符串获取以空格分割的个单词。
        参数:
                *words[] 存储单词的指针数组。
                len *words指针数组的总长度。
        返回值:
                返回所有单词的个数。
*/
int getWords(char *words[], int len)
{
        char *str=NULL, *str_temp=NULL;
        char *buff=NULL;
        int i;

        // 获取字符串
        str = (char *)malloc(sizeof(char)*BUF);
        if(str==NULL)
        {
                printf("内存分配失败-1。");
                return 0;
        }
        i=1;
        while(gets(str)==NULL)
        {
                str = (char *)realloc(str, sizeof(char)*BUF*(++i));
                if(str==NULL)
                {
                        printf("内存分配失败-2。");
                        return 0;
                }
        }

        str_temp = str;
        i=0;
        while( (buff=getWord(&str_temp)) != NULL )
        {
                words[i] = buff;
                i++;
        }
        free(str);
        str=NULL;

        return i;
}

/*
        释放 *words[]指针数组中元素的内存
*/
void freeWords(char *words[])
{
        char *buf;

        while( (buf=*words++)!=NULL )
        {
                free(buf);
        }
}

/*
        统计单词的个数。
        参数:
                *words[] 存储单词的指针数组。
                *word 目标单词。
        返回值:
                返回匹配到的数量。
*/
int countWord(char *words[], char *word)
{
        char *buf;
        int count = 0;

        while( (buf=*words++)!=NULL) 
        {
        if(!strcmp(buf, word)) ++count;
    }

        return count;
}

int main(void) {

    char *words[100100]={NULL}; // 最多保存100100个字符串
    char word[BUF]={'\0'};
        int len = 0, count;

        len = getWords(words, 100100);

        printf("请输入要统计的单词(区分大小写):");
        scanf("%s", &word);
        count = countWord(words, word);
        printf("%d\n", count);

        freeWords(words);

    return 0;
}

评分

参与人数 1鱼币 +5 收起 理由
1613551 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 20:27:46 | 显示全部楼层
#include <stdio.h>
#include <string.h>
int main() {
    char fruit[20];
    int count = 0;
    char ch;
    while (1) {
        scanf("%s", fruit);
        ch = getchar();
        if (strcmp(fruit, "apple") == 0)
            count++;
        if (ch == '\n')
            break;
    }
    printf("%d\n", count);


    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 21:44:05 | 显示全部楼层

学到了新的知识,感谢
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 22:08:21 | 显示全部楼层
人造人 发表于 2022-4-1 21:44
学到了新的知识,感谢
^_^

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 22:31:42 | 显示全部楼层
ba21 发表于 2022-4-1 17:20
按照题目要求,这道题并没那么简单。需要用到动态分配内存。

严重怀疑你是不是个大佬(我去,我感觉我白学了啊)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-2 15:25:59 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-2 15:38 编辑
int main()
{
        const long long suiguo[3]={*(long long*)("apple"),*(long long*)("peach"),*(long long*)("banana")};
        int suiguocount[3]={0};

        do
        {
                long long tmp=0;
                scanf("%s",&tmp);
                for (int i = 0; i < 3; i++)
                {
                        if (tmp==suiguo[i])
                        {
                                suiguocount[i]++;
                                break;
                        }
                }
        } while (getchar()!='\n');
        for (int i = 0; i < 3; i++)
        {
                printf("%s:%d\n",suiguo+i,suiguocount[i]);
        }                             
        return 0;
}
apple peach peach banana banana banana
apple:1
peach:2
banana:3
int main()
{
        const long long suiguo[3][4]={{*(long long*)("apple")},{*(long long*)("peach")},{*(long long*)("banana")}};
        int suiguocount[3]={0};

        do
        {
                long long tmp[4]={0};
                scanf("%s",tmp);
                for (int i = 0; i < 3; i++)
                {
                        int j = 0;
                        for (; j < 4; j++)
                        {
                                if (tmp[j]!=suiguo[i][j])break;
                        }
                        if (4==j)
                        {
                                suiguocount[i]++;
                                break;
                        }
                }
        } while (getchar()!='\n');
        for (int i = 0; i < 3; i++)
        {
                printf("%s:%d\n",suiguo+i,suiguocount[i]);
        }                             
        return 0;
}
apple peach peach banana banana banana apple peach peach banana banana
apple:2
peach:4
banana:5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-16 12:16:40 | 显示全部楼层
#include <stdio.h>
using namespace std;
int main()
{
       //freopen("fruit.in","r",stdin);
       //freopen("fruit.out","w",stdout); 本地测试加上,否则死循环,online judge做题没事
        char s[10];
        int cnt=0;
        while (scanf("%s",s))//scanf读入失败返回0
                if (s[0]=='a')//第一个字符是a一定是apple
                        ++cnt;
        printf("%d",cnt);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-16 19:11:02 | 显示全部楼层
// C++ 写的
#include <bits/stdc++.h> // 万能文件头
using namespace std;

string fruit; // 每次读入水果名
int ans = 0; // 答案

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0); // 写了 9-10 行会大大加快 cin 和 cout 的速度, 缺点是无法使用 scanf 和 printf
    
    while(cin >> fruit){ // 如果后面还有, 就一直读入
        if(fruit == "apple") ans++; // 如果是 apple 就加一
    }

    cout << ans << endl; // 最后输出答案
    
    return 0;  // 结束
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-16 19:12:48 | 显示全部楼层

这个是什么版本啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-16 20:19:24 | 显示全部楼层

你是说 auto const& [key, value] : fruits 这句代码?
版本好像是 C++17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-16 23:01:32 | 显示全部楼层
以下代码只适用于使用in/out文件评测情况下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int ans=0;
    while(cin.get()!=EOF)
    {
        cin.unget();
        cin>>s;
        if(s[0]=='a')ans++;
    }
    cout<<ans;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-17 09:44:33 | 显示全部楼层
傻眼貓咪 发表于 2022-8-16 20:19
你是说 auto const& [key, value] : fruits 这句代码?
版本好像是 C++17

用不了啦
只能用迭代器->first
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表