Day_01 C与C++区别

大纲

1.C++头文件和命名空间

2.C++输入输出流

3.C++新增数据类型

4.C++函数思想

具体内容:

1.C++头文件和命名空间

c++标准输入输出流 通过的是#include<iostream>头文件 

C++的头文件是向下兼容C的 在C++中也可以用#include<stdio.h>

除此以外C++中调用C的头文件 还可以通去掉.h加前缀c来引用 

例如 #include<cstdio> (#include<stdio.h>)

说完C++头文件 来说说命名空间。 命名空间是C++里面独有的特性

由于命名空间的引入 可以提高标识符的使用率

//示例
//命名一个命名空间为A的命名空间
namescape A{
    int a=1;
    int b=1
}
//命名一个命名空间为B的命名空间
namescape B{
    int a=1;
    int b=1
}

不同的命名空间里的变量名可以是相同的 ,互不影响,且命名空间中定义的变量全部都是全局变量 ,命名空间中定义的变量叫做空间中的成员,命名空间中也可以定义或者申明函数。

#include<iostream>
using namespace std;
namespace A{
    void print();    //申明函数
    void print1(){
        printf("这是一个命名空间A中的函数");
    }    
}

int main(){

    A::print1();


    reutrn 0;
}

如上述代码所示,在命名空间A中定义一个函数 print1() 和申明一个函数 print(),(申明的函数如有需要,可以在命名空间外来定义)。

在命名空间定义的变量和函数 我们该如何调用呢?  可以通过 作用域分辨符:: 来引用它们。

说到这里 让我们先来了解一下作用分辨符的具体作用:1.作用分辨符可以用来空间名限定,类名限定。  2.作用分辨符可以用来标识全局变量。

下面就是标识全局变量的用法   作用分辨符+全局变量名

#include <iostream>
using namespace std;
int a=1;
int main(){
    int a=11;
    cout<<a<<endl;        //这里的a是局部变量(根据就近原则) a=11
    cout<<::a<<endl;      //这里的通过作用域分辨符来标识全局变量 a=1
    return 0;
}

如何通过作用域分辨符来引用命名空间中的变量呢?

#include<iostream>
using namespace std;

namespace A{
    int a=1;
    void print();
]

//在命名空间中申明函数 ,在命名空间外定义函数
//需要注意的是 C++不能在main函数中定义函数(即不能嵌套定义)  而c可以在main中定义函数  

void A::print(){
    cout<<"Hellow!"<<endl;
}

int main(){
    cout<<A::a<<endl;
    return 0;
}

命名空间的嵌套 :在命名空间中嵌套命名空间 只需要通过作用域分辨符一层一层的引用就行

#include<iostream>
using namespace std;
namespace A{
    int aa=1;
    namespace B{
       int bb=2;
    }
}

int main(){
    
    cout<<A::aa<<endl;
    cout<<A::B::bb<<endl;

    return 0;
}

由于每次都要使用 命名空间+作用域标识符 来引用命名空间的变量 稍显的复杂,

这时using语法的作用就体现出来了    using namespace 命名空间名;

using语句的作用域是在它的下方。   使用using语句后就可以直接使用命名空间中的变量。

例如上述代码中定义

using namespace A;

cout<<aa<<endl;                 //就可以直接输出aa的值

cout<<B::bb<<endl;            //对于嵌套也是可以省略A的命名空间

using namespace A::B;      //对嵌套的命名空间定义using   

cout << bb<<endll                

注意:using 语法定义的时候要避免二义性的出现,如下图 A ,B中都有a这个变量 ,且对AB都using定义时  再去直接使用变量a   编译器会不知道去选择哪个a而报错

namespace A{
     int a=1;       

}

namespace B{
     int a=2;
}
using namespace A;
using namespace B;

using namespace std;

C++程序开头 一般情况都会包含命名空间 using namespace std;

std是标准库的命名空间 ,不加std的话,要是程序用到标准库里的东西 需要加上 std::前缀

例如 std::cout     std::cin

2.C++输入输出

cout<< 输出      cin>>输入    C++中 默认把 回车换行符 或者 空格 当作输入的间隔符 

我们来看下面这段代码 如果我们输入”i Love you“  程序运行的结果将会输出 i 和 L 并且不需要二次输入.

#include <iostream>
int main(){

    char str[10]
    cin >> str;
    cout << str;
    char c = 0;
    cin >> c;
    cout << c;
    return 0;
}

因为第一次输入读取了 "i" 之后 遇到空格 程序就认为第一次输入结束,而 第二次输入,程序接着从缓冲区中读取数据 自动跳过空格读取到 “L”   。

