(C++学习系列)第一集.输入和输出

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主要是两种用法:

  1. 第一种cin.getline(arr, n),从输入流中取n个字符给数组arr中
  2. 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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值