C语言上课笔记(1)

/*块注释不允许嵌套使用*/

良好的编程风格:
良好的注释,整齐的缩进,适当的空行,适当位置的空格,每行最多只有一个语句。

算法的特征:
有穷性,确切性,可行性,一个算法有零个或多个输入、输出。

b,B,KB,MB,GB,TB,

一个字节有多大?
8位二进制,256个数

变量:内存中一块连续的内存空间

数据类型
int a=3;
int a;//a不确定是几。随机。是这块空间上一次的值
按下删除键,空间被释放,但是并没有被破坏或覆盖,所以cgx并不是真正的删除

变量名:
由字母,数字,下划线组成,不能以字母开头,不能以关键词命名
不用printf函数的时候可以用printf做变量名??!!!。。。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
C语言:
VS系列:在一个代码段中,变量的定义语句必须放在执行语句之前。。(还好我是CB。)
不过cpp事儿就没那么多了

初始化:分配内存的同时指定一个初始值,如int a=3;

在这里插入图片描述
数据类型介绍:
在这里插入图片描述
在这里插入图片描述
负数是以补码的形式存储
计算过程分析:
在这里插入图片描述
64-12=
64-12+99+1-100=
64-12+99+1=
64+(99-12)反码+1(补码)。。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据的溢出:
在这里插入图片描述

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
在这里插入图片描述
在这里插入图片描述
\n换行
\r回车
字符型是最小的整型
char型的数据在内存中保存的是字母的ASCII码
(美国信息交换标准代码)
大小写字母转换:
小写字母+(‘A’-‘a’)=大写字母
‘a’+1=‘b’;
十进制小数转二进制:3.25是11.01(整数部分除二取余,小数部分乘二取整)
二进制小数转换为科学计数法:11.01->1.101* 21
浮点数类型无法精确表示数值,
浮点数类型无法精确判等
在这里插入图片描述
原因:尾码无法精确存储,有舍去的部分
保证:|0.1+0.2-0.3|<=0.000001就行了
.
.
.

整形字面值:(默认int)
十进制
十六进制0x…或ox…
八进制0…(数字0开头)
1.3e10就是1.3*10的10次方
转义字符:

'\n','\\','\'','\"',

就是’\n’,’\’,’’’,’"’,
实型字面值,默认是double!!!

float f=3.14;      //可能会警告
这样写:
float f=3.14f;
3.14是double
3.14f是float
555l是long型
555ll是long long型
100u就是unsigned int 

给long long 型赋值最大值:
long long int a=0xffffffffffffffffll

字符型字面值:
‘\ddd’是三位8进制数代表的字符
‘\141’就是97在ascii中代表的字符 小a
‘\xhh’是两位16进制数代表的字符
‘\61’就是97,还是小a的意思
‘\077’可以写成’\77’
在这里插入图片描述
字符串字面值:
字符串在内存中存储时,会在末尾自动添加一个’\0’(结束符,表示字符串结尾)
“abc"就是’a’,‘b’,‘c’,’\0’.
""空字符串:就有一个’\0’
字符串长度:就是\0之前的字符的个数
\0的ascii值就是0
字符串字符个数:实际存储的个数
其中的’\n’为转义字符(换行符),计算字符串长度时只能计作一个字符
一个转义字符总是由反斜杠加其他字符组成的,单独的一个反斜杠不能作为任何合法的字符
当遇到转义字符’\0’时要看其后面是否还有数字,若有,则应将后面的数字(一至二位)与前面的’\0’相结合作为一个字符计入整个字符串的长度
举个例子:
(1) 字符串 “abc\n ”:其中的’\n’为转义字符(换行符),计算字符串长度时只能计作一个字符,所以 该字符串的长度为4 (而不是5)

(2) 字符串 “abc\n\’"" :其中有4个转义字符:’\n’(换行符)、’\’(反斜杠)、’’’(单引号)、’"’(双引号),所以 该字符串的长度为7 (而不是11)。

