北邮信通2022C++大一上学期PTA汇总(含代码)(已完结)

这篇具有很好参考价值的文章主要介绍了北邮信通2022C++大一上学期PTA汇总(含代码)(已完结)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试练习题

北邮信通2022c++,c++,开发语言,经验分享,高考
注意要选择C++

0-1 Welcome to You!

本题要求编写程序,输出一个短句“Welcome to You!”

#include<iostream>
using namespace std;
int main()
{
    cout<<"Welcome to You!"<<endl;
    return 0;
}

知识点:

1.头文件iostream(书P7)

设置C++I/O相关环境,并定义输入/输出流对象cin和cout等。

2.主函数(书P8)

int main()表示函数要返回一个整数,与此对应的语句是"return 0;",代表它返回值是0

0-2 整数算术运算

本题要求编写程序,计算并输出2个正整数的和、差、积、商与余数。题目保证输入和输出全部在整型范围内。

输入格式:
输入在一行中给出2个正整数A和B。

输出格式:
在5行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商与余数。

#include<iostream>
using namespace std;
int main()
{
    int A,B;
    cin>>A;
    cin>>B;
    cout<<A<<" + "<<B<<" = "<<A+B<<endl;
    cout<<A<<" - "<<B<<" = "<<A-B<<endl;
    cout<<A<<" * "<<B<<" = "<<A*B<<endl;
    cout<<A<<" / "<<B<<" = "<<A/B<<endl;
    cout<<A<<" % "<<B<<" = "<<A%B<<endl;
    return 0;
}

知识点:

1.基本数据类型(书P15)

int——整型

2.算术运算符(书P24)

%是取余数运算符,只能对整型数进行操作,余数的正负由被除数决定。

0-3 求整数均值

本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

输入格式:
输入在一行中给出4个整数,其间以空格分隔。

输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。

#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
    int x,A,B,C,D;
    float y;
    cin>>A>>B>>C>>D;
    x=A+B+C+D;
    y=x/4.0;//不能写4
//sum和average输出在一行
    cout<<"Sum = "<<x<<"; Average = "<<fixed<<setprecision(1)<<y<<endl;
    return 0;
}

知识点:

1.头文件iomanip(书P39)

包含一些操纵符,直接嵌入在输入/输出语句中,以实现输入/输出格式控制

本代码中使用了fixed<<setprecision(1)控制小数点后的位数

2.算术运算符(书P24)

/是除法运算符,整型数相除,结果还是整型数。只要有一个操作数是浮点数,除法结果就是浮点数。

参考书P30的隐式类型转换

0-4 两小时学完C语言

知乎上有个宝宝问:“两个小时内如何学完 C 语言?”当然,问的是“学完”并不是“学会”。

假设一本 C 语言教科书有 N 个字,这个宝宝每分钟能看 K 个字,看了 M 分钟。还剩多少字没有看?

输入格式:
输入在一行中给出 3 个正整数,分别是 N(不超过 400 000),教科书的总字数;K(不超过 3 000),是宝宝每分钟能看的字数;M(不超过 120),是宝宝看书的分钟数。

题目保证宝宝看完的字数不超过 N。

输出格式:
在一行中输出宝宝还没有看的字数。

#include<iostream>
using namespace std;
int main()
{
    int N,K,M;
    unsigned int x;//x是非负整数
    cin>>N>>K>>M;
    x=N-K*M;
    cout<<x<<endl;
    return 0;
}

实验1-2

1-1 输出日期

从键盘输入三个变量,分别是今天的年、月、日的数值,按格式输出今天的日期。
例如,输入2017 3 1,输出2017年3月1日
输入
2000 12 29
输出
2000年12月29日

#include<iostream>
using namespace std;
int main()
{
  int a,b,c;
  cin>>a;
  cin>>b;
  cin>>c;
  cout<<a<<"年"<<b<<"月"<<c<<"日"<<endl;
  return 0;
}

1-2 字母大小写转换

题目描述:
从键盘输入一个大写字母,将它转换成小写字母输出到屏幕。

输入格式:
A~Z

输出格式:
a~z

#include <iostream>
using namespace std;
int main()
{
	char a;
	cin>>a;
    a=a+32;
	cout<<a<<endl;
	return 0;
	}

知识点:

1.char类型

当字符存储在内存中时,它实际上存储的是数字代码(ASCII码)。当计算机被指示在屏幕上打印该值时,它将显示与数字代码对应的字符。

2.ASCII码表

表中对应大小写字母的ASCII刚好相差32

1-3 计算圆的周长和面积

题目描述:
设计一个程序,从键盘输入圆的半径(double类型),计算圆的周长和面积,并将周长和面积按顺序输出,中间以空格隔开,设PI=3.14。

#include<iostream>
using namespace std;
int main()
{
	double a;
    const float PI =3.14;
	cin>>a;
	cout<<2*PI*a<<" "<<PI*a*a<<endl;
	return 0;
}

1-4 数据的逆序输出

题目描述:
设计一个程序,完成数据的逆序输出。从键盘输入一个三位整数,请将其逆序输出。如输入123,输出321。

#include<iostream>
using namespace std;
int main()
{
	int a,b,c,d,e;
	cin>>a;
	b=a/100;//b是a的百位
	c=a%100;
	d=c/10;//d是a的十位
	e=c%10;//e是a的个位
	cout<<e<<d<<b;
	return 0;
}

提示:

整型数相除结果也是整型数,可以用除法分别得到a的每一位

若a=123,则b=1,c=23,d=2,e=3;最后按e,d,b的顺序输出就可得到结果

1-5 闰年

题目描述:
任意输入一个4位数整数年份,判断是否闰年。闰年规则:非整百年能被4整除为闰年,2004是,2100不是;整百年能被400整除为闰年,2000是,1900不是。

#include<iostream>
using namespace std;
int main()
{
	int a,b,c,d;
	cin>>a;
	b=a%100;
	c=a%400;
	d=a%4;
	if(b==0)//整百年的闰年判断	
 {
 	if(c==0) cout<<"是"<<endl;
 	else    cout<<"不是"<<endl;
 	}
	
    else//非整百年的闰年判断
{
	if(d==0) cout<<"是"<<endl;
	else    cout<<"不是"<<endl;
	}
	return 0;
}

提示:

if的括号内必须是==

=是赋值运算符,用来把右值赋给左值;==是关系运算符,用来判断左右两侧是否相等

简单版本

#include<iostream>
using namespace std;
int main(){
	int a;
	cin>>a;
	if(a%400==0||(a%4==0&&a%100!=0))
        cout<<"是"<<endl;
    else cout<<"不是"<<endl;
    return 0;}

if括号内是 a能整除400 或 a能整除4并且a不能整除100

实验2-2

2-1 欧几里得算法

书P54

#include<iostream>
using namespace std;
int main(){
	int m,n;
	cin>>m>>n;
	int r=m%n;
	while(r!=0)
	{m=n;
	n=r;
	r=m%n;
	}
	cout<<n;
	return 0;
}

2-2 仓库结算

题目描述:
某仓库共有ABCDE五种货物,每天需要补货的数量不同,每种货物的单价不同,如下所示。由键盘输入五种货物需要补货的数量,请计算出当日仓库需支付多少货款。由于补货时不一定按照ABCDE的顺序补货,建议使用switch语句与循环语句编写。

