Zupełnie nie wiem, o co chodzi z "niewłaściwym doborem typu".
Kod masz poprawny, z jednym małym "ale". Zapomniałeś, że funkcja zawsze otrzymuje kopię zmiennej jeśli jest przekazana do funkcji jako parametr (z wyłączeniem tablic, które degradują się do wskaźnika). Jeśli chcesz wewnątrz funkcji fill() zmienić wartości zmiennej fun, musisz przekazać ją do funkcji przez referencję:
#include <iostream>
#include <string>
const int sezon = 4;
const std::string pory[sezon] = {"Wiosna", "Lato", "Jesien", "Zima"};
struct wydatki { double w[sezon]; };
void fill(wydatki &t1, int n);
void show(wydatki t2, int n);
int main()
{
wydatki fun;
fill(fun, sezon);
show(fun, sezon);
std::cin.get();
std::cin.get();
std::cin.get();
}
void fill(wydatki &t1, int n)
{
for(int i=0; i < sezon; i++)
{
std::cout << "Podaj wydatki za okres >> " << pory[i] << ": ";
std::cin >> t1.w[i];
}
}
void show(wydatki t2, int n)
{
double total = 0.0;
std::cout << "\nWYDATKI\n";
for(int i=0; i < sezon; i++)
{
std::cout << pory[i] << ": " << t2.w[i] << " zl" << std::endl;
total += t2.w[i];
}
std::cout << "Laczne wydatki roczne: " << total << " zl" << std::endl;
}