1.从一个小程序开始说起
使用C语言写一个小程序,可以将数组中的元素进行求和并输出
第一种方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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("和的结果为%d\n", addArray(data, size));
return 0;
}
int addArray(int array[], int n)
{
int sum = 0;
int i;
for(i = 0; i < n; ++i)
{
sum += array[i];
}
return sum;
}
第二种方法:使用指针解引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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("和的结果为%d\n", addArray(data, size));
return 0;
}
int addArray(int *array, int n)
{
int sum = 0;
int i;
for(i = 0; i < n; ++i)
{
sum += *array++;/*这里就是(*array)++*/
}
return sum;
}
2.从另一个小程序开始说起
输入整数和随意的空格,然后把整数加在一起进行输出:
第一种C语言:
需要注意的点是getchar是取一个字符,如果取到了空格,就继续向下取,直到取到正常内容,如果是一个整数334,它会取到第一个字符3,然后跳出这个取字符循环,这个时候就需要ungetc重新把3这个字符放回输入流,不然取整数的时候就只能取34,因为第一个3被取走了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i;
int sum = 0;
char ch;
printf("请输入一串整数和任意数目的空格:");
while(scanf("%d", &i) == 1)/*说明输入是正常的整数*/
{
sum += i;
/*getchar是取键入缓存区的一个字符,一次取一个,取了之后赋值给ch,判断等不等于空格*/
while ((ch = getchar()) == ' ')/*屏蔽空格,当接受到空格的时候,不做任何事情*/
;
if(ch == '\n')
{
break;
}
/*ungetc将字符放回输入流中,将变量ch中存放的字符退回stdin(输入流),如果不放回,ch通过getchar()把数字取走了,整数肯定是有问题的,比如33被取走了一个3*/
ungetc(ch , stdin);
}
printf("结果是%d", sum);
printf("\n");
return 0;
}
第二种是C++:
其中cin.peek() 是指从输入流中观察下一个字符是什么,如果是空格,就用get取走它,get取走后会从输入流中删除这个字符,并返回这个字符(即如果ch = cin.get(),ch就是这个取走的字符)。
#include<iostream>
using namespace std;
int main()
{
int i;
int sum = 0;
char ch;
cout << "请输入一串整数和任意数目的空格:" << endl;
while(cin >> i)/*输入正确时,输入3.14,其中点未被加判断。所以会返回错误直接退出循环*/
{
sum += i;
while (cin.peek() == ' ')/*peek从输入流中读取一个下一个字符,是用来看下一个字符是啥,如果是空格就直接取走*/
{
cin.get();/*从输入流中读取下一个字符并且从输入流中删除。相当于pop,如果设定a=cin.get(),a就是被取出的字符*/
}
if(cin.peek() == '\n')/*如果没有这部,就会一直让你输入,enter也相当于一个字符啦,被读取到缓冲区*/
{
break;
}
}
cout << "结果是:" << sum << endl;/*会自己换行*/
return 0;
/*如果直接enter,就会一直让你输入,除非直接输入\n*/
}
3.通过程序总结cin和cout的各种用法
第一个程序:
这里cin.ignore()是指需要忽略多少个字符后再将输入的字符放入输入流,如cin.ignore(7)是指你输入的前七个字符都是无效字符,并不记录进入cin中。还有一种是cin.ignore(100,'\n')忽略一百个字符或者遇到'\n'会停止继续忽略(当然这个\n还是被忽略了)
getline主要是两种用法:
- 第一种cin.getline(arr, n),从输入流中取n个字符给数组arr中
- getline(cin,string)。从把输入流中的字符放入字符串string中(C++中有新的数据类型字符串,可以直接string进行定义)
#include <iostream>
using namespace std;
int main()
{
char buf[20];
cin.ignore(7);/*忽略输入的前七个字符*/
/*getline读多个字符*/
cin.getline(buf, 10);/*忽略输入的7个字符以后;从第八个开始获取9个字符到buf中,空格也算一个字符因为以\0为结尾,所以出来九个字符*/
cout << buf << endl;
return 0;
}
第二个程序:
get()是一次取一个字符哦(看以下代码):
#include <iostream>
using namespace std;
int main()
{
char p;
cout << "请输入文本" << endl;
while(cin.peek() != '\n')/*不为回车,就一直取字符并输出字符,为回车就会退出循环*/
{
p = cin.get();
cout << p;
}
cout << endl;
return 0;
}
第三个程序:
const int SIZE和#define SIZE功能一样
cin.read(arr,n)指读多少个字符到数组中
cin.gcount()是你此次读取了多少个字符
cout.write(arr,n)从arr中取前20个字符进行输出
#include <iostream>
using namespace std;
int main()
{
const int SIZE = 50; /*相当于宏定义*/
char buf[SIZE];
cout << "请输入一段文本:";
cin.read(buf, 20);/*read算读多少个字符,这里buf数组只读20个*/
/*gcount()返回的是你读取多少个数字*/
cout << "字符串收集到的字符数为" << cin.gcount() << endl;
cout << "输入的文本信息为:";
cout.write(buf, 20);/*只输出20个*/
cout << endl;
return 0;
}
第四个程序:
cout.precision(i)指保留i位有效数组进行输出,且不是一次性的,是针对后面每一次输出,需要四舍五入,为0的时候是原值(四舍五入后)
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
/*cin遇到空格会结束读取!*/
double result = sqrt(3.0);
cout << "对3开方保留有效位数1到9位,结果如下:\n" << result << endl;
for(int i = 0; i <= 9; ++i)
{
cout.precision(i);/*为0的时候就是原来的值,需要四舍五入的,有效数字都需要四舍五入*/
cout << result << endl;
}
/*cout.precision()返回的是当前的精度,加了参数即每次输出保留小数点后多少位i*/
cout << "当前的精度为" << cout.precision() << endl;
return 0;
}
第五个程序:
这个需要结合输出看
#include <iostream>
using namespace std;
int main()
{
int width = 4;
char str[20];
cout << "请输入 一段文本\n";
/*cin.width(5)设置输入的域宽为5由于存在最后一个字符是空字符,所以一次只读4个字符*/
cin.width(5);/*实际只能提取4个字符,str最后一个是空字符,其他的放在流中等待接受。 */
/*cin在读入一个字符串时,不能根据字符数组的长度自动读入字符,如果用户输入过多的字符,
超过了字符数组的长度,cin会将多余字符存储到该数组的后面,这就有可能覆盖其他变量。
如果我们为其指定了输入域宽,就可解决这一问题。*/
/*如果所需的宽度比设置的域宽小,空位用填充字符填充。
如果显示数据所需的宽度比设置的域宽大,系统输出所有位。
域宽设置仅对下一行流读入或流插入操作有效,在一次操作完后被置0。*/
/*每次输入4个或者遇到空格会自动停止读入就会进入循环*/
while (cin >> str)/*指定的狱宽一次最多读取多少,然后下一次读取就会覆盖掉,从str[0]开始读*/
{
/*首先是4个字符输出,然后输出的域宽加1,输出的因为一次只能接收4个,但是输出的变多,所以在开头补空格*/
cout.width(width++);
cout << str << endl;
cin.width(5);/*每次都需要设置一次,因为只对下一次有效。设置接收4个字符*/
}
return 0;
}
域宽只对下一次输出或者输入有效,这里对于cin.width(i),只能每次取i-1个字符(还有一个\0)。
输出域宽大于输入流中取的数,就会在前面补\0,所以会空格,这是为了防止数组越界。设定一次最多接收多少个,这里cin >> str,存入str里面,每一次都会进行覆盖,从str[0]开始进入
注意点:cin遇到空格或者回车会自动结束读取,所以读一行字符串用getline
4.重载机制
函数重载机制非常厉害,将语言的灵活性体现的淋漓尽致
函数重载的实质就是用同样的名字再定义一个有着不同参数,但有同样用途或者不同的函数
可以是参数类型的不同,也可以是参数个数的不同
可以简化处理工作
重载函数不要太多,不然程序可能看不懂
不可以通过不同的返回值进行重载
温度转换器:运用了函数的重载,通过参数的不同进行
/*函数的重载*/
/*函数重载机制非常厉害,将语言的灵活性体现的淋漓尽致*/
/*函数重载的实质就是用同样的名字再定义一个有着不同参数,但有同样用途或者不同的函数*/
/*可以是参数类型的不同,也可以是参数个数的不同*/
/*可以简化处理工作*/
/*重载函数不要太多,不然程序可能看不懂*/
/*不可以通过不同的返回值进行重载*/
#include<iostream>
using namespace std;
//不要忘记函数重载需要在前面,声明!!!一定要声明啊!
void convertTemperature( double tempin, char typein);/*原来函数*/
void convertTemperature( int tempin, char typein);/*重载函数*/
int main()
{
double tempin;
char typein;
int tempinint;
cout<<"请以【xx.x C】或者【xx.x F】格式输入一个温度:";
cin >> tempin >> typein;
cin.ignore(100,'\n');
cout<<"\n";
convertTemperature( tempin,typein );
cout<<"请以【xx C】或者【xx F】格式输入一个温度:";
cin >> tempinint >> typein;
cin.ignore(100,'\n');
cout<<"\n";
convertTemperature( tempinint,typein );/*整型输入*/
return 0;
}
void convertTemperature( double tempin, char typein)
{
//华氏温度=摄氏温度*9.0/5.0+32
const unsigned short ADD_SUBTRACT = 32;
const double RADIO = 9.0/5.0;
double tempout;
char typeout;
switch( typein )
{
case 'c' :
case 'C' :
tempout=tempin * RADIO+ADD_SUBTRACT;
typein = 'C';
typeout = 'F';
break;
case 'F' :
case 'f' :
tempout = (tempin - ADD_SUBTRACT)/RADIO;
typein = 'F';
typeout = 'C';
break;
default:
typeout='E';
}
if (typeout!='E')
{
cout<<tempin <<typein <<"="<<tempout<<typeout<<"\n\n";
}
else
{
cout<<"输入格式错误!!!"<<"\n";
}
cout<<"请输入任意字符结束程序";
cin.get();
}
void convertTemperature( int tempin, char typein)
{
//华氏温度=摄氏温度*9.0/5.0+32
const unsigned short ADD_SUBTRACT = 32;
const double RADIO = 9.0/5.0;
int tempout;/*改成整形*/
char typeout;
switch( typein )
{
case 'c' :
case 'C' :
tempout=tempin * RADIO+ADD_SUBTRACT;
typein = 'C';
typeout = 'F';
break;
case 'F' :
case 'f' :
tempout = (tempin - ADD_SUBTRACT)/RADIO;
typein = 'F';
typeout = 'C';
break;
default:
typeout='E';
}
if (typeout!='E')
{
cout<<tempin <<typein <<"="<<tempout<<typeout<<"\n\n";
}
else
{
cout<<"输入格式错误!!!"<<"\n";
}
cout<<"请输入任意字符结束程序";
cin.get();
}
求输入的值的和以及平均数:
#include <iostream>
using namespace std;
const int n = 10;/*静态变量*/
int main()
{
int a[10], sum;
sum = 0;//临时变量,存储在栈中,务必初始化
cout << "请输入" << n << "个数." << "\n\n";
for (int i = 0; i < n; i++)
{
cout << "第" << i+1 << "个数为:";
while (! (cin >> a[i]) )//对输入错误进行检验,如果输入不是整数就会进入循环
{
cin.clear();//清空输入缓冲区,清除错误的输入,不然会陷入死循环,因为cin区一直有一个值
cin.ignore(100,'\n');//忽略100个字符,除非遇到'\n'
cout << "请输入一个合法的值:";/*下一步到了循环cin部分,这里需要输入,赋予cin一个新的值,然后进入循化,正确就退出循环*/
}
sum += a[i];
}
cout << "Sum is " << sum << " And average is " << (float) sum / 10 << "\n\n";
system("pause");/**/
return 0;
}
/*数组,优点在于可以把许多个同类型的值储存在同一个变量名之下,注意是同一个类型*/
/*C++提供了更好的string类型,字符串类型,贼好用*/
/*任务1:定义一个数组容纳10个整数,整数来自于用户输入,我们计算这些值的累加和,平均值并输出*/
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int a[10];
float avr;
cout << "依次输入10个整数";/*空格隔开,cin读到空格会结束,然后下一个循环读空格后下一个数*/
for(int i = 0; i < 10; ++i)
{
cin >> a[i];
sum += a[i];
}
avr = sum / 10;
cout << "数组里整数的和为:" << sum << '\n'
<< "数组里所有数的平均值为" << avr << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
string str;
cout << "请输入字符串:";
/*发现str接收到空格就结束了,所以我们需要用getline*/
getline(cin, str);/*把输入流放到str里,可以读到空格*/
cout << str << endl;
}