第一轮考核

一.题目:

1、输入自己的个人信息(学号,姓名,专业,性别等) 并输出控制台。

(1)字符型数组

  • c++可以沿用c用字符型数组来存放字符串
#include<iostream>

using namespace std;

int main()
{
	long long int studentnumber;
	cout<<"请输入你的学号:";
	cin>>studentnumber;
	
	cin.get();//处理回车
	
	char name[100];
	cout<<"请输入你的姓名:";
	cin.getline(name,100);
	
	char sex[50];
	cout<<"请输入你的性别:";
	cin.getline(sex,50); 
	
	char school[100];
	cout<<"请输入你所在的学院:"; 
	cin.getline(school,100); 
	
	char major[100];
	cout<<"请输入你所在的专业:"; 
	cin.getline(major,100); 
	
	char theclass[100];
	cout<<"请输入你所在的班级:"; 
	cin.getline(theclass,100); 
	
	cout<<endl;
	cout<<"你的学号是:"<<studentnumber<<endl; 
	cout<<"你的姓名是:"<<name<<endl; 
	cout<<"你的性别是:"<<sex<<endl; 
	cout<<"你所在的学院是:"<<school<<endl;
	cout<<"你所在的专业是:"<<major<<endl;
	cout<<"你所在的班级是:"<<theclass<<endl;
	return 0;
} 

(2)string

#include<iostream>
#include<string>
using namespace std;
int main()
{
	long long int studentnumber;
	cout<<"请输入你的学号:";
	cin>>studentnumber;
	
	cin.get();
	
	string name,sex,school,major,theclass;
	
	cout<<"请输入你的姓名:";
	getline(cin,name);
	
	cout<<"请输入你的性别:";
	getline(cin,sex); 
	
	cout<<"请输入你所在的学院:"; 
	getline(cin,school); 

	cout<<"请输入你所在的专业:"; 
	getline(cin,major); 
	
	cout<<"请输入你所在的班级:"; 
	getline(cin,theclass); 
	
	cout<<endl;
	cout<<"你的学号是:"<<studentnumber<<endl; 
	cout<<"你的姓名是:"<<name<<endl; 
	cout<<"你的性别是:"<<sex<<endl; 
	cout<<"你所在的学院是:"<<school<<endl;
	cout<<"你所在的专业是:"<<major<<endl;
	cout<<"你所在的班级是:"<<theclass<<endl;
	
	return 0;
}

2、设计一个程序,实现判断是否是闰年。

  • 判断闰年在学c的时候就遇到好多次了,在学习c++的时候,也被老师当做例题来学习了,让我初步认识了if语句和bool变量。

  • 感觉c++的if语句与c语言的if语句用法很像,while,do-while,switch ,for…感觉也基本是一样的。

  • if语句后面只有一个语句的时候,为了更清晰,还是添上了大括号

#include<iostream>
using namespace std;
int main()
{
	int year;
	bool isLeapYear;
	cout<<"Please enter a year:";
	cin>>year;
	isLeapYear=(year%4==0&&year%100!=0)||(year%400==0);
	if(isLeapYear){
		cout<<year<<" is a leapyear.";
	}else{
		cout<<year<<" is not a leapyear.";
	}
	
	return 0;
}

3、输入一个正整数,反转这个数字,例如输入123,输出321。

  • 又是一道经典例题,在学c的时候就遇到了类似的例题和练习,去前导0和不去的都有。
  • 反转的方法是一样的
  • 要求去前导0,所以:
#include<iostream>
using namespace std;
int main()
{
	int n,digit,ret=0;
	cin>>n;
	while(n>0){//输入正整数反转,其他不
		digit=n%10;
		ret=digit+ret*10;
		n/=10;
	}
	cout<<ret<<endl;
	return 0;
}

4、输入两个整数,求两个给定正整数的最大公约数和最小公倍数。

#include<iostream>
using namespace std;
int main()
{
	int m,n,t;
	int mdivisor,mmultiple;
	cout<<"请输入两个正整数:"<<endl;
	cin>>m>>n;
	if(m>n){//因为最小公倍数一定不小于两个数中比较大的那个
		t=m;
		m=n;
		n=t;
	}
	int x=m,y=n;
	while(y!=0){
		t=x%y;
		x=y;
		y=t;
	}
	mdivisor=x;
	int i=n;//从比较大的开始
	while(!(i%m==0&&i%n==0)){//次数不确定感觉用while比for好一丢丢(而且用for大括号中空空荡荡)
		i++;
	}
	mmultiple=i;
	cout<<"它们的最大公约数和最小公倍数分别是:"<<mdivisor<<"和"<<mmultiple<<endl; 
	return 0;
}

5、输出前1000的素数。

  • 头文件"cmath",c中挺多头文件跟c的比是去后面的.h,在前面加c