这就是缓冲区残留所造成的影响。 要避免这种情况也很容易 ,在接受下一个字符时清空缓冲区就行了 可以加 while( getchar() != "\n"); 来清空缓冲区  或者  fflush( stdin )   setbuf( stdin, NULL)两种库函数来清空缓冲区。  

注:若要输入带空格的字符串 也可以通过 cin.getline(str,10) 来输入 对应通过cout.write(str,10)来输出。

3.C++新增数据类型

(1).bool类型 :

  • 占用内存是一个字节

  • 计算机非零表示成立,只有0或者指针空表示不成立

  • 一般充当函数返回值,或者开关

  • 正常输出是0和1

  • C++专有的赋值方式,false和true

(可以通过 cout<<boolalpha<<boolNum   的方式已true或false的方式来打印boolNum)

(2).指针类型:

C++中空指针不再指向NULL  而是指向 nullptr

(3).引用类型

  • 理解为起别名

  • 基本引用

  • //类型名& 别名 = 需要起别名的变量
    int a=1;
    int& aa=a;    //aa就是a 相当于给a起了个别名

    可以将 类型名& 看作一个新的类型  如 int& 可以看作 int& 类型

  • 常引用、右值引用

        第一种写法---右值引用

//类型名&& 别名=右值
int&& a=1;   //1就是a ,a就是1

        第二种写法--常引用

//通过const修饰 来引用常量
const int& a=1;

  • 引用一般用在哪些地方?

       1. 函数参数(防止拷贝产生)

#include <iostream>
using namespace std;
void test(int& aa){      //参数传递是值传递 所以 int& aa=a;
    aa=11;               //这里的aa就相当于实参a ,改变aa的值,a也会改变
    cout <<a<<endl;
}

int main(){
    int a=1;
    test(a);        //可以不通过指针就改变实参a的值
    return 0;
}

值得注意的是,当引用类型作为函数的形参时 要关注 常引用 和 右值引用的区别  如下

#include <iostream>
using namespace std;

//常引用
void test1(const int& a){
    a+=11;                //无法修改a的值  这样写直接报错
    cout << a << endl;
}

//右值引用
void test2(int&& a){
    a+=11;            //可以修改a的值,但不是真的修改常量区a的值 相当于复制了a的值到栈区再修改
    cout << a << endl;
}

int main(){
    test1(11);
    test2(11);
    return 0;
}

常引用作为函数参数时   可以传递常量 但不能修改常量的值

而右值引用作为函数参数时  可以传递常量 也能够修改值,但修改的并不是常量区的值 ,可以理解为从常量区拷贝了一份相同的到栈区,然后做值的操作。

       2. 函数返回值(增加右值使用)

        引用类型也可以作为函数的返回值

#include <iostream>
using namespace std;
int num=10;

//基本变量作为返回值
int test1(){    
    return num;
}

//引用变量作为返回值
int& test2(){
   return num;
}

int main(){
    

    test1()=100;   //不行 返回的是个值 即右值 不能再被赋值
    test2()=100;   //可以 引用类型的返回值相 当于引用类型本身 即 test2() 相当于num的引用类型
    return 0;
}

要注意引用类型返回值的性质  这里的 int& 返回值是个左值 可以被二次修改

而 int 的返回值不能被二次修改 他就是个常量 。

特别注意: 函数返回值(增加右值使用)  --不能返回函数中局部变量的引用  类似于C中不能返回函数中局部变量的地址。

Auto --- 自动识别变量类型

C++中的auto和C中的auto不一样,C++中淘汰了C语言用法,只有自动推断用法。根据变量被赋值的类型来推断变量的类型。

注意:auto不能直接定义变量  必须要初始化变量时才能用 没有赋值的变量 就没办法推断类型