#include <iostream>
using namespace std;
int main()
{
    char k;
    int n, sum = 0;
    for(int i = 0; i < 5; i++)
    {
        cin >> k >> n;
        switch(k)
        {
            case 65:
                sum += n * 10;
                break;
            case 66:
                sum += n * 5;
                break;
            case 67:
                sum += n * 3;
                break;
            case 68:
                sum += n * 20;
                break;
            case 69:
                sum += n * 13;
                break;
            default:
                break;
        }
    }
    cout << sum << endl;
    return 0;
}

知识点:

1.char类型存储

存储的是ASCII码

2.switch选择语句(书P60)

注意每个case执行语句结束处要加上break;

2-3 计算第几天

题目描述:
定义一个结构型变量(包括年、月、日),并从键盘上获取该变量的值,计算该日在本年中是第几天,输出到屏幕上,格式为:“X年X月X日是本年中的第X天。”(提示:注意闰年问题)。

#include<iostream>
using namespace std;
struct A{
	int year;		
	int month;		
	int day;
	}date;
int main(){
	cin>>date.year>>date.month>>date.day;
	int sum=0;
    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年每个月的天数
    int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年每个月的天数
    if (date.year%4==0&&date.year%100!=0||date.year%400==0)//判断闰年
    {
        for (int i = 0; i < date.month-1; i++)
        {
            sum+=b[i];
        } 
    }else
    {
        for (int i = 0; i < date.month-1; i++)
        {
            sum+=a[i];
        } 
    }
    sum+=date.day;
    cout<<date.year<<"年"<<date.month<<"月"<<date.day<<"日是本年中的第"<<sum<<"天。"<<endl;
}

知识点:

1.结构类型(书P95)

struct定义了一个结构类型A,大括号后的date表示定义了一个A类型的变量date

访问成员时用“.” 例如date.year

2.数组(书P85)

定义+初始化方式:类型标识符 数组名[常量表达式]={以逗号隔开的初始化值}

访问元素时用“数组名[下标表达式]” 例如a[i]

注意下标表达式从0开始算 所以a[i]表示数组中第i+1个元素

2-4 求和逼近

编写一个程序,求满足如下条件的最大的n,1!+2!+3!+……+n!<=X,其中X由键盘输入。

输入格式:
输入一个正整数。

输出格式:
输出满足条件的最大的n值

#include<iostream>
using namespace std;
int main(){
	int X,n=0,sum=0;
	cin>>X;
	unsigned long factorial(1);//0的阶乘是1
	for(;sum<=X;)
	{   n++;
		factorial*=n;//表示n的阶乘
		sum+=factorial;
	}
	cout<<n-1<<endl;//因为多循环了一次,所以n要减1
	return 0;
}

知识点:

1.for循环(书P66)

3个表达式可以任意一个或几个不写,但是;必须有

2.计算阶乘(书P67)

factorial是表示阶乘的变量,初始化为1

2-5 邮票组合问题

某人有四张3分的邮票和三张5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?

#include<iostream>
using namespace std;
int main()
{ 
  int a[50],b=0,k; 
  int i,j,sum; 
  for(i=0;i<=4;i++) 
    for(j=0;j<=3;j++) 
    { 
      sum=3*i+5*j; 
      for(k=0;k<b;k++) 
       {if(sum==a[k]) 
          break; }
      if(sum!=0&&k==b)
         {a[b]=sum;
		 b++; } 
      } 
  cout<<b<<endl; 
}

提示:

重点是排除重复的邮资

假如某一次出现了重复的数字,即sum==a[k],那么跳出循环,k没有加1,k就一定小于b

则下面if语句的表达式为假,跳过if语句块,这次的sum值不会计入,并且b也不会加1。

注意循环里的k每次都要从0开始,才能保证不重复

2-6 打点滴

题目描述:
在医院打点滴时,假设点滴的规律是,滴一滴,停一下,再滴两滴,停一下,再滴三滴,停一下。每一滴1毫升,用1秒,停一下的时间也是1秒。请问一瓶V毫升的药液,多久输完?其中V是小于5000的正整数。

#include <iostream>
using namespace std;
int main()
{
    int V, t;
    cin >> V;
    for(int i = 1, sum = 0; sum < V; i++)
    {
        sum += i;
        if(sum >= V)
        t = V + i - 1;
    }
    cout << t << endl;
    return 0;
}

提示:

第i次滴的时候,滴i滴,停一下。此时已经滴下了sum滴,停了i秒。然后进入下一次循环,若sum>=V说明这次能滴完,滴完也不用再停一下了。所以最后用时t是滴药液用时V秒和停一下用时i-1秒的和。

实验3-2

3-1 结构数组使用

题目描述:
编写一个记录5个学生的姓名、性别、年龄和学号的程序,要求使用结构数组表示学生信息,用for循环获得键盘输入的学生记录的数据,所有数据输入完毕后,将5个学生的信息在屏幕上输出,格式要求:按表格行列格式输出,每行输出一个学生的信息,按照姓名、性别、年龄、学号的顺序,各列信息左对齐,各信息占10位。

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
struct student
{
    string name;
    string sex;
    int age;
    string num; //我不知道为啥,但这里只有用string才是满分
};
int main()
{
    student a[5];
    for(int i = 0; i < 5; i++)
        cin >> a[i].name >> a[i].sex >> a[i].age >> a[i].num;
    for(int i = 0; i < 5; i++)
        cout << setiosflags(ios::left) 
            << setw(10) << a[i].name
            << setw(10) << a[i].sex
            << setw(10) << a[i].age
            << setw(10) << a[i].num << endl; 
    return 0;
}

知识点:

1.结构数组(书P108)

结构类型+结构类型定义的数组

可以用a[i].name来访问第i+1个人的名字

注意结构数组也是从0开始的

2.string类型(书P43)

支持长度可变的字符串,使用时需要加上头文件

3.输出格式控制(书P39)

需要使用头文件

本题用setw(10)来设置域宽,用setiosflags(ios::left)设置左对齐

3-2 字母统计

题目描述:
从键盘输入一行或几行字符串,行数由键盘输入,一行字符串用字符数组存储。请统计所输入的字符串中26个字母(不区分大小写)出现的次数,并将出现次数非零的字母统计结果输出到屏幕上,格式参见样例。如果没有字母,请输出字符串中无字母。
提示:
注意:输入行数后,换行再输入字符串。

#include <iostream>
using namespace std;
//定义函数judge
int b[26] = {0};
int judge(char x)
{
    if(x >= 'a' && x <= 'z')  
        b[x - 'a']++;
    else if(x >= 'A' && x <= 'Z')   
        b[x - 'A']++;
}
 
int main()
{
    //接收字符串并统计
    int n;
    cin >> n;
    char a[100] = {0};
    for(int i = 0; i <= n; i++)
    {
        cin.getline(a, 100, '\n');  
        int j = 0;
        while(a[j] != '\0')
        {
            judge(a[j]);
            j++;
        }
    }
 
   //结果输出
    int count = 0;
    for(int i = 0; i < 26; i++)
    {
        if(b[i] != 0)
        {
            cout << char(i + 'a') << ":" << b[i] << endl;
            count++;
        }
    }
    if(count == 0)
        cout << "字符串中无字母。";
    return 0;
}

参考书P101代码

