day36

1.1    前言


 C语言是完全面向过程语言,C++是半面向过程半面向对象语言,C#、QT是完全面向对象的编程语言
 C++是对C语言的扩充,所有C语言的语法,C++都可以直接使用
 C++的编译器是g++,要求比C语言的编译器gcc更加严格
 C++的文件后缀为 .cpp  .cxx  .C  .cc  .hpp
 

//#include<iostream>
//#include<stdio.h>     //如果没有加该头文件,g++编译器直接报错,gcc报警告
//using namespace std;
 
void fun(void *ptr)
{
    //如果没有强制类型转换,g++编译器会报错,gcc不会
    int *q = (int *)ptr;       //将void×转换为int *
 
    *q = 1314;
}
 
 
 
 
int main(int argc, const char *argv[])
{
    int num = 520;
 
    fun(&num);            //将num的地址传递过去
    printf("num = %d\n", num);
 
    return 0;
}
 
 


1.2    面向对象


1>    所谓面向对象编程:程序由两部分组成,分别是类的定义和类的使用
2>    面向过程与面向对象:以需求一个电脑为例
面向过程的思想:先购买主板、显卡、cpu、显示器。。。所有零件全部整出来后,进行组装成一台电脑供后期程序使用
面向对象的思想:直接买一台电脑,电脑中厂商封装好了相关组件。后期程序直接使用相关接口
3>    面向对象:面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式。
将实现同一事物的所有的属性(成员变量)和行为(成员方法)都集中到一起,我们称之为 类(class),并向外部提供相关接口,用户可以使用这些接口来实现对该类实例化出来的对象的操作,进而对整个进程进行服务。 
 


1.3    第一个C++程序框架
 

#include <iostream>
#include<stdio.h>
#include<cstdio>                //#include<stdio.h>
#include<cstring>               //#include<string.h>
//C++提供的头文件一般都不以.h结尾,C++进一步封装了C语言的头文件,只需将C语言的头文件.h去掉,在前面加上c即可
//iostream: i(input)、o(output)、stream字节流
//iostream:本质上是一个类,表示当前程序中需要使用该类实例化对象
 
using namespace std;
//using:表示要引入命名空间
//namespace:命名空间的关键字
//std:系统提供的名字空间
 
 
int main()
{
    cout << "Hello World!" << endl;
    //cout:是来自于命名空间std中的一个类名(变量名、结构体变量)
    //<< :插入运算符,用于输出数据,使用了运算符重载函数完成
    //后面是要输出的数据
    //endl: end line 表示换行,类似于C语言中的'\n'
 
 
    return 0;
}
 


1.4    输出流对象:cout


1>    cout是在std命名空间中定义的一个 ostream的类对象(结构体变量)
2>    可以使用该类对象中的成员方法 也是运算符重载函数 << 来进行数据的输出
3>    cout输出数据时,不像C语言中的printf一样,不需要使用格式控制符,直接自动识别
4>    如果有多个数据需要输出,则使用多个 << 级联进行
 

#include <iostream>
 
 
using namespace std;
 
int main()
{
    cout << "Hello World!" << endl;       //使用cout输出一个字符串
 
 
    //可以输出其他类型 的数据,无需使用格式控制符,直接自动识别类型
    cout<<"24061 " << 19 << 99.8 << "刘皖东" << 'H' << endl;
    return 0;
}
 
 


1.5    输入流对象:cin


1>    cin是在std命名空间中定义的一个 istream的类对象(结构体变量)
2>    可以使用该类对象中的成员方法 也是运算符重载函数 >> 来进行数据的输入
3>    cin输入数据时,不像C语言中的scanf一样,不需要使用格式控制符,直接自动识别
4>    如果有多个数据需要输入,则使用多个 >> 级联进行
5>    类似于scanf不加'\n'一样,cin输入时,一般也不加endl
 

#include <iostream>
 
 
using namespace std;
 
 
int main()
{
    int num = 0;         //定义整形数据
    char ch = 0;         //定义字符数据
    double value = 0.0;    //定义实型数据
 
 
    cin >> num;        //输入字符数据
    cin >> ch >> value;    //级联输入多个数据
 
 
    cout<<"num = "<<num<<"  ch = "<<ch<<"  value = "<<value<<endl;    //将所有数据输出
 
 
    cout << "Hello World!" << endl;
    return 0;
}
 
 



