** C**语言复习和数组开篇
一.C语言变量
C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。(变量名称不可以是C语言的关键字)它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。基于前一章讲解的基本类型,有以下几种基本的变量类型:char,int,float, double。
对于char:通常是一个字节(八位), 这是一个整数类型。
int:整型,4 个字节,取值范围 -2147483648 到 2147483647。
flaot:单精度浮点值。
double:双精度浮点值。
在定义变量时需要注意:
1.在变量赋值中变量需在赋值号的左边.
2.在声明变量后,要对变量进行初始化,且对变量赋值可以在声明中赋值,也可以用scanf函数赋值。尽量不要把初始化后的变量和未初始化的变量放在一起,要分行写出。
二.C运算符
C运算符分为:
算数运算符
关系运算符
逻辑运算符等
1.算数运算符
就是我们长说的加减乘除。符号:+ - * /;还包括取余%。
注意:++,–;
问:i++,和++i的区别
int i;
int j;
j=i++;
printf("%d",j);
j=++i;
printf("%d",j);
2.关系运算符
下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
3.逻辑运算符
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
下面就是复习的重点也是比较难的点
三.C判断
.首先我们要知道C 语言把任何非零和非空的值假定为 真,把零或 null 假定为 假。
考虑一下下面的问题
while(!x)
//当x为什么值时while可以成功循环。
while(x!=0)
//当x为什么值时while可以成功循环。
while(x)
//当x为什么值时while可以成功循环。
C 语言提供了以下类型的判断语句。
语句 | 描述 |
---|---|
if 语句 | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if…else 语句 | 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
嵌套 if 语句 | 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 |
switch 语句 | 一个 switch 语句允许测试一个变量等于多个值时的情况。 |
对于if语句
流程图如下:
如果判断为false,就不会执行if语句下的代码(用花括号括起来的,要注意两条语句以上就一定要用花括号,但是一条语句可以不用。)
if语句下如果跟了一个else语句,如果if的条件判断为false,那么就会执行else语句下代码(规则同上)
对于if—else语句
if(boolean_expression 1)
{
/* 当布尔表达式 1 为真时执行 */
}
else if( boolean_expression 2)
{
/* 当布尔表达式 2 为真时执行 */
}
else if( boolean_expression 3)
{
/* 当布尔表达式 3 为真时执行 */
}
else
{
/* 当上面条件都不为真时执行 */
}
//一个if只能有一个else,else后不能跟判断语句,c会默认if或者所有else if不满足判断条件时执行else语句下的代码。
对于 switch 语句
C 语言中 switch 语句的语法:
问:如果没有break;会怎么样?
switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 *///一定注意break;
case constant-expression :
statement(s);
break; /* 可选的 */
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}
switch 语句必须遵循下面的规则:
- switch 语句中的 expression 是一个常量表达式,必须是一个整型或枚举类型。
- 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
- case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
- 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
- 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。
? : 运算符(三元运算符)
我们已经在前面的章节中讲解了 条件运算符 ? :,可以用来替代 if…else 语句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
在我们写一个程序输入两个整型变量a,b,输出a,b中大的那个。
如果是你们会怎么写?
int a,b;
int max;
scanf("%d%d",&a,&b);
max=a>b?a:b;
printf("%d",max);
四.C循环
这个我个人来看应该是这次期中考试编程题的重点(循环加判断)(以后也很重要!!!)
三个基本循环:while,for,do—while(原理都是一样)
有一个截至的条件,如果满足截至条件就再次重复执行循环的代码,
不满足就跳出循环。
要注意do—while与while的区别
do—while必定会执行一次。
循环的语法就不过多介绍。主要是解题
第一题:
常见的九九乘法表的输出
#include<stdio.h>
//打印99乘法表
int main(){
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%d x %d = %d\t",j,i,i*j);//
}
printf("\n");//换行
}
return 0;
} 正常的左下
#include<stdio.h>
int main() {
int i,j;
for(i=1; i<=9; i++) {
for(j=1; j<=9; j++) {
if(j<i)
printf("\t");八个空格的宽度
else
printf("%d*%d=%2d ",i,j,i*j);
}
printf("\n");
}
return 0;
}//右上
上面这个题有点超范围了,有指针的知识。
有一个题
#include<stdio.h>
//打印99乘法表
int main(){
int i,j;
for(i=1;i<=9;i++)
printf("%3d",i);
printf("\n");
printf(" - - - - - - - - -\n");
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%3d",i*j);//
}
printf("\n");//换行
}
return 0;
}
随机数
#include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 int main(){
6 srand(time(0)); //先设置种子
7 int number=rand()%100+1; //然后产生随机数 +1是1-100之间的数 如果用户输入的是0则加1
8 int count=0; //定义计数变量
9 int a=0;
10
11 printf("我已经想好一个1-100之间的数了\n");
12 do{
13 printf("请你猜这个数:\n");
14 scanf("%d",&a);
15 count++;
16 if(a>number){
17 printf("你输入的数大了\n");
18 }else if(a<number){
19 printf("你数入的数小了\n");
20 }
22 }while(a!=number);
23 printf("太棒了,你用了%d次就猜对了答案 \n",count);
24 return 0;
}
五.一维数组
1.一维数组的创建和初始化
数组是一组相同类型元素的集合。
(1)数组的创建
创建方式:
type_t arr_name[const_n];
type_t 是数组的元素类型
[const_n] 是一个常量或常量表达式,用来指定数组的大小
例如我们创建int类型和char类型的数组:
int arr1[5];
int arr2[2+3];
char arr3[10];
[ ]内一定要是一个常量或者常量表达式。那么我们再来看一个数组创建:
int a = 5;
int arr[a];
上述数组的创建可以被允许吗???事实上这牵扯到C语言的版本问题。
在C99之前,数组的大小只能用常量指定,但是在C99之后引用了变长数组的概念,数组的
(2)数组的初始化
初始化是指,在数组创建的同时给数组输入一些合理的初始值。
int arr[5];//已知数组大小时,可以只创建而不初始化
int arr1[10] = {1,2,3};//不完全初始化,剩余元素默认初始化为0
int arr2[] = {1,2,3,4};//创建大小未知的数组时,必须初始化,默认大小为元素个数
int arr3[5] = {1,2,3,4,5};//规范初始化,元素个数与数组大小一致
char arr4[3] = {‘a’,98,‘c’};//字符初始化要用单引号,如果给的是数字,则存在数组里的实际是数字所对应的ASCII码值所对应的字符,例如98对应字符’b’,所以实际存进数组的是字符’b’。
char arr5[] = {‘a’,‘b’,‘c’};//常规字符初始化,不满同样补0
char arr6[] = “abcdef”;//直接输入字符串时,用双引号
如上,数组的初始化化有很多种方法,其中值得注意的是,arr5和arr6两种字符数组的初始化,其中arr5是单个字符的输入,arr6是字符串整体的输入,这样arr6便会比arr5多输入一个’\0’。
2.一维数组的使用
对数组的操作,则是通过下标引用操作符 ‘[ ]’ 来实现。
如上图我们可以看到,数组中元素的实际顺序是从0开始的,也就是说,假如我们要操作数组的第5个元素,那就要用arr[4],而这个**'4’我们则称为是数组元素的下标**。
循环打印数组元素时,这里有一个陷阱,那就是我们的循环变量’i’是数字元素的下标,而数组元素的下标是元素的实际顺序减1,所以这里的’i’要从0开始,并且到9结束,所以限制条件是i < 10,而不是i <= 10。否则就会打印出多余的错误的结果,造成数组越界。
同时我们也可以通过数组元素下标来对其值进行修改:
循环打印数组元素时,这里有一个陷阱,那就是我们的循环变量’i’是数字元素的下标,而数组元素的下标是元素的实际顺序减1,所以这里的’i’要从0开始,并且到9结束,所以限制条件是i < 10,而不是i <= 10。否则就会打印出多余的错误的结果,造成数组越界。
同时我们也可以通过数组元素下标来对其值进行修改:
3.一维数组在内存中的存储
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
arr[4] = 1;
for (i = 0; i < 10; i++)
{
printf(“&arr[%d] = %p\n”,i,&arr[i]);
}
return 0;
}
这里给大家补充一个小知识点,当我们要打印一个数据所存放的地址时,要用到’%p’。
最后考虑一下求数组最大值,最小值。
际顺序减1,所以这里的’i’要从0开始,并且到9结束,所以限制条件是i < 10,而不是i <= 10。否则就会打印出多余的错误的结果,造成数组越界。
同时我们也可以通过数组元素下标来对其值进行修改:
3.一维数组在内存中的存储
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
arr[4] = 1;
for (i = 0; i < 10; i++)
{
printf(“&arr[%d] = %p\n”,i,&arr[i]);
}
return 0;
}
这里给大家补充一个小知识点,当我们要打印一个数据所存放的地址时,要用到’%p’。
最后考虑一下求数组最大值,最小值。
数组排序。