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;
}
答案 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);
}
输入
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 - 单引号平均字符文字进行比较,而双引号表示空终止字符数组,因此修复它是另一回事。