思路:

定义数组a来存储输入的字符串,用judge函数判断数组a中非0元素的字母,并用数组b统计

最后将数组b中非0元素输出,每输出一个元素count就加1,如果最后count为0说明没有字母,则输出字符串中无字母

知识点:

cin.getline()从输入流中提取字符串

本题中a是存储字符串的地址,100是最多输入字符的个数,'\n’表示约定行输入结束字符。

PS:

可以用tolower()转换大小写字母

3-3 破解简单密码

题目描述
假设老王原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,老王把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则边成小写之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

输入格式
输入包括多个测试数据,输入是一个明文,密码长度不超过80个字符。

输出格式
输出老王真正的密文。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    while(cin>>s){
        for(int i=0;i<s.length();i++){
            if(s[i]=='Z')
              s[i]='a';
            
            else if(s[i]>='A'&&s[i]<='Y')
              s[i]+=33;
          
            else if(s[i]>='a'&&s[i]<='c')  s[i]='2';
            else if(s[i]>='d'&&s[i]<='f')  s[i]='3';
            else if(s[i]>='g'&&s[i]<='i')  s[i]='4';
            else if(s[i]>='j'&&s[i]<='l')  s[i]='5';
            else if(s[i]>='m'&&s[i]<='o')  s[i]='6';
            else if(s[i]>='p'&&s[i]<='s')  s[i]='7';
            else if(s[i]>='t'&&s[i]<='v')  s[i]='8';
            else if(s[i]>='w'&&s[i]<='z')  s[i]='9';
        }
        cout<<s<<endl;
    }
    return 0;
}

知识点:

sizeof不能用于string类型

s.length()表示计算字符串s的长度

3-4 判别水果颜色

现在有一堆水果,苹果红色,香蕉黄色,西瓜绿色,其余紫色。

当输入一种水果名字,要输入其对应的颜色。

输入格式:
输入水果名字,如:苹果。

输出格式:
输出颜色,如:红色。

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char a[3][10] = {"苹果", "香蕉", "西瓜"};
    char b[4][10] = {"红色", "黄色", "绿色", "紫色"};
    char s[10];
    bool flag = 0;
    cin >> s;
    for (int i = 0; i < 3; i++)
    {
        if (strcmp(a[i], s)==0)
        {
            cout << b[i];
            flag = 1;
            break;
        }
    }
    if (flag==0)
    {
        cout << b[3];
    }
}

知识点:

strcmp()用于比较两个字符串是否相等,需要用到<string.h>头文件

提示:

重点是存储和提取中文。

存储:使用二维数组a[i][j],i表示词数,j表示词占的字节数

读取:a[i]表示数组中第i+1个词

3-5 将十六进制数转换为二进制数

将十六进制数转换为二进制数。

输入格式:
输入一个16进制数。

输出格式:
输出二进制数。

#include <iostream>
#include<cctype>

using namespace std;

int main() {
    string hexDigit, binaryDigit;
    cin >> hexDigit;
    for (int i = 0; i < hexDigit.length(); ++i) {
        char e = hexDigit[i];
        
        if (e >= 'A' && e <= 'F') {
            int a = static_cast<int>(e - 'A' + 10);
            switch (a) {
                case 10:
                    binaryDigit += "1010";
                    break;
                case 11:
                    binaryDigit += "1011";
                    break;
                case 12:
                    binaryDigit += "1100";
                    break;
                case 13:
                    binaryDigit += "1101";
                    break;
                case 14:
                    binaryDigit += "1110";
                    break;
                case 15:
                    binaryDigit += "1111";
                    break;
            }
        } else if (isdigit(e)) {
            int b = static_cast<int>(e - '0');
            switch (b) {
                case 0://不能丢
                    binaryDigit +="0000";
                    break;
                case 1:
                    binaryDigit += "0001";
                    break;
                case 2:
                    binaryDigit += "0010";
                    break;
                case 3:
                    binaryDigit += "0011";
                    break;
                case 4:
                    binaryDigit += "0100";
                    break;
                case 5:
                    binaryDigit += "0101";
                    break;
                case 6:
                    binaryDigit += "0110";
                    break;
                case 7:
                    binaryDigit += "0111";
                    break;
                case 8:
                    binaryDigit += "1000";
                    break;
                case 9:
                    binaryDigit += "1001";
                    break;
            }
        }
    }
    //删掉前导0
    bool flag = false;
    for (int j = 0; j < binaryDigit.length(); ++j) {
        if (binaryDigit[j] == '1'|| flag) {
            flag = true;
            cout << binaryDigit[j];
        }
    }
    //输入为0时特判
    if (binaryDigit == "0000") cout<<"0";
    return 0;
}

这道题扣分点太多了!!
输出时要把前导0删掉
如果输入的就是0,那么也要输出0
十六进制末尾有0,转到二进制末尾就是0000

3-6 校园歌手大赛新规则

8号选手参加校园歌手大赛,编程读入20个整数(0 - 100之间)并存入数组中做为评委打分。最后得分计算规则:先计算20个数的平均分,然后去掉所有与平均分相差10分以上的分数,最后把剩下的分数再取平均做为最后得分。如果没有剩下分数,此次打分无效。

输入格式:
输入20个整数。

输出格式:
输出三行,具体详见输出样例。

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
    int a[20];
    double sum=0;//保证平均分是double型
    for(int i=0;i<20;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    double p,k;
    p=sum/20;
    cout<<"所有评委平均分:"<<fixed<<setprecision(3)<<p<<"分."<<endl;
    int c=0;
    cout<<"不合格得分:";
    for(int i=0;i<20;i++)
    {
        k=fabs(a[i]-p);
        if(k>=10){
             if(c>0) cout<<" ";//保证"."前面没有空格
             cout<<a[i];
             sum-=a[i];
             c++;
         }
    }
    cout<<"."<<endl;
    if(c==20)
        cout<<"无合格打分."<<endl;
    else{
        double l=sum/(20-c);
        cout<<"最后得分:"<<fixed<<setprecision(3)<<l<<"分."<<endl;
    }
    return 0;
}

提示:

if(c>0) cout<<" ";表示从第二个不合格分数开始,在数前面加一个空格。否则输出会是"不合格得分:709999."或者是“不合格得分:70 99 99 .”

知识点:

1.输出格式控制

fixed<<setprecision(3)表示保留3位小数,需要用到头文件

2.计算绝对值

fabs(x)表示x的绝对值,需要用到头文件

3-7 杨辉三角

还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

输入格式:
输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。

输出格式:
对应于每一个输入,请输出相应层数的杨辉三角。

#include<iostream>
using namespace std;
int main()
{
 int i,n,j;
 int a[40][40];
 cin>>n;
//赋值
 a[1][1]=1;
 a[2][1]=1;
 a[2][2]=1;
 for(i=3;i<=n;i++)
 {
   for(j=1;j<=i;j++)
   {
    a[i][1]=1;
    a[i][j]=a[i-1][j-1]+a[i-1][j];
    a[i][i]=1;
   }
 }
//输出
 for(i=1;i<=n;i++)
 {
   for(j=1;j<=i;j++)
   {
    if(j>1) cout<<" ";
	cout<<a[i][j];
   } 
   if(i<n) cout<<endl;
 }
 return 0;
}

提示:

输出部分里面的两个if都是为了保证输出格式正确

