[Coursera C程序设计进阶]第二周

编程题#1:寻找下标

已知一个整数数组x[],其中的元素彼此都不相同。找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始。

举例而言,如果x[]={-2,-1,7,3,0,8},则x[3] = 3,因此3就是答案。

输入第一行包含一个整数n (0 < n < 100),表示数组中元素的个数。<br />第二行包含n个整数,依次表示数组中的元素。

输出为一个整数,即满足x[i]=i的元素,若有多个元素满足,输出第一个满足的元素。若没有元素满足,则输出“N”。

#include<iostream>
using namespace std;
int main()
{
	int n=1;
	int x[100]={0};
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>x[i];
	for(i=0;i<n;i++)
	{
		if(x[i]==i)
		{
			cout<<i<<endl;
			return 0;
		}
	}
	cout<<"N"<<endl;
	return 0;
}

编程题#2:四大湖

我国有4大淡水湖。

A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。

B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。

C说:洪泽湖最小,洞庭湖第三。

D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。

已知这4个湖的大小均不相等,4个人每人仅答对一个,

请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。

输入无。

输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。

#include <iostream>  
using namespace std;  
int main()  
{  
    int a, b, c, d;  
    a = b = c = d = 0;  
    for (int a = 1; a <= 4; a++) //鄱阳湖可能的排名  
    {  
        for (int b = 1; b <= 4; b++) //洞庭湖可能的排名  
        {  
            for (int c = 1;c <= 4; c++) //太湖可能的排名  
            {  
                for (int d= 1; d <= 4; d++) //洪泽湖可能的排名  
                {  
                    //条件1:4个湖的大小均不相等  
                    if ((a!=b && a!=c && a!=d && b!=c && b!=d && c!=d)  
                    //条件2:4个人每人仅答对一个  
                    && ((b==1)+(d==4)+(a==3)==1 )  
                    && ((d==1)+(b==4)+(a==2)+(c==3)==1)  
                    && ((d==4)+(b==3)==1)  
                    && ((a==1)+(c==4)+(d==2)+(b==3)==1)  
                        )  
                    {  
                        cout << a << endl << b << endl << c << endl << d << endl;  
                    }  
                }  
            }  
        }  
    }  
    return 0;  
}  

编程题#3:发票统计

有一个小型的报账系统,它有如下功能:

(1)统计每个人所报发票的总钱数

(2)统计每类发票的总钱数

将此系统简化为如下:假设发票类别共有A、B、C三种;一共有三个人,ID分别为1、2、3。

输入系统输入包含三行,每行第一个数为人员ID(整型,1或2或3),第二个数为发票总张数(张数不超过100),之后是多个发票类别(字符型,A或B或C)和相应发票金额(单进度浮点型,不超过1000.0)。

输出包含六行,前三行为每人(按ID由小到大输出)所报发票总钱数(保留两位小数),后三行为每类发票的总钱数(保留两位小数)。

#include <iostream>  
using namespace std;  
int main()  
{
	int id=0;
	int num=0;
	char type='A';
	float value=0;
	float sum_id[3]={0};
	float sum_type[3]={0};
	int i=0;
    for(int j=0;j<3;j++)//第一层循环是人员的循环;j是作为动态的id指针,进行人员循环
	{
		cin>>id>>num;
		for(i=0;i<num;i++)//第二层循环是发票类型和金额的循环
		{
			cin>>type>>value;
			if(type=='A')
				sum_type[0]+=value;
			if(type=='B')
				sum_type[1]+=value;
			if(type=='C')
				sum_type[2]+=value;
			sum_id[j]+=value;
		}
	}
	for( i=0;i<3;i++)
		cout<<sum_id[i]<<endl;
	for(i=0;i<3;i++)
		cout<<sum_type[i]<<endl;
	return 0;
}

编程题#4:Tomorrow never knows?

甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。

读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。

输入仅一行,格式为yyyy-mm-dd的日期。

