C语言简单教程二(下)关于一些基本概念的介绍(大公司靠基础)
前面我们讲到变量的声明但是却提了一下标识符后面会详细介绍的。今天我们的主题还是C语言入们需要掌握的一些基本知识概念(基础)
赋值
我们都知道出生下来自己的名字都是别人取地,爸爸妈妈,爷爷奶奶,外公外婆等等他们给我们取名字,我们就有了名字了,类似这个过程变量也可以通过赋值来获得值
请看代码:
char character; //声明变量
int number;
float float_number;
long long_number;
string s_togther; //字符串类型string (C++加入)
//赋值
character = 'H';
number = 18 ;
float_number = 175.6 ;
long_number = 3161880795 ;
s_togther = "大家好我是HK意境" ; //字符串赋值
通常情况下,赋值运算的右侧可以是一个含有常量,变量,运算符的公式 (在C语言中我们都成为表达式)
我们可以将变量的声明和赋值结合在一起这样就可以二合一了;
显示变量的值
变量有了值过后我们肯定是想让它输出啊,想想看如果一个人的名字一直被人遗忘,一个人的名字长期不被叫喊,那么这个人会疯的 ,大家可以看看讽刺文学小说《一个人的名字》。
在C语言中为我们提供了输出函数printf();我们可以使用它输出我们的变量
我们可以看到前面的都是对的,但是 long_number ,和 s_togther 的输出是错误的,大佬都知道了,long_number 超出了,长整型的范围了,所以出错了,
但是很多小伙伴不明了, 为什么 s_togther 会输出乱码,(哈哈,因为string是C++的类型,C语言是没有这种类型的,所以呢,就无法使用这种方式输出呢啊
),具体的各种输出方法我会在未来寄给大家。看分析
**
1. C语言没有限制printf()一次可以输出显示的变量个数,所以上面的变量还可以在一个printf()里面输出哦
2.上面见到的 %d ,%f ,%s ,%ld ,%c 等我们称之为:格式控制符。数据以那种方式输出,这个在我们才开始阶段还是就认为它是一一对应的,
1.格式控制符的形式
%[-][0][m / m.n][l / h] 格式控制符
其中[]里面的内容是可选的
- :表示左对齐,缺省情况下为右对齐(若没规定输出数据的宽度则为左对齐)。
0:当规定输出数据的宽度时,所输出数据实际的宽度小于规定的宽度,则在左边用“0”补齐。
m / m.n:m规定了输出数据的宽度(位数),若数据实际的宽度大于m,则突破m的限制全部输出,反之, 将数据全部输出之后用空格进行左补齐;对于实数n是指小数点后的位数,若n小于小数点后实际的位数,则按四舍五入原则进行截取;对于字符串,n表示从左至右截取的字符个数。
l / h:l表示长整型数据(可用于 % ld。%lo,%lx,%lu),以及double型数据(%lf或%le);h表示短整型数据(可用于%hd。%ho,%hx)。
2.格式控制符及其功能(以输出为例)
%d:用来输出有符号的十进制整数(包括char类型)
%u:用来输出无符号的十进制整数(包括char类型)
%o:用来输出无符号的八进制整数
%x:用来输出无符号的十六进制整数
%c:用来输出单个字符
%s:用来输出一个字符串
%f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
**
详细的使用方法大家还可以参考一下这位大佬的:有关printf()的详细用法和格式控制符
http://c.biancheng.net/view/159.html
5.输入输出·
输出大家已经知道了,现在我们来讲解一下输入,在C语言中库函数为我们提供了一个非常有效的输入函数:
scanf(“格式控制符1,格式控制符2,格式控制符3…” ,&变量1,&变量2,&变量3 …) ;
来看例子:
char character; //声明变量
int number;
float float_number;
long long_number;
//string s_togther; //字符串类型string (C++加入)
//赋值
character = 'H';
number = 18;
float_number = 175.6;
long_number = 3161880795;
//s_togther = "大家好我是HK意境"; //字符串赋值
//进行输入
printf("请输入一个字符: ");
scanf("%c",&character);
printf("\n"); //换行
printf("请输入一个整数: ");
scanf("%d", &number);
printf("\n");
printf("请输入一个浮点数: ");
scanf("%f", &float_number);
printf("\n");
printf("请输入一个长整型数: ");
scanf("%ld", &long_number);
执行结果如上图:
这里说一下,scanf()函数读入数字,字符,字符串时遇到空格,tab键 ,和回车就会停止该字符的读取即完成该字符,数字,字符串的读取结束函数或者进行下一个字符,数字,字符串的读取。简单说就是scanf()不吃空格还值得一提的是,在使用scanf()函数读取数据时在变量前面必须要加上取址符 ‘ & ’(有个例),不加的话会无法正确执行
,这里,过多讲述scanf()了,详细的输入用法可以参考这位大佬的:
https://blog.csdn.net/qq_38880380/article/details/78920709
6.定义常量的名字
在C语言中数值不会改变的量叫做常量,一般需要我们定义为常量的都是大家公认的不会改变的量或者在程序里面需要它的数值不会改变的量我们一般就会把他声明为常量,例如 : 圆周率PI(3.1415926),
对于需要定义为常量的数值我们一般采用
1.使用 #define 常量名称(按照C语言祖传下来的一般使用大写) 数值/表达式;
2.使用前缀存储方式 : const 常量类型 常量名称 =常量值 ;即为在一般声明方式的前面加上 const(constant)关键字,并且使用全局变量:声明在主函数前面,头文件后面。
关于上面2种方法,第一张宏定义,一般使用较多,但是效率低下,对于初学者比较实用(在学习初期程序代码结构单一不需要优化),但是聪明的程序员总是喜欢把常量使用const 定义为全局变量,这样可以大大提高程序速度。
define PI 3.14 //常量名称遵循变量命名规则,\
但是“写为大写是宏定义自产生以来大家一起所遵守的一个规则,希望大家不要打破”------K.N.King
const float PI_ = 3.14; //定义为全局变量,高效
7.C程序的书写规范
对于编程初学者来说必不可少的是需要有一个良好的编程习惯和良好的编程风格,编程书写规范。
对于初学者来说可能不能体会这是一种审美情感。眼见为实 ,请欣赏代码的艺术:
int find_x_arry(int [],int number ,int len);int test2(){
int arry[1000] = { 0 }, n, number, i, k;scanf("%d", &n);
for (i = 0;i < n;i++){for (k = 0; ;k++){scanf("%d", &arry[i]);if (arry[i] == 0)break;
}scanf("%d",&number);
printf("%d\n",find_x_arry( arry , number ,k));
}return 0;
}int find_x_arry(int arry[], int number, int len){
int k = 0;for (int i = 0; i < len;i++,k++){
if (arry[i] == number)break;}
return k;
}
大家觉得这个代码好看吗,好进行辨识与读取吗?当然不好看,这不是代码的美,让我们看看下面这个
int student_socre_sort(int []); //普通版冒泡排序
int pro_student_socre_sort(int []); //改进版冒泡排序
int exe_student()
{
int student_socre[N] = {0}; //初始化为0
printf("please input ten students 's cosre :\n");
for(int i=0 ;i<N ;i++) //输入学生成绩
scanf("%d",&student_socre[i]);
student_socre_sort(student_socre); //普通版冒泡排序:
pro_student_socre_sort(student_socre); //改进版马冒泡排序,接下来将会用到计算两种排序的时间复杂度和空间复杂度
return 0;
}
int student_score_sort(int student_socre[N]) //普通版本的冒泡排序
{
int i, j;
for (i = 0; i < N;i++) //循环N-1次,每一次都进行一次比较找到该轮中的最大,并且将最大的放到前面一次排序下来,并且比较\
比较几点向后移动一位
{
for (j = i;j < N - i;j++) //每次比较从基点开始,向后移动,依次进行比较 ,并且将符合排序规则的数与当前数进行交换后再比较
{
if (student_socre[i] < student_socre[j]) //比较交换数
{
int tmp = student_socre[i];
student_socre[i] = student_socre[j];
student_socre[j] = tmp;
}
}
}
printf("排序后的学生成绩为:\n");
for (i = 0;i < N;i++)
{
printf("%d ",student_socre[i]);
}
return 0;
}
//一般的冒泡排序方法有可能会在已经排好序的情况下继续比较,改进的冒泡排序
//设置了一个哨兵flag,如果一次for循环没有进行交换,则元素已经排好序,由哨兵控制退出循环。
int pro_student_socre_sort(int student_socre[]) //改进版冒泡排序
{
int i,j, flag = 1; //设置一个哨兵flag,如果一次for循环没有进行交换,则元素已经排好序,由哨兵控制退出循环。
for (i = 0; i < N;i++)
{
flag = 1; //哨兵设置
for (j = i;j < N - i;j++) {
if (student_socre[i] < student_socre[j]) //比较交换数
{
int tmp = student_socre[i];
student_socre[i] = student_socre[j];
student_socre[j] = tmp;
flag = 0;
}
if (flag == 1) // 设置的哨兵判断是否有做过排序。如果一次都没有作就退出了
break;
}
}
printf("排序后的学生成绩为:\n");
for (i = 0;i < N;i++)
{
printf("%d ", student_socre[i]);
}
return 0;
}
这个是不是好看多了,总结一下良好的编程风格应该注意:
- 每一行写一个语句应该只有一个分号,一行一句
- 每个运算符前后都应该空一格空格,或者每一个记号间都应该有空格便于我们区分
- 缩进是代码便于识别程序嵌套的不二法则
- 空行:可以把程序分割成不同的逻辑单元,使读者更容易识别程序结构
- 注释便于我们识别,理解程序
8.ASCII码
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
常见ASCII码的大小规则:09<AZ<a~z。
1)数字比字母要小。如 “7”<“F”;
2)数字0比数字9要小,并按0到9顺序递增。如 “3”<“8” ;
3)字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” ;
4)同个字母的大写字母比小写字母要小32。如“A”<“a” 。
几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48 。
上面便是我们C语言简单入门教程了,还是老话,欢迎各位大佬来喷小妹,有什么好的建议 , 要是有关于更好的学习方法或者在编程上有更好的想法的欢迎与我交流哦