3-8 数组使用

题目描述:
将1~100的自然数存到一个有100个元素的整型数组中(数组的下标为0~99),请在屏幕上输出如下数据:1)在屏幕上输出存储的100个自然数,每行输出10个,各数值之间用空格隔开。2)将序号是素数的数据输出到屏幕上,格式要求:每行输出10个,各数值之间用一个空格隔开。(提醒:结尾无空格)

#include <iostream>
using namespace std;
//判断素数
bool prime(int n)
{
    for(int i = 2; i < n; i++)
    {
        if(n % i == 0)
        {
            return false;
            break;
        }
    }
    return true;
}
 
int main()
{
    //赋值
    int a[100];
    for(int i = 0; i < 100; i++)
    {
        a[i] = i + 1;
    }
    //输出1
    for(int x = 0; x < 10; x++)
    {   int y=0;
        for(y; y < 9; y++)
        {
            cout << a[x * 10 + y] << " ";
        }
        cout << a[x * 10 + y] << endl;
    }
    //输出2
    int n = 0;
    for(int j = 0; j < 97; j++)
    {
        if(prime(j) && j != 0 && j != 1)
        {
            n += 1;
            if(n == 10)
            {
                cout << a[j] << endl;
                n = 0;
            }
            else
                cout << a[j] << " ";
        }
    } 
    cout << a[97];
    return 0;
}

知识点:

素数是指在大于1的整数中,除了 1 和它本身以外,不能被任何整数整除的数

3-9 明明的随机数

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用 计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然 后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式:
有2行,第1行为1个正整数,表示所生成的随机数的个数:N
第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式:
也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

#include<iostream>
using namespace std;
int main(){
    int N,i,n,count=0,j;
    int a[1000]={0};
    cin>>N;
    for(i=0;i<N;i++){
        cin>>n;
        if(a[n]==0){
            a[n]=n;
            count++;
        }
    }
    cout<<count<<endl;
    for(i=0;i<1000;i++){//将第一个非0数单独输出,为了保证格式正确
        if(a[i]!=0){
        	cout<<a[i];
        	break;}
    }
    for(j=i+1;j<1000;j++){
    	if(a[j]!=0) cout<<" "<<a[j];
	}   
    return 0;
 }

提示:

给数组赋值时按序号赋值(让a[n]=n),后续就不用逐个比较数字大小

注意最后结尾处没有空格

实验4-2

4-1 数字分离

题目描述
编写三个函数,分别完成如下任务:
函数一,计算整数a除以整数b的商的整数部分;
函数二,计算整数a除以整数b的余数;
函数三,用函数一和函数二完成分离整数各位的功能,对于输入的1~32767之间的整数,打印出一列数字,每个数字间空一个格。例如,输入:4562 输出:4 5 6 2

#include<iostream>
using namespace std;
int f1(int a,int b){
    return a/b;
}
int f2(int a,int b){
    return a%b;
}
int f3(int x)
{
    int n, m = 1;
    for(n = x; n > 9; n /= 10)  //m 用来计算位数
        m *= 10;
    for(; m > 0; m /= 10)
    {
        if(m != 1)
            cout << f2(f1(x, m), 10) << " ";
        else
            cout << f2(f1(x, m), 10);
    }
}

int main(){
    int N;
    cin>>N;
    f3(N);
    return 0;
}

4-2 排分统计

题目描述
歌手大奖赛共有10位评委,为每位选手打分(double型)。预赛部分歌手的分数,为去掉1个最高分、1个最低分后其余8个分数的平均值;决赛部分歌手的分数,为去掉2个最高分、2个最低分后其余6个分数的平均值。通过键盘输入10位评委的打分,以及当前处于哪个阶段(预赛部分用1表示,决赛部分用2表示)。主函数中,只负责输入数据、调用分数计算函数、输出结果,评分计算部分编写独立函数完成。

#include<iostream>
using namespace std;
//冒泡排序
void sort(double * a){
    int bound,pos=9;
    while(pos){
        bound=pos;
        pos=0;
        for(int i=0;i<bound;i++){
          if(a[i]>a[i+1]){
            double hold=a[i];
            a[i]=a[i+1];
            a[i+1]=hold;
            pos=i;
            }
        }
    }
}
//初赛
double f1(double * a){
    double sum;
    for(int i=1;i<9;i++)
        sum+=a[i];
    return sum/8.0;
}
//决赛
double f2(double *a){
    double sum;
    for(int i=2;i<8;i++)
        sum+=a[i];
    return sum/6.0;
}

int main(){
    double a[10];
    for (int i=0;i<10;i++){
        cin>>a[i];
    }
    sort(a);
    int N;
    cin>>N;
    if(N==1)
        cout<<f1(a);
    else
        cout<<f2(a);
    return 0;
}

提示:
sort函数是书P107的冒泡排序的代码
形参是double *a,好像表示指向double类型的数据

4-3 分糖果

题目描述
有10个小朋友围成一圈分糖果,老师顺次分给每人一定数量糖果(初始值为偶数)然后按照下列规则调整,所有小朋友同时把自己的糖果分一半给右边的人,糖果数变为奇数的人,向老师补要一块糖果,问经过多少次调整后,大家糖果数一样多,且每人多少块。建立两个函数,一个负责传递糖果,一个负责判断所有人的糖果是否相等。

#include<iostream>
using namespace std;
void f1(int*a){
    int b[10];
    for(int i=0;i<9;i++)
        b[i]=a[i]/2+a[i+1]/2;
    b[9]=a[0]/2+a[9]/2;
    for(int i=0;i<10;i++){
        if(b[i]%2){
            b[i]++;
        }
        a[i]=b[i];
    }
}

int f2(int*a){
    int flag=0;
    for(int i=0;i<10;i++){
            if(a[i]!=a[0])
                flag=1;
    }
    return flag;
}

int main(){
    int count=0;
    int a[10]={0};
    for(int i=0;i<10;i++)
        cin>>a[i];
    while(f2(a)){
        f1(a);
        count++;
    }
    cout<<count<<" "<<a[0];
    return 0;
}

提示:
f1(传递糖果的函数)需要两个数组,不能写a[i]=a[i]/2+a[i+1]/2,这样会改动原始数据,并且导致运行超时;要建立一个新的数组进行计算。

4-4 亲和数

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数

输入格式:
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <=A,B <=600000 ;

输出格式:
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
1.我自己写的,但是有时候答案是两个NO

