(太闲了一天天的,只会c/c++和python所以选了2,5题)
题目出处:http://www.grapecity.com.cn/career/challenge
编程语言:不限
题目描述:
有句话是这么说的:“文不如表,表不如图”。形象地描述了图表在传达信息时,给接收者带来的截然不同的效率和体验。因此,在计算机计算能力、数据规模和决策需求都不断提升的当下,数据可视化的应用也越来越普遍。
数据可视化的范围很广,涉及到数据的获取、加工、建模、图形学,人机交互等很多概念和领域,想更快上手,获得更好的体验,使用DragonFly
BI这样的专业工具和服务是更明智的选择。今天,我们通过一个简化的命题,来亲手实现简单的数据可视化。编写一个程序,对于给定的一组数据和要求,输出一个以字符组成的柱状图。
输入
第一行,一个整数 N(1<=n<=20),表示这组数据的条目数。
第二行,两个字符串,用于表示数据展示在柱状图上的排序方式。第一个字符串是“Name” 或者
“Value”,表示排序的依据是数据条目的名称亦或数值;第二个字符串是 “ASC” 或者 “DESC”,表示升序或降序。 随后的 N
行,每行包含一个字符串 S 和一个数字 V,以空格分隔,表示一条数据。S 即数据条目的名称,仅包含小写字母,V
即对应的数值,是一个整数,(0<=V<=1,000,000)
输入示例
3
Value DESC
apple 5
pen 3
pineapple 10
输出示例
python代码
#python 3.65,win10 Big——one
#接受输入并初始化
def inputData():
try:
dataLen = int(input())
gist, way = input().split(' ')
data = []
maxLenWrod = 0
maxValue = 0
for _ in range(dataLen):
name, value = input().split(' ')
temp1 = len(name)
temp2 = int(value)
data.append((name, temp2))
if maxLenWrod < temp1:
maxLenWrod = temp1
if maxValue < temp2:
maxValue = temp2
return data, gist, way, dataLen, maxValue, maxLenWrod
except:
print("Error!输入错误")
#按要求排序
def mySort(data,gist,way):
resv=False
if way == "ASC":
resv = False #升序
elif way == "DESC":
resv = True #降序
else:
print("Warning!排序方式输入错误,请输入ASC:升序,DESC:降序(默认采用升序)")
#采用lambda表达式选择排序对象,调用内置列表的排序方法
if gist == "Value":
data.sort(key=lambda x: x[1], reverse=resv)
elif gist == "Name":
data.sort(key=lambda x: x[0], reverse=resv)
else:
print("Warning!排序对象输入错误,请输入Name:按名称排序,Value:按值排序(默认采用按值排序)")
data.sort(key=lambda x: x[1], reverse=resv)
#画表
def createTable(data,dataLen,maxValue,maxLenWrod):
#由于黑方块在python输出中占两个字符位置因此,需要进行*2
upside = "\u250c" + "\u2500" * (maxLenWrod+1) + \
"\u252c" + "\u2500" * (2*maxValue + 1) + "\u2510" #表格上边
downSide = "\u2514" + "\u2500" * (maxLenWrod+1) + "\u2534" \
+ "\u2500" * (2*maxValue + 1) + "\u2518" #表格下边
septalSide = "\u251c" + "\u2500" * (maxLenWrod+1) + "\u253c" \
+ "\u2500" * (2*maxValue + 1) + "\u2524" #表格间隔
print(upside)
for i in range(dataLen-1):
name = data[i][0]
value = data[i][1]
#每一行数据(为了保持美观在字符前加一个空格 保持对称)
temp = "\u2502" + "\u0020" +"\u0020" * (maxLenWrod - len(name))+name + "\u2502" + "\u0020" + \
"\u2588" * value + "\u0020" * (2*maxValue - value * 2) + "\u2502"
print(temp)
print(septalSide)
#最后一组数据显示
name = data[-1][0]
value = data[-1][1]
temp = "\u2502" +"\u0020" +"\u0020" * (maxLenWrod - len(name))+name + "\u2502" + "\u0020" + \
"\u2588" * value + "\u0020" * (2*maxValue - value * 2) + "\u2502"
print(temp)
print(downSide)
pass
#主函数调用
def main():
data, gist, way, dataLen, maxValue, maxLenWrod = inputData()
mySort(data, gist, way)
#print(data)
createTable(data, dataLen, maxValue, maxLenWrod)
if __name__ == "__main__":
main()
input()#保持cmd窗口不关闭
/*
author :Big——one
c++11, Ubuntu16
*/
//#include
#include
#include
using namespace std;
/*定义排序规则*/
//根据value的值升序排序
bool cmp1(pair<string,int>a,pair<string,int>b)
{
return a.second < b.second;
}
//根据value的值降序排序
bool cmp2(pair<string,int>a,pair<string,int>b)
{
return a.second > b.second;
}
//根据name的值升序序排序(a到z)
bool cmp3(pair<string,int>a,pair<string,int>b)
{
return a.first < b.first;
}
//根据name的值降序排序(按z到a)
bool cmp4(pair<string,int>a,pair<string,int>b)
{
return a.first > b.first;
}
/*定义制表*/
//上边
void upSide(int x,int y)
{
cout<<"\u250c";
for(int i=0;i<x;i++)
cout<<"\u2500";
cout<<"\u252c";
for(int i=0;i<y;i++)
cout<<"\u2500";
cout<<"\u2510"<<endl;
}
//下边
void downSide(int x,int y)
{
cout<<"\u2514";
for(int i=0;i<x;i++)
cout<<"\u2500";
cout<<"\u2534";
for(int i=0;i<y;i++)
cout<<"\u2500";
cout<<"\u2518"<<endl;
}
//分割
void septalSide(int x ,int y)
{
cout<<"\u251c";
for(int i=0;i<x;i++)
cout<<"\u2500";
cout<<"\u253c";
for(int i=0;i<y;i++)
cout<<"\u2500";
cout<<"\u2524"<<endl;
}
//数据填入
void dataLine(const pair<string,int>&data,int maxLenS,int maxV)
{
int temp=0;
cout<<"\u2502";
//S字符
temp = maxLenS-data.first.length();
for(int j=0;j<temp;j++)
{
cout<<" ";
}
cout<<data.first;
cout<<"\u2502";
//value方块
temp = maxV-data.second;
for(int j=0;j<data.second;j++)
{
cout<<"\u2588";
}
for(int j=0;j<temp;j++)
{
cout<<" ";
}
cout<<"\u2502"<<endl;
}
//制表
void createTable(const pair<string,int>*data,int maxLenS,int maxV,int N)
{
maxV +=1;
upSide(maxLenS,maxV);
int temp=0;
for(int i=0;i<N-1;i++)
{
dataLine(data[i], maxLenS, maxV);
//分割
septalSide(maxLenS ,maxV);
}
dataLine(data[N-1], maxLenS, maxV);
downSide(maxLenS, maxV);
}
int main()
{
int N=0;
cin>>N;
if(N>20||N<1)
{
cout<<"input number 1<=N<=20"<<endl;
exit(1);
}
string gist,way;
cin>>gist>>way;
if((gist!="Value"&&gist!="Name")||(way!="ASC"&&way!="DESC"))
{
cout<<"input the first char should be \"Value\" or \"Name\" "<<endl
<<"and the second char should be \"ASC\" or \"DESC\""<<endl;
exit(1);
}
pair<string,int>pr[20];
int maxLenS = 0, maxV = 0;
for(int i=0;i<N;i++)
{
cin>>pr[i].first>>pr[i].second;
if(maxLenS<pr[i].first.length())
maxLenS = pr[i].first.length();
if(maxV<pr[i].second)
maxV = pr[i].second;
}
//按要求排序
if(gist=="Value"&&way=="ASC")
sort(pr,pr+N,cmp1);
else if(gist=="Value"&&way=="DESC")
sort(pr,pr+N,cmp2);
else if(gist=="Name"&&way=="ASC")
sort(pr,pr+N,cmp3);
else
sort(pr,pr+N,cmp4);
//制表
createTable(pr,maxLenS,maxV,N);
return 0;
}
大水题,没啥说的,通项式:f(x,y)=f(x-1,y-1)+f(x-1,y)
Don’t BB ,Please Code
//dev-c++ 5.11
#include
int func(int x,int y)
{
if((y==1)||(y==x)) return 1;//边缘为1
return func(x-1,y-1)+func(x-1,y);//递归 f(x,y) = f(x-1,y-1)+f(x-1,y)
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",func(x,y));
return 0;
}