输出也仅一行,格式为yyyy-mm-dd的日期

网上答案

#include <stdio.h> //注意此头文件一定要写对,否则提交出错  
 int main()  
 {  
    int year=0,month=0,day=0;  
    scanf("%d-%d-%d", &year, &month, &day);  
  
    bool leapyear = (year % 4 == 0 && year % 100 != 0) || (year % 400 ==0);  
    switch(month)  
    {  
    case 1:  
    case 3:  
    case 5:  
    case 7:  
    case 8:  
    case 10:  
        if (day == 31)  
        {  
            month++;  
            day = 1;  
        }   
        else  
        {  
            day++;  
        }  
        break;  
    case 12:  
        if (day == 31)  
        {  
            year++;  
            month = 1;  
            day = 1;  
        }   
        else  
        {  
            day++;  
        }  
        break;  
    case 2:  
        if (leapyear)  
        {  
            if (day == 29)  
            {  
                month ++;  
                day = 1;  
            }  
            else  
            {  
                day++;  
            }  
        }   
        else  
        {  
            if (day == 28)  
            {  
                month ++;  
                day = 1;  
            }  
            else  
            {  
                day++;  
            }  
        }  
        break;  
    case 4:  
    case 6:  
    case 9:  
    case 11:  
        if (day == 30)  
        {  
            month++;  
            day = 1;  
        }   
        else  
        {  
            day++;  
        }  
        break;  
    default:  
        break;  
    }  
    printf("%d-%02d-%02d\n", year, month, day);  
    return 0;  
 } 

编程题#5:细菌实验分组

有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

输入有多行,第一行为整数n(n≤100),表示有n个培养皿。

其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。

输出有多行:

第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。

然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。

#include<iostream>
using namespace std;
int main()
{
	int n=0;
	int x[100];
	float y[100];
	int id=0;
	int before=0;
	int after=0;
	float result=0;
	int flag=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>id>>before>>after;
		result=after/before;
		x[i]=id;
		y[i]=result;
	}
	for(i=0;i<n-1;i++)
		for(int j=i+1;j<n;j++)
		{
			if(y[i]>y[j])
			{int change=y[i];
			y[i]=y[j];
			y[j]=change;
			change=x[i];
			x[i]=x[j];
			x[j]=change;
			}
		}
	int max=0;
	for(i=0;i<n;i++)
	{
		float leap=y[i+1]-y[i];
		if(max<leap)
		{
			max=leap;
			flag=i;
		}
	}		
	cout<<"B:"<<(flag+1)<<endl;
	for(i=0;i<flag+1;i++)
	{
		cout<<x[i]<<" "<<y[i]<<endl;
	}
	cout<<"A:"<<(n-flag-1)<<endl;
	for(i=flag+1;i<n;i++)
	{
		cout<<x[i]<<" "<<y[i]<<endl;
	}
	return 0;
}

编程题#6:流感传染

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100.

输出第m天,得流感的人数

#include<iostream>
using namespace std;
int main()
{
	int n=0;
	int m=0;
	char x[102][102];
	cin>>n>>m;
	int i=0;
	int j=0;
	for(i=1;i<n+1;i++)
		for(j=1;j<n+1;j++)
			cin>>x[i][j];
	for(int d=0;d<m;d++)
	{
		for(i=1;i<n+1;i++)
		{
			for(j=1;j<n+1;j++)
			{
				if(x[i][j]=='@')
				{
					if(x[i-1][j]=='#')  x[i-1][j]='@';
					if(x[i+1][j]=='#')  x[i+1][j]='@';
					if(x[i][j-1]=='#')  x[i][j-1]='@';
					if(x[i][j+1]=='#')  x[i][j+1]='@';
				}
			}
		}
	}
	int sum=0;
	for(i=1;i<n+1;i++)
	{
		for(j=1;j<n+1;j++)
		{
			if(x[i][j]=='@')
				sum++;
		}
	}
	cout<<m<<":"<<sum<<endl;
	return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值