#include<iostream>
using namespace std;
int f(int n){
    int sum=0;
    for(int i=1;i<n;i++)
        if(n%i==0)
            sum+=i;
    return sum;
}
int main(){
    int M,a,b;
    cin>>M;
    for(int i=1;i<M;i++){
        cin>>a>>b;
        if(f(a)==b&&f(b)==a)
            cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    cin>>a>>b;
    if(f(a)==b&&f(b)==a)
        cout<<"YES";
    else cout<<"NO";
    return 0;
}

2.别人写的,肯定对

#include<iostream>
using namespace std;
string flag(int a,int b)
{
    int sum1=0,sum2=0;
    for(int t=1;t<b;t++){
        if(b%t==0)sum1+=t;
    }
    for(int t=1;t<a;t++){
        if(a%t==0)sum2+=t;
    }
    return sum1==a&&sum2==b?"YES":"NO";
}
int main()
{
    int n,a,b;
    cin>>n;
    int m=n-1;
    while(m--){
        cin>>a>>b;
        cout<<flag(a,b)<<endl;
    }
    //保证最后一行没有回车
    cin>>a>>b;
    cout<<flag(a,b);
    return 0;
}

提示:
注意输出最后一行时没有回车

4-5 老王/渊子赛马

就是这么简单,现在老王也来赛一赛马。假设每匹马都有恒定的速度,所以速度大的马一定比速度小的马先到终点(没有意外!!)。不允许出现平局。最后谁赢的场数多于一半(不包括一半),谁就是赢家(可能没有赢家)。老王有N(1≤N≤1000)匹马参加比赛。对手的马的数量与渊子马的数量一样,并且知道所有的马的速度。聪明的你来预测一下这场世纪之战的结果,看看老王能否赢得比赛。

输入格式:
输入有多组测试数据。
每组测试数据包括3行:
第一行输入N(1≤N≤1000)。表示马的数量。
第二行有N个整型数字,即渊子的N匹马的速度。
第三行有N个整型数字,即对手的N匹马的速度。
当N为0时退出。

输出格式:
若通过聪明的你精心安排,如果渊子能赢得比赛,那么输出“YES”。
否则输出“NO”。

#include<iostream>
using namespace std;
int main(){
    int N;
    int a[1000],b[1000];
    while(cin>>N&&N!=0){//不知道为啥if(N!=0) break;写里面不行
        int count=0,t=0;//每次循环都要初始化一遍
        for(int i=0;i<N;i++) cin>>a[i];
        for(int i=0;i<N;i++) cin>>b[i];
        //给a、b数组排序
        for(int i=0;i<N-1;i++)
          for(int j=i+1;j<N;j++){
            if(a[i]>a[j]){
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        for(int i=0;i<N-1;i++)
          for(int j=i+1;j<N;j++){
            if(b[i]>b[j]){
                t=b[i];
                b[i]=b[j];
                b[j]=t;
            }
        }
        //计算赢的次数
        for(int i=N-1;i>=0;i--)
          for(int j=N-1;j>=0;j--){
              if(a[i]>b[j]){
                  count++;
                  b[j]=a[i];//保证不会让一匹马比两次
                  break;
              }
         }
        
         if(count>N/2) cout<<"YES"<<endl;
         else  cout<<"NO"<<endl;
    }
        return 0;
    }

提示:
本题PTA没有过高的格式要求,最后多换行了也算全对。

4-6 母牛生小牛

题目描述
设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?

输入格式
输入一个整数N。(1≤N≤50)

输出格式
第N年时母牛的数量

#include<iostream>
using namespace std;
int main(){
    int N;
    int a[50]={1,1,1};//a[0] a[1] a[2]都为1
    cin>>N;
    for(int i=3;i<=N-1;i++)
        a[i]=a[i-1]+a[i-3];//看大佬的文章
    cout<<a[N-1];
    return 0;
}

提示:

http://t.csdn.cn/4FNGM
注意每头小母牛在第四个年头都可以生一头小母牛

实验5-2

5-1 求最大值

题目描述
编写相应的程序用指针实现:从键盘输入3个整型数va、vb、vc,通过一个指向整型的指针iptr,输出3个数中的最大值。

#include<iostream>
using namespace std;
int main() {
	int va,vb,vc,x;
	cin >> va >> vb >> vc;
	x = va > (vb > vc ? vb : vc) ? va : (vb > vc ? vb : vc);
	int* iptr = &x;
	cout << *iptr;
	return 0;
}

5-2 字符串变量的交换

题目描述
编制程序,调用指针作为参数的函数,实现下面两字符串变量的交换。 char* ap=“hello”; char* bp=“how are you”; 交换的结果为:ap 指向"how are you",bp 指向"hello"。 (注意:输出语句中的;和.为英文符号)

#include<iostream>

using namespace std;
void swap(char* ap, char* bp)
{
	char* cp;
	cp = ap;
	ap = bp;
	bp = cp;
}
int main()
{
	const char* ap = "hello", * bp = "how are you";
	swap(ap, bp);
	cout << "ap指向" << ap<<";"<< endl;
	cout << "bp指向" << bp<<".";
	return 0;
}

const必须写,保证指针所指向的内容不可以通过指针的间接引用来改变

5-3 动态申请数组

题目描述
动态申请一个一维整型数组,要求用户从键盘输入元素个数,采用new运算符分配空间,从键盘输入数组变量的值.写一个函数void Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(升序)。将排序后的数组变量的值输出到屏幕上,各数值间用一个空格隔开。

输入样例
10 1 2 3 4 5 0 7 8 0 10
输出样例
1 2 3 4 5 7 8 10 0 0

#include<iostream>
using namespace std;
void Func(int*A,int nSize){
	int t=0;
	for(int i=0;i<nSize;i++){
		for(int j=0;j<nSize-1-i;j++){
			if(A[j+1]!=0&&(A[j]==0||A[j]>A[j+1])){//注意是==,不是=
				t=A[j];
				A[j]=A[j+1];
				A[j+1]=t;
			}
		}
	}
	cout<<A[0];
	for(int i=1;i<nSize;i++)
	cout<<" "<<A[i];
}

int main(){
	int n;
	cin>>n;
	int*A=new int[n];
	for(int i=0;i<n;i++)  cin>>A[i];
	Func(A,n);
	delete[]A;
	return 0;
}

5-4 求平均值

题目描述
编写一个函数get_average()获取整型数组元素的平均值。要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值。在main()函数中通过具体的一维数组Array_1D和二维数组Array_2D测试这个函数。假定一维数组为a[5],二维数组为b[2][3],一维数组和二维数组的变量值由键盘分别输入,在屏幕上输出一维数组和二维数组的平均值,平均值间用一个空格分开。

输入样例
1 2 3 4 5
1 2 3 4 5 6
输出样例
3 3.5


#include<iostream>
using namespace std;
float get_average(int* p, int size)
{
	float sum=0;
	for (int i = 0; i < size; i++)
		sum += *(p + i);
	return (sum / size);
}
int main()
{
	int a[5], b[2][3], (*p)[3];
	p = b;
	for (int i = 0; i < 5; i++)
		cin >> a[i];
	for (int i = 0; i < 2; i++)
		for (int j = 0; j < 3; j++)
			cin >> b[i][j];
	int x, y;
	x = sizeof(a) / sizeof(*a);
	y = sizeof(b) / sizeof(**b);
	cout << get_average(a, x) << " ";
	cout << get_average(*p, y);
	return 0;
}

对于一维数组a[5]
数组名a就是数组的地址,也是第一个元素a[0]的地址
*(a+i)表示数组元素a[i]
对于二维数组b[2][3]
可以看作2个一维数组,每个一维数组中有3个元素
定义对应的指向一维数组的指针*p
数组名b/指针名p是第1个一维数组b[0]的地址
*pb[0][0]地址
*(*(p+i)+j) 表示数组元素b[i][j]

5-5 字符指针数组

题目描述
用字符指针数组,将给定的5个字符串(可以是任意5个国家名字)进行排序并输出。

输入样例
China American France Spain Greece
输出样例
American
China
France
Greece
Spain

http://t.csdn.cn/4qa1u

#include <iostream>
#include <cstring>
using namespace std;
int main() {
	//1.首先定义一个一维指针数组和二维数组
	char* name[5];
	char a[5][100];
	//2.键盘输入赋值
	for (int i = 0; i < 5; i++) {
		cin >> a[i];
		name[i] = a[i];
	}
	//3.strcmp比较,以此为条件依据进行冒泡排序(条件语句+冒泡排序)
	//冒泡算法
	for(int i=0;i<5;i++)
		for (int j = 0; j < 4 - i; j++) {
			if (strcmp(name[j], name[j + 1]) > 0) {
				//以字符指针作为中间存储存字符串
				char* t = name[j];
				name[j] = name[j + 1];
				name[j + 1] = t;
			}
		}
	//4.输出
	for (int i = 0; i < 5; i++)
		cout << name[i] << endl;
	return 0;
}

5-6 结构体和指针

题目描述
已知有3名学生及五门课程的成绩,要求根据学生的各科平均分排序(降序),并输出学生的所有信息和平均分(用指针数组完成)。

输入样例
Jane 90 80 75 60 85
Mark 85 78 98 85 86
Lily 56 65 75 68 80
输出样例
Mark 85 78 98 85 86 86.4
Jane 90 80 75 60 85 78
Lily 56 65 75 68 80 68.8

http://t.csdn.cn/4qa1u

#include <iostream>
using namespace std;
int main() {
	//1.自定义一个结构数据类型,用该类型定义一个结构数组
	struct student {
		char name[10];
		int score[5];
		float aver;
	};
	student stu[3];
	//2.从键盘往数组中输入数据
	for (int i = 0; i < 3; i++) {
		cin >> stu[i].name;
		float sum = 0;
		for (int j = 0; j < 5; j++) {
			cin >> stu[i].score[j];
			sum += stu[i].score[j];
		}
		stu[i].aver = sum / 5;
	}
	//3.定义一个结构指针,将结构数组的值赋给它
	student* p[3];
	for (int i = 0; i < 3; i++) 
		p[i] = &stu[i];
	//4.根据aver的大小进行排序
	for (int i = 0; i < 2; i++)
		if (p[i]->aver < p[i+ 1]->aver) {
			student* temp;
			temp = p[i];
			p[i] = p[i + 1];
			p[i + 1] = temp;
			}
	//5.输出
	//程序化:每个循环结构里可以做很多事情(比如这里就不止有一条输出语句)
	for (int i = 0; i < 3; i++) {
		cout << p[i]->name<<" ";
		for (int j = 0; j < 5; j++)
			cout << p[i]->score[j] << " ";
		cout << p[i]->aver<<endl;
	}
	return 0;
}

5-7 数组合并

题目描述
将两个数组a和b合并,合并后的数组按升序输出。 说明:1)数组a和b的大小和元素的值从键盘输入;先输入数组大小,再输入数组的值; 2)合并后的数组输出时,各数值间以空格分开。

输入样例
2 1 2
4 1 2 3 4
输出样例
1 1 2 2 3 4

http://t.csdn.cn/4qa1u

#include<iostream>
using namespace std;
int main() {
	int a, b;
	//注意题目要求的输入顺序
	cin >> a;
	//数组[]中只能是常量表达式,因此只能用指针
	//先申请整型动态内存
	int* p= new int[110];
	//再将申请的内存分配给指针p1,p2
	int* p1 = p;
	int* p2 = p;
	//再往指针里写入从键盘输入的数据,将两个数组都写入p1
	//因为p1得值在输入数时会改变,因此这里再用一个指针p2指向同一动态内存,以便后面冒泡排序和输出
	//这里要求对指针相关概念要理解到位
	for (int i = 0; i < a; i++)
	{
		int c; cin >> c;
		//*p1指指针所指向的第一个元素(*间接运算指通过指针间接访问其所指向的内容)
		//p1指内容的首地址,*p1指内容(非字符指针)
		//若为字符指针,cout<<p1是输出指向的字符串(唯一特殊)
		//p1指指针首地址,p1++是指针的运算,含义是当前地址的下一地址
			*p1 = c; p1++;
	}
	cin >> b;
	for (int i = 0; i < b; i++) {
		int d; cin >> d;
		*p1 = d; p1++;
	}
	//知识点·冒泡排序程序化:双层循环结构,第一层是遍数(即控制第二层执行次数的),第二层是每一遍排序
	//程序化:第二层中循环条件为j<a+b-i-1的原因是升序排列中每次排序后的最后一个一定是最大的,j<a+b也行但没必要
	for (int i = 0; i < a + b; i++) {
		for (int j=0; j < a + b - i - 1; j++) {
			if (*(p2 + j) > * (p2 + j + 1)) {
				int hold = *(p2 + j);
				*(p2 + j) = *(p2 + j + 1);
				*(p2 + j + 1) = hold;
			}
		}
	}
	//程序化(最后一个数无空格):这里最后输出因为最后一个数没有空格,所以单独用一条语句输出(易错)
	for (int i = 0; i < a + b - 1; i++)
				cout << *(p2 + i) << " ";
	cout << *(p2 + a + b - 1) << endl;
	//最后别忘了释放动态内存(记住申请和释放始终成对出现)
	delete[]p;
	return 0;
}

5-8 数据插入

题目描述
请编写函数实现将一个数值插入到数组中适当的位置,使新数组按降序排列,并将插入的位置输出到屏幕上。 说明:1)原数组大小和数值由键盘输入,动态创建数组; 2)插入的数值由键盘输入。3)如果插入数据与原数组中某数据相同,则插在该数据之前。

