有关cpp的一些笔记(杂)

首先…cpp书写文件结束流的几种方法

//这三种方法效果上是一样的
while(scanf("%d",&n),n,m)
while(scanf("%d",&n)!=EOF) //EOF为文件结束流 返回值为-1
while(~scanf("%d",&n))

第二呢,结构体的定义方法以及排序

#include<bits/stdc++.h>
using namespace std;

//开始使用struct关键字定义结构体
//结构体名为qwq 由编号num和姓名name构成
struct  qwq
{
    int num;
    char name[20];
};
//定义一个qwq型的结构体数组a
//每个元素中都含有一对编号和姓名
qwq a[105];

//编写排序函数 以编号升序排序
bool paixu(qwq a,qwq b)
{
    return a.num<b.num;
}
int main()
{
    for(int i=1;i<=3;i++)
    {
        //依次输入三组数据的编号和姓名
        //注意用%s输入字符数组时 不必加取地址符
        scanf("%d",&a[i].num);
        scanf("%s",a[i].name);
    }

    //排序 输出
    sort(a+1,a+4,paixu);
    for(int i=1;i<=3;i++)
    {
        printf("%d ",a[i].num);
        printf("%s\n",a[i].name);
    }
    return 0;
}

运行结果:

100 xiaoming
54 lixue
78 bai
54 lixue
78 bai
100 xiaoming

sort函数提一下。

 sort其实是对指定的一个区间进行排序 默认是两个参数 升序。

需要其他的排序还需要加入第三个参数-- 自定的排序函数。


比如上面的例子,数组名为a a即是a[0],a+1即是a[1]。

//sort(排序开始位置,排序开始位置+要排序的个数,第三个参数(可省略)); 

我要从a[1]开始排序 一直排三个数字  所以写成 sotr(a+1,a+1+3)的形式

关于自定排序函数:

//返回值为bool型 传入两个参数a b, return的是a>b则是降序,a<b则是升序
//可以配合条件语句实现高级排序

第三点,是几个小技巧。

输入带空格的字符串的三种方法

char qwq[105];
scanf("%[^\n]",qwq); 
char qwq[105];
gets(qwq);
//有一点需要注意 只要程序中出现了gets(); 或者 scanf("%[^\n]",qwq);

//再出现cin scanf时后边必须用一个getchar()来读取回车 否则会读取错误
这个似乎不太好用qwq
//可以用cin.get(字符数组名,接受字符的数量)来接收一行字符串 包括空格
char qwq[105];
//接收20个字符 包括空格在内
cin.get(qwq,20);

取整:

使用floor函数。floor(x)返回的是小于或等于x的最大整数。
如:     floor(10.5) == 10    floor(-10.5) == -11
使用ceil函数。ceil(x)返回的是大于x的最小整数。
如:     ceil(10.5) == 11    ceil(-10.5) ==-10

使用round函数。四舍五入取整

使用(int)n 仅保留整数部分 无论正负

最后附上冒泡排序和选择排序的模板

    int a[5]={5,4,9,8,6};
    int temp,len=5; //也可以写成len=sizeof(a)/sizeof(a[0]);
    //开始冒泡排序
    for(int i = 0; i < len-1; i++)//外层循环控制比较几轮
    {
        for(int j = 0; j < len-1-i ; j++)//内层循环控制每轮比较的次数
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    for(int i=0;i<5;i++)
    printf("%d ",a[i]);

#include<bits/stdc++.h>
using namespace std;
//开始选择排序
void rank(int arr[], int len)
{
    int i = 0;
    int j = 0;
    int temp = 0;
    for (i = 0; i < len-1; i++)
    {
        for (j =i+1; j < len; j++)
        {
            if (arr[i]>arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}
int main()
{
    int array[9] = { 9, 8, 7, 4, 16, 5, 6, 3, 1 };
    //这里求数组中元素数量 用总大小除以单个元素的大小
    int len = sizeof(array) / sizeof(array[0]);
    int i = 0;
    rank(array, len);
    for (i = 0; i < len; i++)
    {
        printf("%d ", array[i]);
    }
    return 0;
}

哦对了,顺便提一句,char数组用scanf输入时才能用strlen()函数计算大小,代码如下:

    char qwq[105];
    scanf("%s",qwq);
    cout<<strlen(qwq);
//用for循环挨个赋值不能用这个办法啦。。

执行结果如下:

liuyang
7

来看看另一种吧:

    char qwq[105];
    scanf("%s",qwq);
    cout<<sizeof(qwq)/sizeof(qwq[0]); //上面选择排序模板中有说明

执行结果如下:

liuyang
105

这种数组整体长度除以某个元素长度的方法得出的永远是数组的总长度 而不管他是不是空的0.0

当然strlen()只能用于char型 但这种方法可以用与int之类的数组qwq




猜你喜欢

转载自blog.csdn.net/qq_16657927/article/details/79801273