一.对一个整型数组求和
定义一个存储着n个元素的数组
1.C语言
#include<stdio.h>
//int addArray(int array[], int n)
int addArray(int *array, int n);
int main()
{
int data[] = { 0,1,2,3,4,5,6,7,8,9 };
int size = sizeof(data) / sizeof(data[0]);
printf("data%d\n", sizeof(data));
printf("结果是:%d\n", addArray(data, size));
return 0;
}
//int addArray(int array[], int n)
int addArray(int *array, int n)
{
int sum = 0;
int i = 0;
printf("array%d\n", sizeof(array));
for (i = 0;i < n;i++)
{
sum += array[i];
}
return sum;
}
2.C++
#include<iostream>
using namespace std;
int addArray(int* array, int n);
int main()
{
int data[] = { 0,1,2,3,4,5,6,7,8,9 };
int size = sizeof(data) / sizeof(data[0]);
cout << "结果是:" << addArray(data, size) << endl;
return 0;
}
int addArray(int* array, int n)
{
int sum = 0;
int i = 0;
for (i = 0;i < n;i++)
{
sum += array[i];
}
return sum;
}
仔细观察两者有很大一部分相同,但还是有不一样的地方,我们接下来就对不一样的地方进行一些探讨
第一,using namespace std C++里面出现了这一段代码,而在C语言里是没有的,我们称它为名字空间或命名空间,通过查询我了解到命名空间的作用。在C语言里只有一个全局作用域,标识符之间是有可能发生冲突的。而在C++里面,我们通过命名空间将全局作用域分成不同的部分,不同命名空间里的标识符是可以相同的。
第二,cout << "结果是:" << addArray(data, size) << endl这句代码,
与C语言里printf("结果是:%d\n", addArray(data, size))类似
<1>首先我们看cout,cout是一个输出流对象 ,是“console out(控制台输出)”的缩写。 是属于basic_ostream类的对象。而ostream类在iostream头文件中定义,所以我们这段代码,引用了头文件#include<iostream>。这里又是一个不同,C++里面的头文件并没有.h。
<2>接下来是<<,我们学习C语言的时候学到过<<和>>是左移操作符和右移操作符,在C++里他们也是,只不过他们发生了重载
体现C++一个很大的特性:支持重载,就是允许我们按照不同的方式使用同一个操作符
<3>endl是end line的意思,结束此行, 也是属于basic_ostream类的对象。加上他会换行,并且清除缓冲区内容。
二.输入一串整数和空格,实现屏蔽空格后,整数相加
1.C语言
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
int i = 0;
int sum = 0;
char ch = 0;
printf("请输入一串整数和任意数目的空格:");
while (scanf("%d", &i) == 1)
{
sum += i;
while ((ch = getchar()) == ' ');//屏蔽空格
if (ch == '\n')
{
break;
}
ungetc(ch, stdin);//将变量ch中存放的字符退回给,stdin输入流
}
printf("结果是:%d", sum);
printf("\n");
system("pause");
return 0;
}
这段C语言代码里有一句我以前没有见过,ungetc(ch, stdin)此语句用于把getchar从输入流取出的字符放回输入流,以便下次其他操作从输入流中得到字符时不会出现混淆和取错
如果没有这一句代码,本身计算出来的值就会是一个错误的值
2.C++
#include<iostream>
using namespace std;
int main()
{
int sum = 0;
cout << "请输入一串整数和任意数目的空格:";
int i;
while (cin >> i)
{
sum += i;
while (cin.peek() == ' ')
{
cin.get();
}
if (cin.peek() == '\n')
{
break;
}
}
cout << "结果是:" << sum << endl;
return 0;
}
观察两者代码
第一,在C++里面出现了cin>>i,流对象cin 对象的类型是istream ,basic_istream,它知道如何从用户终端读取数据
cin输入操作符又称为提取操作符,它一次从输入流对象cin提取一个整数
<<这个操作符对所有内建的数据类型都进行了重载,所以可以从输入流对象提取处int,float,double型数据,也可以字符串等数据
表达式cin>>i返回输入流本身,也就是cin, 但是,如果到达了文件尾或者提取操作符遇到一个非法值,这个返回值将是false
第二,cin.peek(),其返回值是一个当前指针指向的char型字符,但是只是观测,指针不移动
cin.get(),解释它,本身要提起cin,cin的输入遇到空格的时候会结束,而在这里,cin.get(无字符)的作用是舍弃输入流不需要的字符空格。
int main()
{
char p;
cout << "请输入一段文本:\n";
while (cin.peek() != '\n')//观测一个字符
{
cout << (p = cin.get());//输出字符
}
cout << endl;
return 0;
}
而在上面的代码里,p=cin.get()相当于cin.get(p),cin.get(字符变量名),可以用来接收字符
还有一种用法是接收字符数组
int main()
{
char arr[10];
cin.get(arr,10);
cout<<arr<<endl;
return 0;
}
比如输入abcdefghigk,就会输出abcdefghi(九个字符)和一个\0(终止符)
三.一些扩展
1.cin.ignore() & cin.getline()
int main()
{
char buf[20];
cin.ignore(7);//忽略七个字符
cin.getline(buf, 10);//获取十个
cout << buf << endl;
return 0;
}
cin.ignore(7)的作用是忽略七个字符,也就是输出的时候从第八个字符开始
cin.getline(buf,10),也就是从buf里面获取十个字符
通过查询了解,cin.getline(字符数组名,字符个数,结束字符)
如果在上面代码里,输入abcdefghi
cin.getline(buf,5,f) 结果为abcd,第五位是\0
cin.getline(buf,5,b) 结果为ab
2.cin.gcount() & cin.read()&cout.write()
int main()
{
const int SIZE = 50;
char buf[SIZE];
cout << "请输入一段文本:";
cin.read(buf, 20);//读取20个字节
cout << "字符串收集到的字符数为:"
<< cin.gcount() << endl;//计算提取的字符
cout << "输入的文本信息是:";
cout.write(buf, 20);//从缓冲区输出二十个字符
cout << endl;
return 0;
}
cin.read(buf, 20),是提取20个字节
cin.gcount()计算提取的字符数
cout.write(buf, 20)从缓冲区输出20个字符,如果为cout.write(buf,5),输入abcdef,输出abcde五个字符
3.cout.precision() & cout.width()和cin.width
#include<iostream>
using namespace std;
#include<math.h>
int main()
{
double result = sqrt(3.0);
cout << "对3开放保留小数点后0~9位,结果如下:\n" << endl;
for (int i = 0;i <= 9;i++)
{
cout.precision(i);
cout << result << endl;
}
cout << "当前的输出精度为:" << cout.precision() << endl;
return 0;
}
sqrt()函数是用来求给定值的平方根,这里需要引用头文件#include<math.h>
函数原型是double sqrts(double x);
cout.precision()是输出流cout的格式控制函数,cout.precision(数字)里面的数字控制精度
cout.precision()返回当前浮点数的精度值
int main()
{
int width = 4;
char str[20];
cout << "请输入一段文本:\n";
cin.width(5);
while (cin >> str)
{
cout.width(width++);
cout << str << endl;
cin.width(5);
}
return 0;
}
cin.width(5)将字符串全部读取,输出四个字符和一个\0,遇见空格视为结束
cout.width(5)输出四个字符和一个\0,右对齐,遇见空格视为结束