输入样例
10 1 4 5 2 3 6 7 8 10 9
11
输出样例
1

#include <iostream> 
using namespace std;
int flag = 0;
int main() {
 int n, ins;
 cin >> n;
 int *p = new int[1000];
 int *p1 = p;
 int *p2 = p;
 for (int i = 0; i < n; i++) {
  int k; cin >> k;
  *p1 = k; p1++;
 
 } cin >> ins;
 for (int i = 0; i < n; i++)
  for (int j = 0; j < n - i - 1; j++) {
   if (*(p2 +j) < *(p2 + j + 1)) {
    int t = *(p2 + j);
    *(p2 + j) = *(p2 + j + 1);
    *(p2 + j + 1) = t;
   }
  }
 int pos = 0;
 for (int i = 0; i < n; i++) 
  if (*(p + i) <= ins) {
   pos = i;
   flag = 1;
   break;
  }
 if (!flag) pos = n;
 for (int i = n; i > pos; i--)
  *(p + i) = *(p + i - 1);
 *(p + pos) = ins;
 // for (int i = 0; i <= n; i++)
 //  cout << *(p + i) << endl;
 cout << pos + 1 << endl;
 delete [] p;
 return 0;
}

下面这个是自己写的不知道对不对

#include <iostream> 
using namespace std;
int flag = 0;
int main() {
 int n, ins;
 cin >> n;
 int *p = new int[1000];
 int *p1 = p;
 int *p2 = p;
 for (int i = 0; i < n; i++) {
  int k; cin >> k;
  *p1 = k; p1++; 
 } 
 cin >> ins;
 int pass=0;
 for (int i = 0; i < n; i++){
 	if(*(p2+i)>ins) pass++;
 }
 cout<<pass+1;
 delete[]p;
 return 0;
}

实验6-2