4.C++函数思想

  • 内敛思想 inline关键字

    • 什么样的函数可以成为inline,短小精悍

    • 在结构体中或者类种实现的函数默认内敛(知道即可)

  • 函数重载: C++允许同名不同参数函数存在

    • 参数数目不同

    • 参数类型不同

    • 参数顺序不同(一定建立在不同类型的基础上)

  • 函数缺省: C++中允许给函数形参初始化

    • 缺省顺序 必须从右往左缺省,缺省的参数中间不能存在没有缺省的

    • 没有参入参数,使用的是默认值

      #include <iostream>
      using namespace std;
      inline int  Max(int a, int b) 
      {
      	return a > b ? a : b;
      }
      void print(int a) 
      {
      	cout << a << endl;
      }
      void print(int a, int b) 
      {
      	cout << a + b << endl;
      }
      //和上面不是顺序不同
      //void print(int b, int a) 
      //{
      //	cout << a + b << endl;
      //}
      void print(int a, char b) 
      {
      	cout << "int,char" << endl;
      	cout << a + b << endl;
      }
      void print(char a, int b)
      {
      	cout << a + b << endl;
      }
      //函数缺省
      void printData(int a=1, int b=2, int c=3, int d=4) 
      {
      	cout << a + b + c + d << endl;
      }
      int main() 
      {
      	print(1, 'A');		//重载调用,优先调用类型一致
      	//可以理解为: 缺省其实是重载的一种综合写法
      	printData();			  //a=1 b=2 c=3 d=4
      	printData(10);			  //a=10 b=2 c=3 d=4
      	printData(10, 20);		  //a=10 b=20 c=3 d=4
      	printData(10, 20, 30);	  //a=10 b=20 c=30 d=4	
      	printData(10, 20, 30, 40);//a=10 b=20 c=3 d=40
      	return 0;
      }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const char* Haab_month_name[] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"}; int Tzolkin_day_number[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7}; const char *Tzolkin_day_name[] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; struct Date { int day; int month; int year; }; // 把哈布历转换成天数 int haab_to_days(int day, const char* month, int year) { int total_days = day + (year * 365); int month_index; for (month_index = 0; month_index < 19; ++month_index) { if (strcmp(Haab_month_name[month_index], month) == 0) { break; } } total_days += month_index * 20; return total_days; } // 把天数转换成托尔金历 void days_to_tzolkin(int total_days, int* day_number, const char** day_name) { int tzolkin_day_count = total_days % 13; int tzolkin_day_index = tzolkin_day_count - 1; if (tzolkin_day_index < 0) tzolkin_day_index = 12; int tzolkin_day_number = Tzolkin_day_number[tzolkin_day_index]; const char *tzolkin_day_name = Tzolkin_day_name[(total_days % 20)]; *day_number = tzolkin_day_number; *day_name = tzolkin_day_name; } int main() { int N; cin >> N; cout << N << endl; for (int i = 0; i < N; ++i) { Date date; char dot; scanf("%d%c%d%s%d", &date.day, &dot, &date.month, Haab_month_name, &date.year); int total_days = haab_to_days(date.day, Haab_month_name, date.year); int tzolkin_day_number; const char *tzolkin_day_name; days_to_tzolkin(total_days, &tzolkin_day_number, &tzolkin_day_name); printf("%d %s %d\n", tzolkin_day_number, tzolkin_day_name, date.year); } return 0; }
06-06
这是一个使用 C++ 编写的程序,用于将 Maya 文化中的哈布历转换为托尔金历。程序主要包括以下几个部分: 1. 头文件和命名空间声明 ``` #include <iostream> #include <cstdio> #include <cstring> using namespace std; ``` 2. 定义哈布月份和托尔金日期的名称和数字 ``` const char* Haab_month_name[] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"}; int Tzolkin_day_number[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7}; const char *Tzolkin_day_name[] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; ``` 3. 定义一个日期结构体 ``` struct Date { int day; int month; int year; }; ``` 4. 把哈布历转换成天数 ``` int haab_to_days(int day, const char* month, int year) { int total_days = day + (year * 365); int month_index; for (month_index = 0; month_index < 19; ++month_index) { if (strcmp(Haab_month_name[month_index], month) == 0) { break; } } total_days += month_index * 20; return total_days; } ``` 5. 把天数转换成托尔金历 ``` void days_to_tzolkin(int total_days, int* day_number, const char** day_name) { int tzolkin_day_count = total_days % 13; int tzolkin_day_index = tzolkin_day_count - 1; if (tzolkin_day_index < 0) tzolkin_day_index = 12; int tzolkin_day_number = Tzolkin_day_number[tzolkin_day_index]; const char *tzolkin_day_name = Tzolkin_day_name[(total_days % 20)]; *day_number = tzolkin_day_number; *day_name = tzolkin_day_name; } ``` 6. 主函数,用于读取输入、调用转换函数、并输出结果 ``` int main() { int N; cin >> N; cout << N << endl; for (int i = 0; i < N; ++i) { Date date; char dot; scanf("%d%c%d%s%d", &date.day, &dot, &date.month, Haab_month_name, &date.year); int total_days = haab_to_days(date.day, Haab_month_name, date.year); int tzolkin_day_number; const char *tzolkin_day_name; days_to_tzolkin(total_days, &tzolkin_day_number, &tzolkin_day_name); printf("%d %s %d\n", tzolkin_day_number, tzolkin_day_name, date.year); } return 0; } ``` 以上就是这个程序的主要内容和流程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值