[Coursera 计算导论与C语言基础] 期末编程测试

最近在跟Coursera上北京大学的程序设计与算法专项课程,一共7门课程,这是第一门课计算导论与C语言基础。在这里做一个记录。

编程题#1:判断闰年

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
判断某年是否是闰年。
输入
输入只有一行,包含一个整数a(0 < a < 3000)
输出
一行,如果公元a年是闰年输出Y,否则输出N
提示
公历纪年法中,能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年, 能被3200整除的也不是闰年,如1900年是平年,2000年是闰年,3200年不是闰年。

//第12周
//编程题#1:判断闰年
//逻辑:闰年:能被4整除,但其中两种要被剔除:1.能被100整除而不能被400整除。2.能被3200整除
#include <iostream>
using namespace std;

bool judge(int year)
{
	bool flag = false;
	if (year % 4 == 0) //能被4整除
	{
		flag = true;
		if (year % 100 == 0 && year % 400 != 0) flag = false;//剔除能被100整除而不能被400整除
		if (year % 3200 == 0) flag = false;//剔除能被3200整除
	}
	return flag;
}
int main()
{
	int year;
	cin >> year;
	bool flag = judge(year);
	if (flag) cout << 'Y' << endl;
	else cout << 'N' << endl;
	return 0;
}

编程题#2:能被3,5,7整除的数
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个整数,判断它能否被3,5,7整除,并输出以下信息:
1、能同时被3,5,7整除(直接输出3 5 7,每个数中间一个空格);
2、能被其中两个数整除(输出两个数,小的在前,大的在后。例如:3 5或者 3 7或者5 7,中间用空格分隔)
3、能被其中一个数整除(输出这个除数)
4、不能被任何数整除;(输出小写字符'n',不包括单引号)
输入
一个数字
输出
一行数字,从小到大排列,包含3,5,7中为该输入的除数的数字,数字中间用空格隔开

//编程题#2:能被3,5,7整除的数
#include <iostream>
using namespace std;
int main()
{
	int num;
	while (cin>>num)
	if (num%3==0&&num%5==0&&num%7==0)
	{
		cout << "3 5 7"<< endl;
	}
	else if (num % 3 == 0 && num % 5 == 0 && num % 7 != 0)
	{
		cout << "3 5" << endl;
	}
	else if (num % 3 == 0 && num % 5 != 0 && num % 7 == 0)
	{
		cout << "3 7" << endl;
	}
	else if (num % 3 != 0 && num % 5 == 0 && num % 7 == 0)
	{
		cout << "5 7" << endl;
	
	}
	else if (num % 3 == 0 && num % 5 != 0 && num % 7 != 0)
	{
		cout << "3" << endl;
	}
	else if (num % 3 != 0 && num % 5 == 0 && num % 7 != 0)
	{
		cout << "5" << endl;
	}
	else if (num % 3 != 0 && num % 5 != 0 && num % 7 == 0)
	{
		cout << "7" << endl;
	}
	else
	{
		cout << "n" << endl;
	}
	return 0;
}

更简洁的写法:

#include <iostream>
using namespace std;

int main()
{
    int num = 0;
    bool flag = false;
    while(cin >> num)
    {
        if (num%3 == 0)
        {
            cout << "3 ";
            flag = true;
        }
        if (num%5 == 0)
        {
            cout << "5 ";
            flag = true;
        }
        if (num%7 == 0)
        {
            cout << "7";
            flag = true;
        }
        if (flag == false)
        {
            cout << "n";
        }
        cout << endl;
        flag = false;
    }
    return 0;
}


编程题#3:最远距离
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
给定一组点(x,y),求距离最远的两个点之间的距离。
输入
第一行是点数n(n大于等于2)
接着每一行代表一个点,由两个浮点数x y组成。
输出
输出一行是最远两点之间的距离。
使用cout << fixed << setprecision(4) << dis << endl;输出距离值并精确到小数点后4位。
fixed和setprecision是在<iomanip>头文件里定义的格式控制操作符,需要#include <iomanip>.