6-1 矩形类

题目描述
定义一个矩形类,长和宽是它的属性,可以求出矩形的面积。定义一个比较函数,比较两个矩形的面积,把面积大的矩形对象作为引用来返回。主函数中定义两个矩形,它们的长、宽已知,分别为矩形1:长5.2、宽4.3,矩形2:长100、宽20。再由键盘输入一个矩形的长、宽。调用比较函数进行比较,找出面积大的矩形,输出其面积。

输入样例
10 8
输出样例
2000

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
class rect
{
public:
	rect(double X, double Y) {//构造函数
		x = X, y = Y;
		sq = X * Y;
	};
	double getS() {return sq;}
private:
	double x, y;
	double sq;
};
int main() {
	rect c1(5.2, 4.3);
	rect c2(100, 20);
	double a, b;
	cin >> a >> b;
	rect c3(a, b);
	double ans = max(c1.getS(), max(c2.getS(), c3.getS()));//algorithm库函数定义了max
	cout << ans << endl;
	return 0;
}

6-2 三角类

题目描述
定义一个Triangle三角形类,包括数据成员三边边长(int类型)、判断三角形形状的成员函数。键盘输入三角形三边边长,判断此三角形形状(其中,等腰直角三角形归为等腰三角形类)。
构成等边三角形,输出“A equileteral triangle”;
构成等腰三角形,输出“A isosceles triangle”;
构成直角三角形,输出“A right triangle”;
构成三角形,但不是以上三种,则输出“A triangle”;
不构成,输出“Not a triangle”。

输入样例
3 4 5
输出样例
A right triangle

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
string s[5] = {"Not a triangle", "A triangle", "A right triangle", "A isosceles triangle", "A equileteral triangle"};
class Triangle
{
public:
	Triangle(int a, int b, int c){
		z = max(a, max(b, c)); 
		x = min(a, min(b, c)); 
		y = a + b + c - x - z;
	};
	int check();
	void print(){ cout << s[check()] << endl; };
private:
	int x, y, z;
};
int Triangle::check() {
	int flag(0);
	if (x + y > z && abs(x - y) < z) flag = 1;//构成三角形
	//flag = flag ? 2 : 0表示如果flag不为0(表达式为真),就把2赋值给flag
	if (pow(x, 2) + pow(y, 2) == pow(z, 2)) flag = flag ? 2 : 0;//判断直角
	if (x == y || y == z) flag = flag ? 3 : 0;//判断等腰
	if (x == y && y == z) flag = flag ? 4 : 0;//判断等边
	return flag;
}
int main() {
	int i, j, k;
	cin >> i >> j >> k;
	Triangle ans(i, j, k);//ans是具体的对象
	ans.print();
	return 0;
}

6-3 时间类

题目描述
定义一个时间类,数据成员包括年、月、日,它的函数成员分别可以设置时间、显示时间,其中显示时间的函数,使用重载函数定义,遇到整型数值,则返回2017-5-30的格式,遇到浮点型数值,则输出2017年5月30日的格式。

输入样例
2017 5 30 1.1
输出样例
2017年5月30日

#include <cstdio>
#include <iostream>
using namespace std;
class Clock
{
public:
	Clock(int y, int m, int d) {year = y, month = m, day = d;};
	void show(int flag) {
			printf ("%d-%d-%d\n", year, month, day);
	}
	void show(double flag){
			printf ("%d年%d月%d日\n", year, month, day);
	}
private:
	int year, month, day;
	bool flag = 0;
};
int main() {
	int a, b, c;
	string s;
	int k = 1;
	cin >> a >> b >> c >> s;
	//判断浮点数
	int len = s.length();
	for (int i = 0; i < len; i++) 
		if (s[i] == '.') k = 0;
	Clock ans(a, b, c);
	if (k) ans.show(1);
	else ans.show(1.00);
	return 0;
}

6-4 员工薪金管理类

题目描述
设计雇员Employee类,包含雇员的情况,工号、姓名、工资等级(每月工资数,整型数值)、受雇时间(年、月、日)。编写程序测试Employee类。要求输入任意员工工号,及当前日期(年、月,此日期应晚于受雇时间),输出该员工姓名接应得到的工资总额,中间用空格隔开。
已知当前所有员工信息如下:
1,“wang”,5000,2000,10,23
2,“liu”,4500,2008,1,20
3,“huo”,3800,2003,7,3
4,“ma”,5300,2015,4,10
5,“meng”,6000,2016,3,16

输入样例
5 2016 5
输出样例
meng 12000

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
class staff
{
public:
	staff(int id, string s, int money, int y, int m, int d);
	void payoff(int y, int r) {
		num = (y - eyear) * 12 + (r - emonth);
		num *= salary;
	}
	void print() {
		cout << name << " ";
		cout << num << endl;}
private:
	string name;
	int ID;
	int salary;
	int eyear, emonth, eday;
	int num;
};
staff::staff(int id, string s, int money, int y, int m, int d) {
	ID = id; name = s; salary = money;
	eyear = y, emonth = m, eday = d;
}
 
int main() {
	staff a[5] = {staff(1,"wang",5000,2000,10,23), 
				  staff(2,"liu",4500,2008,1,20),
				  staff(3,"huo",3800,2003,7,3),
				  staff(4,"ma",5300,2015,4,10),
				  staff(5,"meng",6000,2016,3,16)};
	int i, y, m;
	cin >> i >> y >> m;
	a[i - 1].payoff(y, m);
	a[i - 1].print();
	return 0;
}

上机考试题

1.求最小值

输入3个double类型数,求最小值。

输入格式:
12.5 10.5 13.5

输出格式:
10.5

#include<iostream>
using namespace std;
int main(){
    double a,b,c,x;
    cin>>a>>b>>c;
    x=(a<b?a:b)<c?(a<b?a:b):c;
    cout<<x;
    return 0;
}

2.计算奇数之和

输入5个正整数,求奇数之和。

输入格式:
1 2 3 4 5

输出格式:
9

#include<iostream>
using namespace std;
int main(){
    int a[5],sum=0;
    for(int i=0;i<5;i++){
        cin>>a[i];
        if(a[i]%2==1)
            sum+=a[i];
    }
        
    
    cout<<sum;
    return 0;
}

3.统计素数

题目描述
编程实现:输入N,找出N-100之间的素数,并输出。(输出格式,每个素数之间用一个空格隔开,结尾无空格)

样例输入
10
样例输出
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

用了一个非常愚蠢的办法得分了