1>提示并输入一个字符,判断该字符是大写还是小写,如果是小写,转变成大写后输出,如果是大写,转变成小写输出,如果是其他字符,则转变成 * 输出
 

#include<iostream>
using namespace std;
 
int main()
{
    char ch=0;      //定义字符数据
    cout << "请输入一个字符>>>" ;
    cin >> ch;       //输入一个字符数据
    if(ch >= 'A' && ch <= 'Z')
    {
        ch += 32;
    }    
    else if(ch >= 'a' && ch <= 'z')
    {
        ch -=32;
    }
    else
    {
        ch = '*';           //其他数据都转变成 *
    }
    cout << ch << endl;          //输出转换后的结果
    return 0;
}


2>    使用cout完成,输出斐波那契前20项
1  1   2   3   5  8 。。。
 

    int arr = 1;
    int brr = 1;
    int crr = 3;            //项数
    cout <<arr <<'\t' <<brr <<'\t';            //输出前两项
    while(crr<=20)
    {
        int temp =arr+brr;       //由前两项推出第三项
        arr =brr;                 //迭代前面的数据
        brr =temp;
        crr+=1;
         cout <<temp<<'\t' ;         //输出第三项
    }
    cout<<endl;

 
1.6    cout的格式化输出(了解)
 

#include <iostream>
#include<iomanip>          //格式化设置头文件
 
 
using namespace std;
 
 
int main()
{
    int num = 101;       //默认数据是10进制数据
    cout<<"num = "<<num<<endl;          //默认输出十进制数据
 
 
    //使用 关键字设置输出的数据进制数
    cout<<oct<<"num = "<<num<<endl;     //145
    cout<<hex<<"num = "<<num<<endl;          //65
    cout<<dec<<"num = "<<num<<endl;          //设置输出十进制数据
 
 
    cout<<"**************************************************"<<endl;
    //使用函数设置输出的数据的进制数
    cout<<setbase(8)<<"num = "<<num<<endl;       //145
    cout<<setbase(16)<<"num = "<<num<<endl;       //65
    cout<<setbase(10)<<"num = "<<num<<endl;       //101
    cout<<"**************************************************"<<endl;
 
 
    //设置填充字符以及设置宽度
    cout<<setw(10)<<"num = "<<num<<endl;          //    num = 101
    cout<<left<<setw(10)<<"num = "<<num<<endl;          //    num = 101
    cout<<right<<setw(10)<<setfill('0')<<"num = "<<num<<endl;          // 0000num = 101
    cout<<right<<setw(10)<<setfill('*')<<"num = "<<num<<endl;          // ****num = 101
    cout<<"**************************************************"<<endl;
    //设置精度
    double value = 3.14159265358;
    cout<<"value = "<<value<<endl;            //默认保留6位有效数字
    cout<<setprecision(2)<<"value = "<<value<<endl;     //保留2位有效数字
    cout<<fixed<<setprecision(2)<<"value = "<<value<<endl;   //fixed 与setprecision共同使用时,括号中的数字表示的是保留小数的位数
 
    return 0;
}
 


二、命名空间


2.1    为何引入命名空间


1>    当多人协同开发一个项目时,可能会出现每个人对标识符的命名没有问题,但是整合到一起时,会出现命名污染问题。例如张三和李四同时定义了一个同名的全局变量,编译时就直接报错,即使编译时不报错,使用时也会分不清是用的哪个。
2>    此时就需要引入一个空间,让每个人所用到的名字都放入到自己的空间中,使用时,在标识符前面加上对应命名空间即可。相当于给标识符起了一个“姓氏”


2.2    程序中的标识符(名字)


变量名、函数名、结构体名、共用体名、指针名、数组名 。。。


2.3    系统提供的命名空间 std


1>    C++中每个头文件,都会提供一个名为std的命名空间,表示该文件提供的系统的名字,都放入到该命名空间中
2>    std名字空间的使用方式有三种
1、单独使用:使用名字时,需要将命名空间和名字一起使用
2、先声明某个名字,后期在使用该名字时,直接使用即可,无需加命名空间名和作用域限定符,但是没有声明的不能直接用
3、使用using namespace 将整个命名空间全部声明,后期该命名空间中的名字可以直接使用
 

#include <iostream>
#include<stdio.h>
 