//编程题#3:最远距离
#include <iostream>
using namespace std;
#include <cmath>
#include <iomanip>
int main()
{
	double point[10][2] = { 0 };   //存储所有点的坐标(x,y)
	double distance[50] = { 0 };  //记录每两个点之间的距离
	double result_max = 0;
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> point[i][0] >> point[i][1];
	}
	int m = 0;
	for (int i = 0; i < n - 1; i++)          //对所有point向前两两组合,求出距离
		for (int j = i + 1; j < n; j++)
		{
		double result = sqrt((point[i][0] - point[j][0])*(point[i][0] - point[j][0]) + (point[i][1] - point[j][1])*(point[i][1] - point[j][1]));
		distance[m] = result;     //将距离记录在distance数组中
		m++;
		}
	for (int i = 0; i < 50; i++)
	{
		//cout << "distance:" << distance[i] << endl;  //调试用
		if (distance[i] > result_max) result_max = distance[i];
	}
	cout << fixed << setprecision(4) << result_max << endl;
	return 0;
}

编程题#4:简单计算器
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。
输入
输入只有一行,共有三个参数,其中第1、2个参数为整数,第3个参数为操作符(+,-,*,/)。
输出
输出只有一行,一个整数,为运算结果。然而:
1. 如果出现除数为0的情况,则输出:Divided by zero!

2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!

#include <iostream>
using namespace std;

int main()
{
    int firstNum = 0, secondNum = 0;
    char operate = 0;
    cin >> firstNum >> secondNum >> operate;

    switch(operate)
    {
    case '+':cout << firstNum+secondNum << endl;break;
    case '-':cout << firstNum-secondNum << endl;break;
    case '*':cout << firstNum*secondNum << endl;break;
    case '/':if (secondNum == 0)        //除数为0的情况应该单独放在除法里
            {
                    cout << "Divided by zero!" << endl;
            } 
            else
            {
                cout << firstNum/secondNum << endl;
            }
            break;
    default:cout << "Invalid operator!" << endl;break;
    }
    return 0;
}

编程题#5:字符串插入
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB、
描述
有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3。(字符个数不包括字符串结尾处的'\0'。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。
输入
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出
对于每一组测试数据,输出插入之后的字符串。
提示
这题有多组输入,请参照第二题的提示依次读入和处理每一组数据。

如果使用了字符串函数,比如strlen,请包含cstring头文件 #include <cstring>。

这是我写的,结果是正确的,但是系统不接受。

//编程题#5:字符串插入
#include <iostream>
using namespace std;
#include <cstring>
int main()
{
	char a[10] = { 0 };
	char b[4] = { 0 };  //大小定义为4,好让按ctrl+z终止(cin >> a >> b)时不报错:数组b越界。
	while (cin >> a >> b)
	{
		char insert[13] = { 0 };
		int position = 0;  //记录ASCII码字符最大的位置
		char max = 0;
		//找出ASCII码字符最大的位置
		for (int i = 0; i < 10; i++)
		{
			if (a[i]>max)
			{
				max = a[i];
				position = i;
			}
		}
		for (int i = 0; i <= position; i++) //将position及之前的字符拷贝进数组insert
		{
			insert[i] = a[i];
		}
		for (int i = position + 1; i < strlen(a); i++) //将数组a中position之后的字符,后移三位存入insert数组中
		{
			insert[i + 3] = a[i];
		}
		//将数组b拷贝进数组insert中空出的三个位置
		insert[position + 1] = b[0];
		insert[position + 2] = b[1];
		insert[position + 3] = b[2];
		cout << insert << endl;  //注意,这里直接cout输出字符数组。
	}
	return 0;
}
这是参考的系统接收的答案,逻辑是一样的==:

#include <iostream>
using namespace std;

int main()
{
    char str[14] = {0}, substr[4] = {0};
    while (cin >> str >> substr)
    {
        int i = 0, posBiggest = 0;
        char strBiggest = 0;
        while (str[i])
        {
            if (str[i] > strBiggest)
            {
                posBiggest = i;
                strBiggest = str[i];
            }
            i++;
        }
        for (int j = 9; j > posBiggest; j--)
        {
            str[j+3] = str[j];
        }
        str[posBiggest+1] = substr[0];
        str[posBiggest+2] = substr[1];
        str[posBiggest+3] = substr[2];
        cout << str << endl;
    }
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值