#include<iostream>
using namespace std;
int main(){
    int N,a[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
    cin>>N;
    for(int i=0;i<24;i++)
        if(N<a[i]) cout<<a[i]<<" ";
    cout<<a[24];
    return 0;
}

4.患者信息统计

某医院呼吸科需要统计肺病患者信息,请你建立患者类,包括患者的姓名、烟龄、酒龄3个私有数据成员,成员函数需要分别实现设置值功能、排序并显示功能。要求从键盘输入4个患者的“姓名 烟龄 酒龄”, 按照烟龄加酒龄的和,从高到低排序后依次输出患者所有信息。

划重点:这是道填空题

//按注释,填写完成下面程序,实现题目要求。
#include<iostream>
#include<cstring>
using namespace std;
/* 请在这里填写代码 */
__________________//声明一个类
{
private:
    char m_name[10];
    int m_LengthofSmoking; //烟龄
    int m_AgeofWine; //酒龄
    
public:
        void setPatient()
    {
/* 请在这里填写代码 */
__________________//读入患者的姓名
__________________//读入患者的烟龄
__________________//读入患者的酒龄
    }
     void copyPatient(Patient pts)
    {
strcpy(m_name,pts.m_name);
m_LengthofSmoking=pts.m_LengthofSmoking;
m_AgeofWine=pts.m_AgeofWine;
    }
    char* getName()
    {
/* 请在这里填写代码 */
__________________//获得患者的姓名
    }
    int getLengthofSmoking()
    {
/* 请在这里填写代码 */
__________________//获得患者的烟龄
}
    int getAgeofWine()
    {
/* 请在这里填写代码 */
__________________//获得患者的酒龄
    }
    int getTotal()
    {
/* 请在这里填写代码 */
__________________//返回患者的烟龄和酒龄的和
    }
        void sortTotal(Patient* pts,int n)
    {
        Patient temp;
        for(int i=1;i<n;i++)
        {
            for(int j=n-1;j>=i;j--)
            {
                if((pts+j)->getTotal() > (pts+j-1)->getTotal())
                {
                    temp.copyPatient(*(pts+j-1));
                    (pts+j-1)->copyPatient(*(pts+j));
                    (pts+j)->copyPatient(temp); 
                }
            }
        }
        for(int i=0;i<n;i++)
        {
/* 请在这里填写代码 */
__________________//输出患者的信息,包括姓名,烟龄和酒龄
        }
    }
};

int main()
{
    Patient pts[4];
    for(int i=0;i<4;i++)
    {
        pts[i].setPatient();
    }
    pts[0].sortTotal(pts,4);
    return 0;
}

输入格式:
输入4个患者的信息。

输出格式:
按照烟龄加酒龄的和,从高到低排序后依次输出患者所有信息。

输入样例:
在这里给出一组输入。例如:

wang
28
29
liu
37
47
zhao
30
42
fu
19
29

输出样例:
在这里给出相应的输出。例如:

liu 37 47
zhao 30 42
wang 28 29
fu 19 29文章来源地址https://www.toymoban.com/news/detail-726889.html

#include<iostream>
#include<cstring>
using namespace std;
class Patient
{
private:
    char m_name[10];
    int m_LengthofSmoking; //烟龄
    int m_AgeofWine; //酒龄
    
public:
        void setPatient()
    {
      cin>> m_name;
      cin>> m_LengthofSmoking;
      cin>> m_AgeofWine;      
    }
     void copyPatient(Patient pts)
    {
     strcpy(m_name,pts.m_name);
     m_LengthofSmoking=pts.m_LengthofSmoking;
     m_AgeofWine=pts.m_AgeofWine;
    }
    char* getName()
    {
     return m_name;
    }
    int getLengthofSmoking()
    {
     return m_LengthofSmoking;
    }
    int getAgeofWine()
    {
     return m_AgeofWine;
    }
    int getTotal()
    {
     return m_LengthofSmoking+m_AgeofWine;
    }
        void sortTotal(Patient* pts,int n)
    {
        Patient temp;
        for(int i=1;i<n;i++)
        {
            for(int j=n-1;j>=i;j--)
            {
                if((pts+j)->getTotal() > (pts+j-1)->getTotal())
                {
                    temp.copyPatient(*(pts+j-1));
                    (pts+j-1)->copyPatient(*(pts+j));
                    (pts+j)->copyPatient(temp); 
                }
            }
        }
        for(int i=0;i<n;i++)
        {cout<< (pts+i)->getName()<<" "
            <<(pts+i)->getLengthofSmoking()<<" "
            <<(pts+i)->getAgeofWine()<<endl;
        }
    }
};

int main()
{
    Patient pts[4];
    for(int i=0;i<4;i++)
    {
        pts[i].setPatient();
    }
    pts[0].sortTotal(pts,4);
    return 0;
}

到了这里,关于北邮信通2022C++大一上学期PTA汇总(含代码)(已完结)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 北邮22信通:复习补充:双向链表的实现

    北邮22信通一枚~    跟随课程进度每周更新数据结构与算法的代码和文章  持续关注作者  解锁更多邮苑信通专属代码~ 获取更多文章  请访问专栏: 北邮22信通_青山如墨雨如画的博客-CSDN博客 **说明** 最近复习看到书后有双向链表的题目,编出来供大家复习~ ********* 目录

    2024年02月07日
    浏览(58)
  • 关于大一上学期STM32培训的经验及教训(完全初学)

          主要是写出来给要直接学习STM32的人的一些经验或者是教训以及踩坑点,我后续也会开始写STM32的一些我已经学会的基础性的初学者应用型教程(如没有前置知识点亮LED,我会在这里说GPIO是个啥,怎么选口,怎么查手册等基础入门方法) 我也要期末考试后回家了,我想

    2024年02月03日
    浏览(36)
  • 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

    题目描述: 1.程序要求:实现对5个数(a[0]~a[4],数组元素从键盘读入)进行从大到小起泡法排序。输入第一组数据:1 2 3 4 5;输入第二组数据:3 5 4 1 2;验证程序的正确性。 题目描述: 2.程序要求:实现三阶方阵转置,并打印转置后的方阵。 测试主函数为: int main() { in

    2024年02月15日
    浏览(47)
  • 北邮22信通:实验六 由运放器构成的音频放大电路设计、仿真、测试报告

    北邮22信通一枚~    持续更新模电实验讲解 关注作者,解锁更多邮苑模电实验报告~ 获取更多文章,请访问专栏: 北邮22信通——电子电路_青山如墨雨如画的博客-CSDN博客 目录 实验目的: 设计要求: *补充: *(1)uA741的8个引脚: *(2)AD2接口: *(3)电路搭建 *(3.1)电

    2024年02月08日
    浏览(56)
  • 大一python语言程序设计,大一pta编程题python答案

    大家好,小编为大家解答大一python语言程序设计的问题。很多人还不知道大一pta编程题python答案,现在让我们一起来看看吧! 实例001:数字组合 题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析 遍历全部可能,把有重复的剃

    2024年03月22日
    浏览(84)
  • PTA|C语言基础题型(大一上)

    目录 关于素数的函数 统计素数并求和  字符串连接 关于统计单词 回文串的判断 删除重复字符 删除数字字符 删除重复字符 删除指定字符 字符串的逆序输出 求最大值及其下标  交换最小值和最大值(两个问题分开求) getchar( )补充知识点: 二维数组的相关问题 数组的边框

    2024年02月04日
    浏览(76)
  • 北邮22级信通院数电:Verilog-FPGA(5)第四第五周实验 密码保险箱的设计

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.密码箱的功能和安全性 显示: 输入部分: 确认键: 复位键:

    2024年02月08日
    浏览(45)
  • 北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1  counter_24.v 1.2  divide.v 1.3  debounce.v 二.管脚分配 三

    2024年02月04日
    浏览(45)
  • 北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分  二.管脚分配 三.实现过程讲解及效果 shift_register.v d

    2024年02月05日
    浏览(62)
  • 北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(1)设计一个汽车尾灯自动控制系统

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客   目录 一.题目要求 二.代码部分 2.1  car_system.v  2.2  divide.v 三.管脚分配

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包