int main()
{
    //使用方式1:标识符和命名空间名一起使用,中间使用作用域限定符连接
    std::cout<<"hello world"<<std::endl;
 
 
    //使用方式2:将某个名字使用using进行声明,没有声明的名字不能直接使用
    using  std::cout;       //声明cout这个名字
    cout<<"hello world"<<std::endl;
 
 
    //使用方式3:将整个命名空间进行声明
    using namespace std;
    cout<<"hello world"<<endl;
 
    return 0;
}
 
 


2.4    自定义命名空间


1>    定义格式
 

namespace 命名空间名
{
    类型   名字1;
    类型   名字2;
    。。。
    类型   名字n;
}
 
 

#include <iostream>
 
 
using namespace std;
 
 
//定义属于自己的命名空间
namespace zpp
{
char name[20] = "zhangpengpeng";
int age = 20;
void fun()
{
    cout<<"name = "<<name<<"   age = "<<age<<endl;
}
 
 
}
 
 
 
 
int main()
{
    //使用方式1:连名带姓使用
    cout << "name = "<<zpp::name<<endl;
 
 
    //使用方式2:将某个名字声明
    using zpp::age;
    cout << "age = "<<age<<endl;              //20
 
 
    //使用方式3:将整个命名空间进行声明
    using namespace zpp;
    fun();
 
 
    return 0;
}


2>    同一个作用域下可以定义多个同名的命名空间,但是,这多个命名空间在编译时会合成一个命名空间,所以要求命名空间中的名字不能重复
 

 
//定义属于自己的命名空间
namespace zpp
{
    char name[20] = "zhangpengpeng";
    int age = 20;
    void fun()
    {
        cout<<"name = "<<name<<"   age = "<<age<<endl;
    }
 
}
 
//定义新的命名空间
namespace zpp
{
    int value = 1314;
    double key = 3.14;
    //double age = 666.66;     //不能在命名空间中定义重复的名字
}
 


3>    命名空间可以嵌套定义,使用时,如果使用的是最里层的名字,则需要使用作用域限定符一级一级找到最里层


4>    如果命名空间中有函数,一般是进行命名空间内声明,命名空间外定义
 

#include <iostream>
 
 
using namespace std;
 
 
//定义属于自己的命名空间
namespace zpp
{
    char name[20] = "zhangpengpeng";
    int age = 20;
    void fun();              //命名空间内容进行函数的声明
}
 
 
//定义新的命名空间
namespace zpp
{
    int value = 1314;
    double key = 3.14;
    //double age = 666.66;     //不能在命名空间中定义重复的名字
 
 
    //定义一个命名空间
    namespace MySon
    {
        int value = 999;
        double key = 1010;
    }
}
 
 
//命名空间外进行函数定义
void zpp::fun()
{
    cout<<"name = "<<name<<"   age = "<<age<<endl;
}
 
int main()
{
    //使用方式1:连名带姓使用
    cout << "name = "<<zpp::name<<endl;
 
 
    //使用方式2:将某个名字声明
    using zpp::age;
    cout << "age = "<<age<<endl;              //20
 
    //使用方式3:将整个命名空间进行声明
    using namespace zpp;
    fun();
 
    //使用MySon中的value
    cout<<zpp::MySon::value<<endl;        //999
 
 
    return 0;
}
 


2.5    命名空间冲突问题


1>    多个命名空间中,出现相同名字时,并且每个命名空间都整体声明了:此时如果使用冲突的名字时,需要加上命名空间名和作用域限定符进行区分
2>    命名空间中的名字和全局变量同名时:全局变量会自动放入全局命名空间中,要使用该命名空间中的名字,只需在名字前加作用域限定符即可。
3>    命名空间中的名字和局部变量同名时:优先使用局部变量,如果非要使用命名空间中的名字,需要加上命名空间名和作用域限定符
 

#include <iostream>
 
 
using namespace std;
 
 
//zhangsan的命名空间
namespace ZhangSan
{
    int num = 520;
    double key = 1314;
}
 
 
//定义sili的命名空间
namespace LiSi
{
    int age = 20;
    int num = 999;
}
 
 
//同时声明两个命名空间
using namespace ZhangSan;
using namespace LiSi;
 
 
//定义全局变量:key
int key = 55555555;
 
 
int main()
{
    //定义局部变量age
    int age = 100;
 
 
    cout<<"key = "<<::key<<endl;               //此时使用的是全局变量的key
    cout<<"key = "<<ZhangSan::key<<endl;           //使用的是ZhangSan命名空间中的数据
    cout<<"age = "<<age<<endl;           //此时使用的是局部变量,局部优先原则
    cout<<"age = "<<LiSi::age<<endl;           //此时使用的是LiSi命名空间中的名字
    cout << "num = "<< ZhangSan::num << endl;       //?
    cout << "num = "<< LiSi::num << endl;
 
 
    cout << "Hello World!" << endl;
    return 0;
}
 