(1)前1000个素数:

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(unsigned n)
{
	int ret=1;
	int i;
	double a=sqrt(n); //减少循环次数
	if(n==1||n==0){//虽然主函数直接从2开始判断了,但是遇到实际问题时,不加上这两情况就会出错
		ret=0;
	}else{
		for(i=2;i<=a;i++){//i<a不可以
			if(n%i==0){
				ret=0;
				break;
			}
		}
	}
	return ret==1;
}
int main()
{
	unsigned int cnt=0,x;
	for(x=2;cnt<1000;x++){
		if(isPrime(x)){
			cnt++;
			cout<<"第"<<cnt<<"个素数是:"<<x<<endl;
		}

	}
	return 0;
}

(2)1000以内的素数

#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(unsigned n)
{
	int ret=1;
	int i;
	double a=sqrt(n);
	if(n==1||n==0){//虽然主函数直接从2开始判断了,但是遇到实际问题时,不加上这两情况就会出错
		ret=0;
	}else{
		for(i=2;i<=a;i++){
			if(n%i==0){
				ret=0;
				break;
			}
		}
	}
	return ret==1;
}
int main()
{
	
	unsigned int x;
	for(x=2;x<=1000;x++){
		if(isPrime(x)){
			cout<<x<<endl;
		}
	}
	return 0;
}

6、给出 n,输出杨辉三角的前 n行。

(1)函数递归调用(首先想到的是)

  • 查找了对齐的方法,右对齐只要去掉“<<left”或者把left改成right(感觉c对齐更方便)
  • 应用了函数的递归调用,加深了一下理解。
  • 但是用函数的递归调用,运行所需时间比较长,解题可能会超时。用二维数组可以省很多时间
#include<iostream>
#include<iomanip>//实现左对齐的头文件
using namespace std;

 int c(int n,int i)
 {
 	int y;
 	if(i==1||i==n){
 		y=1;
	 }else{
	 	y=c(n-1,i)+c(n-1,i-1);//函数的递归调用
	 }
	 return y;
 }
 int main()
 {
 	int n,i,j;
 	cin>>n;
 	for(j=1;j<=n;j++){
 		for(i=1;i<=j;i++){
 			cout<<setw(8)<<left<<c(j,i);//左对齐
		 }
		 cout<<endl;
	 }
 	return 0;
 }

(2)二维数组

  • 所需时间较少
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int a[30][30];//再多就要超过范围了
	int n;
	cin>>n;
	int i,j;
	
	for(i=0;i<n;i++){
		for(j=0;j<=i;j++){
			
			if(j==0||j==i){
				a[i][j]=1;
			}
			else{
				a[i][j]=a[i-1][j]+a[i-1][j-1];
			}
			
		}
		
	}
	
	for(i=0;i<n;i++){
		for(j=0;j<=i;j++){
			
			cout<<setw(9)<<left<<a[i][j];
		}
		cout<<endl;
	}
	return 0;
}

7、统计单词数,输入一个要查询的单词,以及一段英文短文,求出现的单词的个数,不区分大小写

  • 刚开始以为不区分大小写会很艰难,但其实只要全都转成大写或者小写就可以了。

  • string有很多方便处理字符串的东西,比如

    #include<iostream>
    #include<string>
    using namespace std;
    
     //预处理:(1)把输入的全转成小写或者大写;(2)在word和article两侧都加上空格
    string change(string s);//转成小写的函数
      
    int main()
    {
        string word,article;
        getline(cin,word);
        getline(cin,article);
        
        word=change(word);//转小写 
        article=change(article);
        
        word=' '+word+' ';//左右加上空格 
        article=' '+article+' ';
        
        int i,cnt=0,p=0;
        while(1){
    		p=article.find(word,p);
    		if(p!=string::npos){//找到了,string::npos,如果不存在包含关系,返回值是npos,npos是一个常数 
    			cnt++;
    			p++; //往后找 
    		}else{
    			break; 
    		} 
    	}
    	if(cnt==0){
    		cout<<"没找到。"<<endl;
    	}else{
    		cout<<word<<"出现了"<<cnt<<"次。"<<endl; 
    	}
    	
    	
     	return 0; 
    }
     
    string change(string s)
    {
    	int i;
    	for(i=0;i<s.size();i++){
    		if(s[i]<='Z'&&s[i]>='A'){
    			s[i]+=32;
    		}
    	}
    	return s;
    }
    

8、输入一个正整数,判断是否是回文质数(回文数+质数)。

  • 思路就是写两个函数,分别用于判断一个数是不是质数和回文数。
#include<iostream>
#include<cmath>
using namespace std;

bool isPrime(unsigned a);//质数 

bool isHuiwen(unsigned b);//回文 

int main()
{
	unsigned x;
	cin>>x;
	if(isPrime(x)&&isHuiwen(x)){
		cout<<"YES."<<endl;
	}else{
		cout<<"NO."<<endl;
	}
	
	return 0;
}

