问卷调查
题目来源:江西理工大学OJ
题目地址:http://oj.jxust.edu.cn/problems/1235
题目描述
陈乐乐有n张调查表,每张调查表上有m道题目,每题有四个选项分别为A,B,C,D(题目都是单选)。
对于每张表陈乐乐会输入一串长为m的字符串,表示这m道题目的选项记录。
举个例子:
如有一张5道题的调查表,第一题选的是A,第二题是选的是A,第三题选的是C,第四题选的是D,第五题选的是B,那么乐乐将会输入AACDB。对于乐乐的输入,你的程序应该能统计出这n张表中每道题A,B,C,D出现的比例。详细输入输出请看样例。
输入
输入的第一行包括两个整数n和m(1<=n,m<=200),n表示调查表的张数,m表示每张调查表有m道题目。
接下来输入n行,每行是一串长为m(只含A,B,C,D)的字符串,表示调查表的选项记录。
输出
共输出m行,其中第i行输出的四个数ai bi ci di分别表示第i题A,B,C,D出现的比例,ai bi ci di用空格隔开,且保留小数点后两个数字。
样例输入
3 5
ABDCA
BCBCA
CDCAA
样例输出
0.33 0.33 0.33 0.00
0.00 0.33 0.33 0.33
0.00 0.33 0.33 0.33
0.33 0.00 0.67 0.00
1.00 0.00 0.00 0.00
先来一堆废话哈!这个题目它见证了我的成长,以前我看到这种题目,会感觉还是有一点点复杂的,想一次就能写好很不容易,因为以前我每次做这种细节的题目啊,很仔细,数据又比较多的题目,我经常出错,总是难以一遍过,但是今天,我成功了,我甚至在编译器上面只写了一遍就通过了,这就是我的成长!我会继续加油的!!
好了,言归正传,回归题目。这个题目的思路是比较简单的哈。我第一遍想到的做法使用字符串数组,但是发现不太好理解,然后就换成了二维数组,其实二者本质上是一样的,后者对我来说好理解一些。定义一个二维数组嘛,把n看作行数,把m看作列数,然后进行接下来的操作。先输入,输入完成后,要一题一题观察与操作,所以要把二维数组在心里倒置,也就是一列列的去操作,这个完全可以在代码里面体现哈!然后对每列的A,B,C,D进行计数,然后进行计算。大家配和代码学习一下吧!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
char a[1000][1000];
cin >> n >> m;
double b[1000] = {};//先定义为0,后面要使用
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> a[i][j];
}
}
for (int j = 0; j < m; j++)
{
memset(b, 0, 1000);
for (int i = 0; i < n; i++)
{
b[int(a[i][j] - 'A')]++;//这一步很巧妙哦,大家可以学习一下,细细品味
}
for (int i = 0; i < 4; i++)
{
cout << fixed << setprecision(2) << b[i] / n << " ";//然后输出
}
cout << endl;
}
return 0;
}
知识点总结:
- 二维数组的使用
- 数组的巧妙利用
关于代码里面那个b[int(a[i][j]-‘A’)]++;,在这里和大家解释一下,如果字符为’A’,那么就对其和’A’进行ASCII码运算,得到的ASCII码为0,然后类型转换成int类型,这样就可以使得b[0]++;,其他字母同理,这个用法其实普遍运用于统计字符串中各个字母出现的个数,大家可以学一下,以后一定用的上!
嘿嘿,今天和我的目标聊了一会儿,感觉还行,但不知道实际行不行,一切都还是未知。
好了,每篇题解后面都附上一句话。
抽烟的人永远闻不到自己身上的烟味
就像被爱的人永远不知道爱你的人有多辛苦。