(3) 字符串 “abc\0xyz” :其中有一个转义字符’\0’,它是字符串结束符,所以,当用函数strlen来测试该字符串的长度时,结果 应该为3 (而不是7)。

(4) 字符串 “abc\0xy” :其中有一个转义字符’\’(反斜杠),这样,后面的字符串“0xy”照样计算,所以, 该字符串的长度为7 (而不是将第二个反斜杠与其后的0结合为一个转义字符’\0’,

若那样的话,第一个反斜杠将无法处理,因为一个转义字符总是由反斜杠加其他字符组成的,单独的一个反斜杠不能作为任何合法的字符)。

(5) 若将字符串“abc\0xy”改为 “abc\\0xy” :则其中有二个转义字符’\’(反斜杠)和’\0’(字符串结束符),这时,当用函数strlen来测试该字符串的长度时,结果 应该为4 (而不是7)。

(6) 若将字符串“abc\\0xy”改为 “abc\\061xy” :则其中有二个转义字符’\’(反斜杠)和 ‘\061’(ASCII码值等于061的字符,也即数字字符’1’) ,这时,当用函数strlen来测试该字符串的长度时, 结果应该为7 (而不是4或9)。所以,当遇到转义字符’\0’时要看其后面是否还有数字,若有,则应将后面的数字(一至二位)与前面的’\0’相结合作为一个字符计入整个字符串的长度。

若用printf(“abc\\061xy”);输出,则输出结果为:abc\1xy
48到57是0到9这些阿拉伯数字,所以,061是8进制,转化成10进制就是1+6*8=49,49就是ASCII的数字1.。。

在这里插入图片描述
在这里插入图片描述
字符串长度是5,字符个数是6
在这里插入图片描述

C语言运算符的优先级
在这里插入图片描述
在这里插入图片描述
%p打印指针

%e是float或double型
在这里插入图片描述

C语言scanf()和gets()及printf()和puts()的区别

1.scanf()
所在头文件:stdio.h
语法:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf(“%s”,字符数组名或指针);
2.gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
1.不同点:
scanf不能接受空格、制表符Tab、回车等;
遇到空格,scanf()就认为输入结束了
而gets能够接受空格、制表符Tab和回车等;
gets()遇到’\n’才认为是结束输入了
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符**,并用’\0’替代 ‘\n’.**回车键不会留在输入缓冲区中

char a[10];
 scanf("%s",a);  
 //从键盘输入字符串 asd df时,遇到空格,scanf()就认为输入结束了,所以a中存放的字符串是 ‘asd\0’。 
 
 char a[10];
 gets(a);
 //从键盘输入字符串 asd df时,gets()遇到’\n’才认为是结束输入了,所以a中存放的是’asd df\0’。
 
 char a[10],b[10];
 char c,d;
 scanf("%s",a);
 printf("a中保存的字符串为:%s\n",a);
  c=getchar();
 //输入asdf回车,因为scanf会将回车保留在缓冲区中,所以回车会紧接着被c取得而不需要再额外输入,所以a中存储的是’asdf\0’,字符c=’\n’。

 gets(b);
 printf("b中保存的字符串为:%s\n",b);
 d=getchar();
 // 接着输入as df回车,因为gets会将’\n’替换成’\0’,所以b字符串中保留的是’as df\0’,并且还是要继续输入d的值: 

二、printf()和puts()的区别
相同点:
两者都属于stdio.h这个头文件
都能输出字符串
不同点:
puts()在输出字符串时会将’\0’自动转换成’\n’进行输出,
也就是说,
puts方法输出完字符串后会自动换行。
两种写法:

char ch=getchar();
相当于
scanf("%c",&ch);

在这里插入图片描述
在这里插入图片描述
输出符号用%+d
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
VS可能会输入有编译问题,在开头加一行

#pragma warning (disable:__);

就行了,__填报错的行数

鸡兔同笼

