一.题目:
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等等,尤其是类需要多花一些心思去学习。指针和类都还不是很熟悉,还要继续加油啊。