提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
对于一个重新学习C语言这门课的学生来说,我想在这里写一些重要的笔记,比较难懂的例题(当然,只针对于我个人来说),大家也都可以参考。
一、C语言最简单开始
1. 数据类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
每个占几个字节,用下面的函数查看一下,就知道,这个最好要记住。
#include<stdio.h>
void main(){
printf("char= %d\n", sizeof(char));
printf("short=%d\n", sizeof(short));
printf("int=%d\n", sizeof(int));
printf("long=%d\n", sizeof(long));
printf("long long =%d\n", sizeof(long long));
printf("double= %d\n", sizeof(double));
}
2. 变量,常量
变量顾名思义,就是一些会发生改变的值,常量就是一旦定义好,就无法改变的值。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
- 变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
3. 字符串+转义字符
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。(注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串)
转义字符:
? 在书写连续多个问号时使用,防止他们被解析成三字母词
’ 用于表示字符常量’
\“ 用于表示一个字符串内部的双引号
\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示1~3个八进制的数字。 如: \130 X
\xdd dd表示2个十六进制数字。 如: \x30 0
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
输出结果分别为:6 14
第一个很好理解,这里我把第二个分一下,就比较好理解了,比较尴尬的是,开始我的理解也是错误的,最后才发现是这样,为了方便理解,我把每个字符中间用#隔开:c#:# \t#e#s#t#\32#8#\t#e#s#t#.#c,可以发现一共13个#。
4. 选择与循环语句
选择语句就是我们所说的if,switch,switch我觉得就是一种特殊的选择语句,里面也类似于if,else这种选择,比较好理解。注意:break可以退出switch,default子句用于处理,匹配不到case的情况,可以写在switch里的case的前或者后,都无所谓。
循环语句
while
for
do while
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
这里再说一下,break和continue的区别,前者直接跳出循环,后者结束本次循环,进入下一循环。
二、典型的题
1.打印菱形
#include<stdio.h>
//打印菱形
int main()
{
int i, j, N = 5;
//上半部分
for (i = 0; i < N; i++) //N控制上半部分行数
{
for (j = i; j < N - 1; j++) //随行数递增,空格数递减(这里每行前面的空格数分别为4,3,2, 1,0)
printf(" ");
for (j = 0; j < 2 * i + 1; j++) //随行数递增,“*”数递增(这里每行前面的*数分别为1,3,5,7,9)
printf("*");
printf("\n"); //记得换行
}
//下半部分,其实就是上半部分的翻转
for (i = N - 2; i >= 0; i--) //这里i从N-2开始的,不知道为什么的可以换成N-1试试,保证秒懂
{
for (j = i; j < N - 1; j++) //这里的空格数刚好相反,是随行数递增的
printf(" ");
for (j = 0; j < 2 * i + 1; j++) //这里的“*”数则是递减的(想想图形的样子)
printf("*");
printf("\n"); //同样的记得换行
}
return 0;
}
2.求出0~100000之间的所有“水仙花数”并输出。
#include <math.h>
void main(){
int n;
int a[6] = {
0 };
int i;
int sum = 0;
int count = 0;
for (n = 0; n <= 100000; ++n){
//遍历0-100000之间所有数字
for (i = n; i; i /= 10){
a[count] = i % 10; //用数组a[count]将每一位存起来,用count记下数字的位数
++count;
}
for (i = 0; i < count; ++i){
sum += pow(a[i], count); //将数组中所存的数字的每一位进行对应的位数count次方并求和
}
if (n == sum){
printf("%d \n", n);
}
count = sum = 0; //强制将count与sum归0
}
}
3.二分查找
#include <math.h>
void main()
{
int ar[] = {
12, 23, 34, 45, 56, 67, 78, 90, 100, 120, 150, 200, 1234 };
int n = sizeof(ar) / sizeof(ar[0]);
int key;
printf("input key:>");
scanf("%d", &key);
int low = 0;
int high = n - 1;
int mid, index = -1;
while (low <= high)
{
mid = (low + high) / 2;
if (key == ar[mid])
{
index = mid;
break;
}
else if (key < ar[mid])
high = mid - 1;
else
low = mid + 1;
}
if (index == -1)
printf("要查找的%d不存在.....\n", key);
else
printf("要查找的%d在: 第%d个\n", key, index+1);
}
总结
这里先介绍了一点点,还有很多典型的题,后面的函数,数组,指针,还会加入,怎么说呢,第二遍学这门语言,感觉很不一样,没有第一次,那么懵懂了,知道给一个东西,要怎样去实现,虽然有时候实现的方式比较垃圾,这也是写的太少的原因,所以还是要一言不合,撸代码呀。