头a腿b
鸡c=(b-2*a) / 2
兔=a-c

十进制转换成二进制
#include<bits/stdc++.h>
using namespace std;
int han(int a)
{
    if(a==0)
        return 0;
    else
    {
        han(a/2);
        printf("%d",a%2);
    }
}
int main()
{
    int a;
    cin>>a;
    han(a);
    return 0;
}

在这里插入图片描述

取余%的最终符号由左值决定

优先级:算术 > 关系 > 逻辑 > 赋值 > 逗号

算术运算符
赋值运算符
关系运算符
逻辑运算符
条件运算符

位运算符
&位与运算符:将两个数的  补码  按位进行  与运算 
|位或运算符
~位非运算符:按位取反
^位异或运算符: 相同为0,不同为1
<<      //左移,左乘右除
>>

一个数左移1位就是乘2!!!!!!!!!
一个数右移1位就是整除2!!!!!!!
负数位左移就会溢出
异或运算符: 相同为0,不同为1
Int a=0;
a的补码0000 0000 0000 0000 0000 0000 0000 0000
~a就是1111 1111 1111 … 1111是-1的补码

-1的原码1000 0000 … 0000 0001
-1的反码1111 1111 …1111 1110

~a就是-1

交换ab:
三个步骤:
a ^= b; //a’ =a ^ b;
b ^= a; //b’ = b ^ a’=b ^ a ^ b = a
a ^= b; //a’’ = a’ ^ b’

在这里插入图片描述

用C语言switch实现
[80,100]优
[60,80)良
[0,60)差

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a;
    cin>>a;
    int b;
    if(a>=80 && a<=100)
        b=1;
    else if(a>=60 && a<80)
        b=2;
    else
        b=3;
    switch(b)
    {
        case 1:
            cout<<"优";
            break;
        case 2:
            cout<<"良";
            break;
        case 3:
            cout<<"差";
            break;
    }
    return 0;
}

for循环(初始表达式;条件表达式;循环表达式)

中断语句:
break
return 0;
continue;


//求一个数的补码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    
    //if(n==0)
        //cout<<"0000 0000 0000 0000 0000 0000 0000 0000"<<endl;
    //else if(n>0)

        for(int i=31;i>=0;i--)
        {
            int a=n>>i&1;
            cout<<a;
            if(i%4==0)
                cout<<' ';
        }
        cout<<endl;

    /*
    //负数也是这样算,不用分情况
    else
    {
        n=-n;
        n += 1;
        cout<<'1';
        for(int i=30;i>=0;i--)
        {
            int a=n>>i&1;
            cout<<a;
            if(i%4==0)
                cout<<' ';
        }
        cout<<endl;
    }
	*/

    return 0;
}
模板:
//求一个数的补码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=31;i>=0;i--)
    {
        int a=n>>i&1;
        cout<<a;
        if(i%4==0)
            cout<<' ';
    }
    cout<<endl;
    return 0;
}

随机点名系统

#include<bits/stdc++.h>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand(time(0));
    //rand()能随机选一个随机数
    //printf("%d\n",rand()%9+1);//1-9
    //printf("%d\n",rand()%12+1);//1-12
    //return 0;


    //随机出10以内加法题,写程序算分
    int ans=0;
    for(int i=1;i<=10;i++)
    {
        srand(time(0));
        int a=rand()%10;
        int b=rand()%10;
        cout<<a<<" + "<<b<<" = ";
        int s;
        cin>>s;
        if(s==a+b)
            ans += 10;
    }
    cout<<ans;
    return 0;
}

在这里插入图片描述

求最小公倍数:

//最小公倍数
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    int ma=max(a,b);
    for(int i=ma;  ;i++)
    {
        if(i%a==0 && i%b==0)
        {
            cout<<i;
            break;
        }
    }
    //cout<<a;
    return 0;
}

