普通双非一本的c语言自学兼生活记录

前言

一切的一切,起源于一个散养的,信息封闭的,人工智能第一学期不上计算机语言课的学校开始,河南人576分的痛啊。朋友高九分进的学校,各种群消息永远不停,蓝桥杯省一的大佬一堆(实际上年年国一国二),还有喜欢学习的室友,协会会长还是个鸭厨(怎么我认识的崩三厨都是大佬,只有我自己这么菜口牙)。自己一个人闭门造车,课二倍速都听得懂,写题的时候就不对付了,查资料写出来的屎山还跑不动,故道心破碎,打算从基础的,每个知识点开始学,遂发本贴,用以记录自己的学习和大学生活。

生活规划,自我要求及目标

  1. 每天空余时间(含早晚自习)一半时间学习,一半时间玩。
  2. 大一加入一个有实力的科研社团。
  3. 大一学完c,如有有余力,继续修python。
  4. 大二英语六级,打一届蓝桥杯,在社团做过哪怕一个项目。
  5. 星期天可适当多休息。
  6. 要协调时间进行体育锻炼。

正文

9.22

开始的第一天,把前几天积累的都写进来。




1.getchar and putchar

markdown
c//这是一段c语言代码
#include <stdio.h>

int main()
{
    int ch=0;
    while((ch=getchar())>=0)//获取输入字符并赋给ch
    {
        getchar();//获取字符后的\n(换行)
        putchar(ch+32);
        printf("\n");
    }
    return 0;
}

知识点:

        1.getchar可以不借助scanf直接获取字符的ASCII值(甚至包括换行“\n”)

        2.putchar可以直接用ASCII值输出字符

        3.while里包含运算时是会运算的(且每次循环都会)

算法技巧:

         输入数据包含不需要内容时可以输入不输出(本题用getchar吸收了换行)

2.输出字符的ASCII

#include <stdio.h>

int main()
{
    char n;
    scanf("%c",&n);
    printf("%hhd",n);//输出时将char类型转化为int形式
    return 0;
}

知识点:

        输出时可以将其他形式转化为int形式,其中h和l分别代表长度

                1.%hhd        char

                2.%hd          short

                3.%ld            long

                4.%lld           long long

3.四舍五入

#include <stdio.h>

int main() 
{
    int n;
    double num,num1,num2,num3;
    scanf("%d;%lf,%lf,%lf",&n,&num,&num2,&num3);
    num1=round(num*100);//将数据放大一百倍进行四舍五入
    num=num1/100;//缩小回去
    printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",n,num,num2,num3);
    return 0;
}

知识点:

        round函数可以对数据在整数层面进行四舍五入

算法技巧:

        当需要对一些其他不能直接操作的位数操作时,可以先放缩再调整回来

9.23

        繁忙的一个星期,从早七到晚九。

周日还要调休补课(万恶的调休)。

中午看了看社团招新,想加的只有校科协和院科协(热爱科协的优秀科委是吧)。

这么算的话这个星期能自学的时间不多了,预计后面几天都在写之前的笔记

已经写完了(当天下午),可以继续学习新的了,芜湖!




1.进制的输入输出

#include <stdio.h>

int main()
{
    int n=1234;
    printf("%#o %#X",n,n);
    return 0;
}

 知识点:

        1.用不同进制处理数据时的符号不同:

                %o八进制

                %d十进制

                %x十六进制(用大写X时输出的字母是大写的)

                二进制和四进制则需手动运算

        2.位制前导输出:

                在%和字母间加入“#”会在输出数字的前面加上位制(如上图)

  2.自动补0

#include <stdio.h>

int main()
{
    int n,m,q;
    scanf("%4d %2d %2d",&n,&m,&q);
    printf("year=%d\nmonth=%02d\ndate=%02d",n,m,q);
    return 0;
}

 

 知识点:

        1.控制输入输出域宽:

                在%和字母间加入数位(域宽)实现单一数据分段输出(如上)

        2.数位前方自动补零:

                在%后加0(在域宽前面)(如上)

3.格式的强制转化

#include <stdio.h>

