当输入行数不定and当每行输入数据不定时

此篇用于记录困扰我几天的"世界难题"!!!

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语句判断一下就好了。

例题:MYOJ discuss3

题解:

#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语句,在主函数中仅仅只是输入未知数即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值