//男神的做法
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,ma;
    cin>>a>>b;
    for(ma=a>b?a:b ;  ma%a!=0 || ma%b!=0; ma++);
    cout<<ma;
    return 0;
}

//用所学知识写程序:123——>321,1200——>21
//题目限制n小于2de31次方-1

/*
//我的思路:
#include<stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    int f=0;//判断0的出现
    for(;;)
    {
        if(a==0)
            break;
        int b=a%10;//取末位
        a /= 10;
        if(b==0)
        {
            if(f==0)//此时的0是a末尾的0,不能输出
                continue;
            else//此时的0不是a末尾的0,要输出
                printf("%d",b);
        }
        else
        {
            f=1;//末尾不是0就标记
            printf("%d",b);
        }
    }
    return 0;
}
*/


//男神的思路:

#include<stdio.h>
int main()
{
    int n;
    long long k=0;//一定要开long long类型
    
    //要不,2147483647反过来,就超过int型的最大范围了
    //如果n到long long 的话,还是用我的方法,按位输出比较好。。
    
    scanf("%d",&n);
    for(;n != 0;n /= 10)
        k=k*10+n%10;
    printf("%lld",k);
    return 0;
}

do-while循环:先执行循环体,再判断条件,循环体至少执行一次

switch语句

一般形式:

switch(表达式){

case 常量表达式1:  语句1;
case 常量表达式2:  语句2;
… 
case 常量表达式n:  语句n;
default:  语句n+1;

}

意思是先计算表达式的值,再逐个和case 后的常量表达式比较,若不等则继续往下比较,若一直不等,则执行default后的语句;若等于某一个常量表达式,则从这个表达式后的语句开始执行,并执行后面 所有 case后的语句。

冒泡排序:

#include<stdio.h>
int main()
{
    int arr[10]={1,3,5,2,4,6,0,9,8,7};
    //冒泡排序
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                int t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
    for(int i=0;i<10;i++)
        printf("%d ",arr[i]);
}

冒泡排序的优化:

#include<stdio.h>
int main()
{
    int arr[10]={1,3,5,2,4,6,0,9,8,7};
    //冒泡排序的优化
    int flag;
    for(int i=0;i<9;i++)
    {
        flag=0;
        for(int j=0;j<9-i;j++)
        {
            //printf("%d %d\n",j,j+1);
            if(arr[j]>arr[j+1])
            {
                flag=1;
                int t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
        if(flag==0)
            break;
    }
    for(int i=0;i<10;i++)
        printf("%d ",arr[i]);
}
1到30随机选择7个不同的数
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    int i,a;
    srand(time(0));
    int I[35]={0};
    for(i=0;i<7;i++)
    {
        a=rand()%30+1;
        if(I[a]==1)
            i--;
        else
        {
            I[a]=1;
            printf("%d ",a);
        }
    }
    return 0;
}

字符串长度:
字符个数:

//字符加密 +3
#include<stdio.h>
int main()
{
    char s[]="wo jiao yan zu";
    for(int i=0;s[i]!='\0';i++)   //注意!!!!!!!'\0'啊
    {
        s[i] += 3;
        printf("%c",s[i]);
    }
    return 0;
}
//大写转小写
#include<bits/stdc++.h>
using namespace std;
int main()
{
    char str[10];
    gets(str);
    for(int i=0;str[i]!='\0';i++)
    {
        if(str[i]>=65 && str[i]<=90)
            printf("%c",str[i]+32);
        else
            printf("%c",str[i]-32);
    }
    puts("");
    return 0;
}
//判断两个字符串是否相等
#include<stdio.h>
int main()
{
    char s1[100];
    char s2[100];
    gets(s1);
    gets(s2);
    int i,j;
    for( i=0,j=0;s1[i]!='\0' && s2[j]!='\0';i++,j++)
    {
        if(s1[i]==s2[j])
            continue;
        else
            break;
    }
    if(s1[i]=='\0' && s2[j]=='\0')
        printf("YES");
    else
        printf("NO");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值