int main()
{
    double n;
    scanf("%lf",&n);
    int m=(int)n;
    while(m>=10)
    m=m%10;
    printf("%d",m);
    return 0;
}

 知识点:

        在数据前加上(格式)可以实现格式上的强制转化

4.海伦公式

数学乱入(bushi)

c里算三角形面积很好用,防止忘记,写在这里 

        ps:三边能否构成三角形的判断
if(arr[0]+arr[1]<arr[2] || arr[1]+arr[2]<arr[0] || arr[0]+arr[2]<arr[1]) printf("Error"); 

 原本以为是屎山的,结果问GPT的时候:

if ((a + b > c) && (a + c > b) && (b + c > a)) {
        printf("可以构成三角形\n");
    } else {
        printf("不能构成三角形\n");
    }

不知道有没有更简便的算法,先插个眼

5.没见过的极限公式

写高数的时候搜到的, 先记下来。

就在课本p50(来自9.24)

9.24

        第一节英语课听听力,孩子已经听麻了(二手书还不能绑定,120大洋没了,更麻了),已经在拷1999的主线流程了。

 这个故事告诉我们不要乱说话,因为别人可能和你来真的(




1.位移运算

#include <stdio.h>

int main()
{
    int n=1,m;
    scanf("%d",&m);
    n = n << m;//将n乘以2的m次方
    printf("%d",n);
    return 0;
}

  知识点:

        <<可以将数据在二进制层面整体向前移动一位(即×2)

        >>同理将数据在二进制层面整体后移一位 

2.分数除法(常数)

5/9*(f-32);//错误的,0
5.0/9*(f-32);//正确的,摄氏度

一段时间不用,连这个都忘了

知识点:

        c语言中的除法默认是整数除法,要用小数/分数除法,就要把分子和分母(至少要是分子)换成小数形式表示。

3.常数宏

#define pi 3.14//定义pi=3.14
......
......
s=r*r*pi;//圆面积公式

知识点:

        用#define定义宏,格式为:#define x y(使x=y,可直接使用,如上)

4.浮点数取余数,四舍五入和浮点数向上取整

planA
#include <stdio.h>
#include<math.h>
#define pi 3.14
int main() 
{
    double h,r,v;
    scanf("%lf %lf",&h,&r);
    v=pi*h*r*r/1000;
    if(fmod(10.0,v)==0) printf("%.0f",10/v);
    else printf("%.0f",10/v+0.5);
    return 0;
}
pianB
#include <stdio.h>
#include<math.h>
#define pi 3.14
int main() 
{
    double h,r,v;
    scanf("%lf %lf",&h,&r);
    v=pi*h*r*r/1000;
    if(fmod(10.0,v)==0) printf("%.0f",10/v);
    else printf("%.0f",ceil(10/v));
    return 0;
}

知识点:

        1.fmod:需math头文件。对浮点数进行取余,格式为fmod(x,y)即对x/y取余

        2.ceil:

 如planB

        3.四舍五入:%f在输出时进行四舍五入,所以进一时应写为

printf("%.0f",x+0.5);//不是+1!

9.25

错了错了,下次不敢乱嗦话了。

炉石开服了,如果进得去的话...... 




1.欧几里得算法(Euclidean algorithm)(GCD和LCM(最大公因数和最小公倍数的简便计算))(数学可用)

原本以为是一道普普通通的题目,直到

哪有这么大的数的!!!用暴力拆解法,如果改成long long类型则会超时

无奈下问了GPT

把代码改成了这样

#include <stdio.h>

    long long gcd(long long x,long long y)//欧几里得算法计算GCD
    {
        long long r;
        while(1)
        {
            r=x%y;
            if(r==0) break;
            x=y;
            y=r;
        }
        return y;
    }


    long long lcm(long long x,long long  y,long long gcd)//用GCD计算LCM
    {
        return x*y/gcd;
    }


    int main()
    {
        long long n,m,x,y;
        scanf("%lld %lld",&n,&m);
        x=gcd(n,m);
        y=lcm(n,m,x);
        printf("%lld",x+y);
        return 0;
    }

 知识点:

        1.欧几里得算法(Euclidean algorithm)

 较为好用且计算量小,但是目前不明白原理,划重点记。

        2.利用GCD计算LCM:

算法技巧:

        在上面。 

2.pow函数

#include <stdio.h>
#include <math.h>
int main() {
    int n,m,i=0;
    scanf("%d",&n);
    for(int q=0;n>0;q++)
    {
        m=n%2;
        n=n/10;
        i=i+m*pow(10,q);
    }
    printf("%d",i);
    return 0;
}

知识点:

        GPT说的对!

         

算法技巧:

        倒序输出:有时要求出的数据和所填数据是倒叙关系,在输出的时候可以用pow函数将每个数字的数位依次前移(即把本数据×10),实现结果的倒序输出。

9.26

 大捷!!




1.防止过度读取

 例如本题,存在数据量不明确,无法精准控制读取的情况

#include <stdio.h>

int main() {
    int a=0;
    while(scanf("%d",&a)!=EOF)//无输入则结束循环
    {
        if(a>=60) printf("Pass\n");
        else printf("Fail\n");
    }
    return 0;
}

知识点:

        1.用EOF保证数据的读取

算法技巧:

        在while中加入运算以调整循环里读取/输出与判断的关系 

2.switch里记得break

        例题啥的就不放,总之致敬某传奇分支王,写switch忘记写break修了半天

3.拉普拉斯定理(Laplace定理)

大致可以这么说:在一个行列式中选一个n*n的行&列展开,没有被划掉的数再展开(不能选全是0的行or列) ,再乘以-1的n次方(展开的全部行列数之和),即可求出D。

9.27

刷题四小时无收获,望周知。

9.28

        面了电协,去图书馆看了一个多小时,结合各个书的内容,决定进军指针。




1.函数相关变量包含指针时的写法

#include <stdio.h>
int cal(int*array,int n)
{
    int x,y=0;
    for(x=1;x<=n;x++)
    {
        y=*array+y;
        array++;
    }
    return y;
}

int main() {
    int x;
    scanf("%d",&x);
    int arr[x];
    for(int i=0;i<x;i++) scanf("%d",&arr[i]);
    printf("%d",cal(arr,x));//第一个变量处不要写指针变量!!
    return 0;
}

 当函数变量包含指针时输入类型就是指针,不用再专门另写指针变量!!!

2.冒泡排序

突然想起来没写过冒泡,写一个练练手。

#include<stdio.h>

int bubbleSort(int arr[],int n)
{
	for (int i=0; i < n; i++)
	{
		int swapped = 0;//标记
		for (int x=1; x < n - i; x++)//x的上限是递减的,冒泡是从最后一个数开始排序的
		{
			if (arr[x] < arr[x - 1])
			{
				int temp = arr[x - 1];
				arr[x - 1] = arr[x];
				arr[x] = temp;
				swapped = 1;//标记
			}
		}
		if (!swapped) break;//没有发生交换则说明已经排好了,跳出排序节约算力
	}
}

int main()
{
	int num=0;
	scanf("%d", &num);
	int arr[num];
	for (int i = 0; i < num; i++) scanf("%d", &arr[i]);
	bubbleSort(arr, num);
	for (int i = 0; i < num; i++) printf("%d ", arr[i]);
	return 0;
}

然后在vs上就出现了:

vs上数组不能用变量创建。

算法技巧:

        1.回归冒泡算法,本质就是将每相邻的数进行大小比较,如果前比后大,则交换位置,从后至前。 

        2.在循环中加入标志进行判断循环任务是否完成以便于尽早跳出循环。

9.29

这同人也太豪庭了,已经单曲循环好几天了,想想上次看原的二创都是什么时候的事了,突然想补了。




1.结构体初应用

 

#include <stdio.h>

struct date
{
    int year;
    int month;
    int day;
};//创建结构体(注意分号)

void print(struct date*p)
{
    printf("%d/%d/%d\n",p->day,p->month,(*p).year);
}//输出用的函数,其中指针输出有以上两种用法

int main() {
    struct date a={0,0,0};
    scanf("%d %d %d",&a.year,&a.month,&a.day);
    print(&a);//变量用的指针,用取值
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值