前言
一切的一切,起源于一个散养的,信息封闭的,人工智能第一学期不上计算机语言课的学校开始,河南人576分的痛啊。朋友高九分进的学校,各种群消息永远不停,蓝桥杯省一的大佬一堆(实际上年年国一国二),还有喜欢学习的室友,协会会长还是个鸭厨(怎么我认识的崩三厨都是大佬,只有我自己这么菜口牙)。自己一个人闭门造车,课二倍速都听得懂,写题的时候就不对付了,查资料写出来的屎山还跑不动,故道心破碎,打算从基础的,每个知识点开始学,遂发本贴,用以记录自己的学习和大学生活。
生活规划,自我要求及目标
- 每天空余时间(含早晚自习)一半时间学习,一半时间玩。
- 大一加入一个有实力的科研社团。
- 大一学完c,如有有余力,继续修python。
- 大二英语六级,打一届蓝桥杯,在社团做过哪怕一个项目。
- 星期天可适当多休息。
-
要协调时间进行体育锻炼。
正文
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;
}