男性和女性的结构

时间:2014-03-22 20:42:02

标签: c++ structure

l应该使用数组a [10],其元素是struct osoba类型,输入10个名称和名字的人的性别......然后我应该使用函数void brosoba来确定有多少男性和女性在那里(我键入了多少)我唯一的问题是如何调用该函数t ostart工作,因为proffesor在使用数组时坚持使用void函数中的指针...... :(

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct osoba 
{
    char naziv[30];
    char pol[30];
}a[10];

 void brosoba(osoba *x[])
 {


    int Zene=0,Muskarci=0;

        for(int i=0;i<10;i++)
    {

        if(*x[i]-> pol=='z')Zene++;
        if(*x[i]->pol=='m')Muskarci++;

    }
    printf("Muskaraca ima:%d\n Zena ima:%d\n",Muskarci,Zene);

 }

 int main()
 {
    int i;
    for(i=0;i<10;i++)
    {
        printf("Unesi ime osobe %d\n",i);
        gets(a[i].naziv);

        while(getchar()!='\n');

        printf("Unesi pol osobe %d(m/z)\n",i);
        gets(a[i].pol);
        while(getchar()!='\n');
    }
      brosoba();
     return 0;
 }

2 个答案:

答案 0 :(得分:4)

这是我在标准C ++中对此的看法,而不是C

#include <algorithm>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

enum class gender_t { male, female, other };

struct osoba
{
    std::string name;
    gender_t gender;
};

static inline gender_t to_gender(char input)
{
    switch(input)
    {
        case 'm': case 'M': return gender_t::male;
        case 'f': case 'F': return gender_t::female;
        case 'o': case 'O': case '*': case '?': return gender_t::other;
    }
    throw std::runtime_error("Unknown gender specification");
}

void brosoba(std::vector<osoba> x)
{
    auto pred = [](gender_t g, osoba const& o) { return g == o.gender; };

    using namespace std::placeholders;
    std::cout << "Male: "   << std::count_if(x.begin(), x.end(), std::bind(pred, gender_t::male,   _1)) << ", "
              << "Female: " << std::count_if(x.begin(), x.end(), std::bind(pred, gender_t::female, _1)) << ", "
              << "Other: "  << std::count_if(x.begin(), x.end(), std::bind(pred, gender_t::other,  _1)) << "\n";
}

int main()
{
    std::vector<osoba> a;

    std::string name;
    char gender;
    while (std::cin >> name >> gender)
        a.push_back({name, to_gender(gender)});

    brosoba(a);
}

查看 Live on Coliru

输入

mike m
thomas m
elayne f
puck o
hector o
troy m
olly f

打印输出

Male: 3, Female: 2, Other: 2

或者,一个让性别开放的解决方案:

struct osoba
{
    std::string name;
    char gender;
};

void brosoba(std::vector<osoba> const& xs)
{
    std::map<char, size_t> histo;
    for(auto& x : xs)
        histo[x.gender]++;

    for (auto& entry: histo)
        std::cout << entry.first <<  ": " << entry.second << "\n";
}

int main()
{
    std::vector<osoba> a;

    std::string name;
    char gender;
    while (std::cin >> name >> gender)
        a.push_back({name, gender});

    brosoba(a);
}

现在打印( Live on Coliru ):

f: 2
m: 3
o: 2

答案 1 :(得分:0)

好吧,我会将函数声明为:

void brosoba(struct osoba * x)

另外,你可以在不传递参数的情况下调用它。你可以试试:

brosoba( a );

这会将指针传递给类型为a的{​​{1}}的第一个元素。然后,由于此数组的每个元素都是对象而不是指针,因此您应该使用struct osoba *而不是.读取字段。

此外,您将char(->)数组与char - 单引号平均字符文字进行比较,而双引号表示空终止字符数组,因此修复它是另一回事。