三、C++中的字符串


3.1    C++支持的字符串


1>    C++支持两种风格的字符串:分别是C语言的字符串,以'\0'作为结尾的字符串
              也支持 string 类型的字符串,本质上是一个类对象
2>    要是有C++风格的字符串,需要引入头文件 string
#include<string>
 


3.2    string类型的字符串初始化和赋值


1>    单个变量的初始化和赋值
 

#include <iostream>
#include<string>          //字符串类所在的头文件
 
 
using namespace std;
 
 
int main()
{
    string s1;            //定义了一个字符串变量,没有初始化,调用了类的无参构造
    cout<<"s1 = "<<s1<<endl;       //此时得到的是一个空串
 
 
    string s2 = "hello world";       //定义一个字符串并对其进行初始化, 调用了拷贝构造函数
    cout<<"s2 = "<<s2<<endl;        //"hello world"
 
 
    string s3("ni hao");          //定义一个字符串并对其进行初始化, 调用了有参构造函数
    cout<<"s3 = "<<s3<<endl;        //ni hao
 
 
    string s4(5,'A');             //定义一个字符串,并且用5个A进行初始化, 调用了有参构造
    cout<<"s4 = "<<s4<<endl;      //AAAAA
 
 
    string s5 = {"lalalalalala"};    //定义一个字符串并对其进行初始化,调用了拷贝构造函数
    cout<<"s5 = "<<s5<<endl;      //lalalalalala
 
 
    s1 = "dududududud";           //C++中可以直接使用等号给字符串变量赋值, 调用了拷贝赋值函数
    cout<<"s1 = "<<s1<<endl;
 
 
    return 0;
}


2>    多个字符串之间的初始化和赋值
 

#include <iostream>
#include<string>
 
 
using namespace std;
 
 
int main()
{
    string s1 = "hello world";        //定义一个字符串并且初始化
 
 
    string s2 = s1;              //定义一个字符串,用其他字符串进行初始化  调用拷贝构造函数
    cout<<"s2 = "<<s2<<endl;    //hello world
 
 
    string s3(s1);                 //定义一个字符串,用其他字符串进行初始化  调用有参构造函数
    cout<<"s3 = "<<s3<<endl;    //hello world
 
 
    string s4 = s1 + s2;        //将s2连接到s1后面,并将结果给s4初始化,调用后s1和s2不变
    cout<<"s4 = "<<s4<<endl;    //hello worldhello world
 
 
    string s5 = s1 + "lalalalalal";
    cout<<"s5 = "<<s5<<endl;    //hello worldlalalallala
 
 
    string s6 = "lalalalalal" + s1;
    cout<<"s6 = "<<s6<<endl;    //lalalallalahello world
 
 
    //string s7 = "hello " + "world";        //不可用
 
 
    s1 = s6;                 //使用一个字符串给另一个字符串赋值     调用拷贝赋值函数
    cout<<"s1 = "<<s1<<endl;
 
 
    return 0;
}


3.3    字符串的常用函数


1>    c_str()、data()函数:将C++风格的字符串向C语言风格的字符串进行转换
 

#include <iostream>
#include<cstring>
using namespace std;
 
int main()
{
    char str1[50] = "hello world";          //c风格的字符串
    string str2;                         //C++风格的字符串
    //c语言风格字符串向C++风格字符串转换
    str2 = str1;
    cout<<"str2 =" <<str2<<endl;
 
    str2 = "nihao hqyj";
    //C++风格字符串向C语言风格字符串转换
    //str1 = str2;             //不可以
    //strcpy(str1, str2);        //不可以,因为strcpy要的两个参数都是char*类型,而str2是string类型
    strcpy(str1, str2.data());
    strcpy(str1, str2.c_str());
    //str2.data()   str2.c_str()             //将C++风格的字符串转换为C风格
    cout << "str1 = "<<str1<<endl;        //输出C风格的字符串  nihao hqyj
 
    return 0;
}