bool isPrime(unsigned a)
{
	int ret=1;
	int i;
	double n=sqrt(a);
	if(a==1||a==0){
		ret=0;
	}else{
		for(i=2;i<=n;i++){
			if(a%i==0){
				ret=0;
				break;
			}
		}
	}
	return ret==1;
}

bool isHuiwen(unsigned b)
{
	int ret=0,t=b,d;
	while(b>0){
		d=b%10;
		ret=ret*10+d;
		b/=10;
	}
	return t==ret;
}

9、了解栈概念,自己编写一个实现栈的基本功能(入栈,出栈,求栈的大小等其他基本功能)。

  • 难点:类和指针
#include<iostream>
using namespace std;

class Point{
	public:
		int getdata();//获得 
		bool setdata(int data);//修改 
	private:
		int data;
};
 
int Point::getdata(){
	return this->data;
}
 
bool Point::setdata(int data){
	this->data=data;//把值传进来 
}

class Stack{//栈 
	public:
		Stack();//初始化栈 
		int topp();//得到最上面的元素 
		bool push(int data);//入栈成功与否 
		bool pop();//出栈成功与否 
		bool empty();//是否空栈 
		int size();//栈的大小(里面有几个元素) 
	private:
		Point *top;//栈顶 (用数组,数组名就相当于栈底) 
		Point base[100];
		int length;//长度 
};
//建栈 (初始化栈) 
Stack::Stack(){
	top=base;//使栈顶等于栈底 
	length=0;//长度为0 
}
//栈顶 
int Stack::topp(){
	if(length==0){//栈是否为空? 
		return 0;
	}
	return (top-1)->getdata();//可以不用else ;栈顶指的是栈最上面的元素的上面的位置 
}
//入栈 
bool Stack::push(int data){
	if(length==100){//栈是否满了? 
		return 0;
	}
	top->setdata(data);
	top++;
	length++;
	return 1;
}
//出栈 
bool Stack::pop(){
	if(base==top){
		return 0;
	}
	top--;//下次存数据可以把之前的覆盖掉 
	length--;
	return 1;
}
//是否空栈 
bool Stack::empty(){
	if(base==top){
		return 1;
	}else{
		return 0;
	}
}
//栈的大小 
int Stack::size(){
	return length;
}
 
int main(){
	Stack s = Stack();
	s.push(1);
	cout<<"最上面的元素是:"<<s.topp()<<endl;
	cout<<"栈内有"<<s.size()<<"个元素。"<<endl;
	s.push(2);
	cout<<"最上面的元素是:"<<s.topp()<<endl;
	cout<<"栈内有"<<s.size()<<"个元素。"<<endl;
	s.push(3);
	cout<<"最上面的元素是:"<<s.topp()<<endl;
	cout<<"栈内有"<<s.size()<<"个元素。"<<endl;
	cout<<endl; 
	for (int i=0; i<3; i++){
		cout<<"最上面的元素是:"<<s.topp()<<endl;
		s.pop();
		cout<<"栈内有"<<s.size()<<"个元素。"<<endl;
	}
	cout<<"是否空栈(是:1,不是:0):"<<s.empty()<<endl;
	return 0; 
}

10、分别使用指针引用编写两数交换,并根据自己实现的两数交换实现冒泡排序算法

  • 分别编写两数交换,然后主函数中进行冒泡排序
  • c中有指针,但是没有引用;c++都有

1)指针

#include<iostream>
using namespace std;

void swap(int* a,int* b)//指针 两数交换 
{
	int t=*a;
	*a=*b;
	*b=t; 
}

int main()
{
	int a[1000];
	int n;
	int i,j;
	cin>>n;//n是小于1000的整数 
	//输入含n个数的数组 
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	//冒泡排序算法
	for(i=0;i<n;i++){
		for(j=0;j<n-1;j++){
			if(a[j+1]<a[j]){
				swap(a[j+1],a[j]);
			}
		}
	}
	//输出
	for(i=0;i<n;i++){
		cout<<a[i]<<' ';
	} 
	return 0;
} 

2)引用

#include<iostream>
using namespace std;

void swap(int& a,int& b)//引用 两数交换 
{
	int t=a;
	a=b;
	b=t; 
}

int main()
{
	int a[1000];
	int n;
	int i,j;
	cin>>n;//n是小于1000的整数 
	//输入含n个数的数组 
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	//冒泡排序算法
	for(i=0;i<n;i++){
		for(j=0;j<n-1;j++){
			if(a[j+1]<a[j]){
				swap(a[j+1],a[j]);
			}
		}
	}
	//输出
	for(i=0;i<n;i++){
		cout<<a[i]<<' ';
	} 
	return 0;
} 

二.总结

刚开始学习c++,一些基础内容,如选择结构、循环结构、运算符等等跟c是相似,或者说是一样的,这部分比较好理解。不过也遇到一些c语言没有的内容,如类、引用、string等等,尤其是类需要多花一些心思去学习。指针和类都还不是很熟悉,还要继续加油啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值