此篇用于记录困扰我几天的"世界难题"!!!
1.当输入行数不定时
在一道题目中,可能并不会告诉你到底让你输入多少行数据,就是让你一直处于输入状态,这有三种解决办法。
第一种:
int n;
while(scanf("%d",&n)!=EOF)
{
cout<<n<<endl;
}
int m;
第二种:
while(cin>>m)
{
cout<<m<<endl;
}
第三种:
int k;
while(~scanf("%d",&k))
{
cout<<k<<endl;
}
但是这只会让你一直输入,不能继续往下执行,解决办法如下:
#include<iostream>
using namespace std;
int main() {
int a, b, t;
double k;
double m, n, sum = 0, ans, ans2, min;
cin >> a >> b;
cin >> k;
char c;
while (scanf("%lf %lf",&m,&n)!=EOF) {
c=getchar();//划重点
sum += m * n;
if(c!=' ') break; //划重点
}
但是值得注意的是,这样子写,就必须把多行数据放在一行输入,否则还是无法达到想要的目的。
getchar()函数用法:
然后是一道例题
这道也是我第一次看到这个输入问题的题目:
http://acm.zzuli.edu.cn/problem.php?cid=1700&pid=3
题解如下:
#include<iostream>
using namespace std;
int main() {
int a, b, t;
double k;
double m, n, sum = 0, ans, ans2, min;
cin >> a >> b;
cin >> k;
char c;
while (scanf("%lf %lf",&m,&n)!=EOF) {
c=getchar();
sum += m * n;
if(c!=' ') break;
}
ans = sum * k;
if (ans >= a) {
t = ans / a;//结果是200减50.
ans = ans - b * t;
} //同时
if (sum >= a) {
t = sum / a;
ans2 = sum - b * t;
}//只满减
min = (ans < ans2) ? ans : ans2;
printf("%.2lf", min);
return 0;
}
2.当每行输入数据不定时
当m次的操作,但是每行数据数量不相同时,一般都有前面的数有关系,加一个if语句判断一下就好了。
题解:
#include<iostream>
#include<vector>
using namespace std;
vector<int>v;
int n, m;
int a, b;
int main()
{
cin >> n >> m;
for (int i = 0; i <n; i++)
{
int t;
cin >> t;
v.push_back(t);
}
for(int i=1;i<=m;i++)
{
cin >> a;
if (a == 1)
{
cin >> b;
v.push_back(b);
}
if (a == 2)
{
v.pop_back();
}
}
for (int i = 0; i <v.size(); i++)
{
cout << v[i] << " ";
}
return 0;
}
完结撒花!!!!!
ps:原本我以为,这样可以把问题给解决掉,但是发现在写题的过程中还是会遇到问题,然后就开始反思,到底是如何才能够跳出来。首先这是分题型的,如果有结束的条件,不妨直接用break结束语句就好了,如果单纯的每一个数据都能够输出一种结果,不妨构造函数,直接在构造函数中用return 0语句,在主函数中仅仅只是输入未知数即可。