2>    求长度函数 size()、length()   、判空函数 empty() 、 清空函数 clear()
 

#include <iostream>
 
 
using namespace std;
 
 
int main()
{
    string str = "hello world";
 
 
    //判断是否为空
    if(str.empty())
    {
        cout<<"字符串为空"<<endl;
    }else
    {
        cout<<"字符串非空"<<endl;
    }
 
 
    //求字符串长度
    int len = str.length();
    cout<<"len = "<<len<<endl;          //11
 
 
    //将字符串清空
    str.clear();
 
 
    //判断是否为空
    if(str.empty())
    {
        cout<<"字符串为空"<<endl;
    }else
    {
        cout<<"字符串非空"<<endl;
    }
 
 
    len = str.length();            //再次求长度
    cout<<"len = "<<len<<endl;          //0
 
 
    //向字符串中放入字符
    str.push_back('H');
    str.push_back('e');
    str.push_back('l');
    str.push_back('l');
    str.push_back('o');
    cout<<"str = "<<str<<endl;      //hello
 
 
    //调用交换函数
    string str2 = "I love China";
    str.swap(str2);
    cout<<"str = "<<str<<endl;    //I love China
    cout<<"str2 = "<<str2<<endl;    //Hello
  
 
 
    return 0;
}


3.4    string类型支持的运算符  : + 、&、关系运算
 

#include <iostream>
 
 
using namespace std;
 
 
int main()
{
    string str1 = "hello world";
    string str2 = "I love China";
 
 
    //判断两个字符串的大小            //取代了strcmp
    if(str1 > str2)
    {
        cout<<str1<<"大"<<endl;
    }else if(str1 < str2)
    {
        cout<<str2<<"大"<<endl;
    }else
    {
        cout<<"一样大"<<endl;
    }
 
 
    cout<<&str1<<endl;           //输出str1的地址
 
 
    cout<<str1+str2<<endl;         //将两个字符串进行加法运算    取代了strcat
    
    str1 = str2;                   //将两个字符串之间互相赋值   取代了strcpy
 
 
    return 0;
}
 
 
 


3.5    字符串的输入


1>    当输入的字符串中没有空格时,可以直接使用 cin 即可


2>    当输入的字符串中包含空格时,就不能使用cin了,需要使用一个全局函数 getline
 

    inline basic_istream<_CharT, _Traits>& getline(basic_istream<_CharT, _Traits>& __is,     basic_string<_CharT, _Traits, _Alloc>& __str)
    //inline表示是内联函数
    //basic_istream<_CharT, _Traits>&:函数返回值类型
    //getline:函数名
    //__is:第一个参数
    //__str:第二个参数,要被输入的字符串
 
 

#include <iostream>
 
 
using namespace std;
 
 
int main()
{
    string str1;
    string str2;
 
 
    cout<<"请输入第一个字符串:";
    cin >> str1;                       //只能输入不包含空格的字符串
    cout<<"str1 = "<<str1<<endl;
 
 
    getchar();
    cout<<"请输入第二个字符串:";
    getline(cin, str2);                 //调用全局函数,输入带空格的字符串
    cout<<"str2 = "<<str2<<endl;
 
 
    return 0;
}
 
 
 
 

  提示并输入一个字符串,统计该字符串中字母个数、数字个数、空格个数、其他字符的个数

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int a = 0, b = 0, c = 0, d = 0;//定义个数变量a为字母,b为数字,c为空格,d为其他
    string str;//创建一个空的c++字符串
    cout << "请输入一个字符串"<<endl;
    getline(cin, str);//带空格的输入
    const char *p = str.data();//定义一个字符指针指向str的第一个元素
    while (*p != '\0')//不为空
    {
        if ((*p <= 'Z' && *p >= 'A') || (*p <= 'z' && *p >= 'a'))//字母
        {
            a++;
        }
        else if (*p == ' ')//空格
        {
            c++;
        }
        else if (*p <= '9' && *p >= '0')//数字
        {
            b++;
        }
        else//其他
        {
            d++;
        }
        p++;//指针偏移到下一个
    }
    //分别打印各元素个数
    cout << "字母个数: " << a << endl;
    cout << "数字个数: " << b << endl;
    cout << "空格个数: " << c << endl;
    cout << "其他字符个数: " << d << endl;
    return 0;
}


  思维导图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值