Text Summary
To solve this problem, consider these three essential points:
- Handling errors when converting a string to a double:
string s = "20.55";
double d;
try {
d = stod(s);
// Handle successfully converted value
} catch (invalid_argument&) {
// Handle conversion error
}
- Verifying if each character of a string can be converted to a double:
size_t pos;
string s = "20.55";
double d;
d = stod(s, &pos);
if (pos == s.size()) {
// Handle successful conversion
}
- Checking the number of decimal places:
string s = "20.55";
int t;
t = s.find(".");
if (s.size() - t - 1 <= 2) {
// Handle valid decimal places
}
Code Summary
#include <bits/stdc++.h>
using namespace std;
double fun(string s);
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int cnt = 0;
double sum = 0;
int n;
cin >> n;
string s;
double t;
for (int i = 0; i < n; i++) {
cin >> s;
t = fun(s);
if (t != 1001) {
sum += t;
cnt++;
} else {
printf("ERROR: %s is not a legal number\n", s.c_str());
}
}
if (cnt == 0)
printf("The average of 0 numbers is Undefined\n");
else if (cnt == 1)
printf("The average of 1 number is %.2f\n", sum);
else
printf("The average of %d numbers is %.2f\n", cnt, sum / cnt);
}
double fun(string s) {
double d;
size_t pos;
int t;
try {
d = stod(s, &pos);
if (pos == s.size()) {
t = s.find(".");
if ((t == string::npos or s.size() - t - 1 <= 2)
and -1000 <= d and d <= 1000)
return d;
else
return 1001;
} else
return 1001;
} catch (invalid_argument&) {
return 1001;
}
}