复习
1.隐式转换
Double a
Int b = 1
A = b //编译器自动转换把b转换为double类型后 再给a赋值(隐式转换)
2.强制类型转换 (变量)类型名
Int a = 1
// a只有在此语句执行时,才强制转换为double类型 其他地址还是int类型
Printf(“%lf ”,(double)a)
转换原则:占用内存字节数小(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。
3.浮点型和整型打印的问题
a) 不要直接通过%d 打印一个浮点型类型,得不到想要的结果,要想得到结果,强制类型转换
Double a = 11.11
Printf(“%d ”,(int)a)
b) 不要通过%f或%lf 打印一个整型变量 得不到想要的结果 要想得到结果强制类型转换
Int a = 10
Printf(“%lf ”,(double)a)
二、运算符和表达式
1.相除得到小数问题
a)两个整数相除,只是取整数,不会带小数
int a = 1/2 // a=0
要想得到小数的结果,分子分母至少有一个是小数
Double a
A = 1.0/2 //a = 0.5
A = 1/(double)2
2.前置++、后置++区别
3、条件真假问题
a)0就是假
b)非0就是真,通常以1表示
4、逻辑|| &&
5、运算符优先级
Int c = 0
// &&优先级比 = 高
三、程序流程结构
C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
03 一维数组的使用
#include <stdio.h>
#define SIZE 10
int main(int argc, char *argv[])
{
//int a; //定义一个普通变量
//1、
//1、同一个{}内部,数组名不能和其他变量和数组名同名
int a[10]; //err
//2、定义数组时,n 最好是常量
int n = 10;
int b[n]; // 有些编译器会报错 如visual studio中就报错了
//3、 使用数组时 下标可以是变量 可以是常量 也可以是表达式
int c[SIZE];
c[0] = 1; //通过常量操作
int i = 1;
c[i] = 2; //通过变量
c[i+1] = 3; //通过表达式
// 4、使用数组,最好别越界
int d[10];
// 下表只有0 ~ 9, d[10] 就是越界 有时候越界了 编译器不会马上出错
d[10] = 11;
return 0;
}
int main01(int argc, char *argv[])
{
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int e = 4;
//1、定义一个数组,数组内部有10个int类型的元素(变量)
//2、定义数组和定义变量区别,名字后面加[],[]里面写元素个数
//3、数组在内存中是连续存储的
//4、通过下标访问数组元素,下表从0开始
//5、有多少个[]就是多少维 这里是一维数组
int array[10];
array[0] = 0;
array[1] = 1;
array[2] = 2;
return 0;
}
结论:
1、 编译器不是我们想象中那么智能 有些错误不能立马呈现
错误:
1、 编译错误(语法出错)
2、 运行时错误(运行时异常),最头疼 有些错误不能立马呈现
04一维数组元素的使用
04
05 不初始化的局部数组为随机数
{}内部的变量或数组,不初始化,它的值为随机数
07 答疑
gcc hello.c –o
gcc –o hello hello.c –std=c99 (这两种写法都行
-std=c99 制定了c语言标准
允许for( 循环中声明变量
例如for(int i =0
08 数组名
结果:
09 求三个数最值
int a = 10;
int b = 20;
int c = 30;
int max;
求最大值
10 求数组的最值
11 数组的翻转
1234567
a[0 与 a[6
a[1 与 a[5
a[2 与 a[4
i<j
i=0 j=6
i++ j—
while(i<j)
a[i和a[j 交换
i++ j—
十二、冒泡排序
冒泡法:
从第一个元素开始,两两相比,把元素往上冒,第一次排序后最大的已经到了最后面
for(I = 0 ;i<n-1;i++)
{
for(j=i;j<n-1;j++)
{ if(a[j]>a[j+1]){
tmp = a[j
a[j = a[i
a[I = tmp
}
}
}
C语言:
int main1()
{
// 冒泡法:把最大的冒出去
int a[] = {1, 24, -3, 145, 42, 5, 18};
int n = sizeof(a) / sizeof(a[0]);
int tmp;
for (int i = 0; i < n - 1; i++)
{
for (int j = i; j < n - 1; j++)
{
if (a[j] > a[j + 1])
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%d,", a[i]);
}
}
// *冒泡法变种:把最小的留在下面
int a[] = {1, 24, -3, 145, 42, 5, 18};
int n = sizeof(a) / sizeof(a[0]);
int tmp;
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[i])
{
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%d,", a[i]);
}
}
十四、二维数组定义使用
#include <stdio.h>
int main(int argc, char *argv[])
{
//1、有多少[] 就有多少维
//2、内存中没有多维,都只有一维,多维数组是特殊的一维数组
//3、定义了一个一维数组a[3],这个一维数组有3个元素,每个元素int[4]
//4、a[0],a[1],a[2]就是第0、1、2个元素的数组名
//5、二维数组,用户可以理解为m行n列,没有a[3][4]此元素(越界)
int a[3][4];
int i = 0;
int j = 0;
int num = 0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
a[i][j] = num;
num++;
}
}
a[0][0] = 0;
a[0][1] = 1;
return 0;
}
十五 二维数组初始化
#include <stdio.h>
int main(int argc, char *argv[])
{
// 看方便,写不方面
int a[3][4]{
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
int a1[3][4] ={ 0,1,2,3,4,5,6,7,8,9,10,11 };
// 如果定义时 同时初始化 第1个[]可以不写内容
int a1[3][4] ={ 0,1,2,3,4,5,6,7,8,9,10,11 };
// 如果第一个[]不写,必须初始化
// int a3[][4]; //err
int a3[3][4] = {0,1,2,3}; //没有初始化的元素赋值为0
int a4[3][4] = {0}; //所有元素初始化为0
return 0;
}
十六 二维数组名
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[5][10];
//1、数组名是常量,不能修改
//a=10; //err
//2、sizeof(数组名),测数组的总大小
printf("sizeof(a)=%lu ", sizeof(a))
//3、sizeof(a[0]) 测的是第0个元素的大小: int [10] = 4*10 = 40
printf("sizeof(a) = %lu ", sizeof(a))
//4、sizeof(a[0][0])测的是第0行第0列元素的大小,int = 4
printf("sizeof(a[0][0])=%lu ", sizeof(a[0][0]);
//5、求行数:总大小/每个元素的大小
int n = sizeof(a) / sizeof(a[0])
printf("n=%d ", n);
//6、求列数
n = sizeof(a[0])/sizeof(int)
printf("n1=%d ",n)
//7、行*列
n = sizeof(a)/sizeof(a[0]) * sizeof (a[0])/sizeof(int)
}
十七、二维数组的练习
十八、多维数组
十九、字符数组和字符串的关系
C语言中没有字符串,是用一维数组来模拟字符串的
#include <stdio.h>
int main(int argc, char *argv[])
{
//1、 C语言没有字符串类型,用字符数组模拟
char a[10];
//2、字符串一定是字符数组,字符数组就不一定是字符串
//3、如果字符数组以字符' '(' 等价于数字0')结尾,那么这
//个字符数组就是字符串
//
char b = {'a','b','c'}; //字符数组
char c[10] = {'a','b','c',' '}; //字符串
char c[10] = {'a','b','c',0}; //字符串
return 0;
}
20、字符数组初始化
#include <stdio.h>
int main(int argc, char const *argv[])
{
char a1[] = { 'a', 'b', 'c' }; //字符数组
// %s代表是字符串
printf("a1=%s ", a1);
// %s会从起始地址开始打印 直到遇到结束符
// 所以这种情况是有可能出现乱码报错的
char a2[] = { 'a', 'b', 'c', 0 }; // 字符串
printf("a2=%s ", a2);
char a3[] = { 'a', 'b', 'c', ' ' }; // 字符串
printf("a3=%s ", a3);
char a4[] = { 'a', ' ', 's', 2 };
printf("a4=%s ", a4);
return 0;
}
char a6[10] = {‘a’,’b’,’c’} //前三个字符赋值为a,b,c 后面自动为0 所以打印出来也是1bc
// 1、常用的初始化,使用字符串初始化,在字符串结尾自动加数字0
// 2、这个结束符,用户看不到(隐藏),但是是存在的
char a7[10] = “abc”
char a8[] = “abc”
printf(“sizeof(a8)=%lu”,sizeof(a8); //4 // 字符串自动隐藏一个结束符
char a9[] = “ abc”
printf(“a9 = %s ”,a9) //打印出来是空的
// 后面最好别跟数字,有可能组成一个转义字符
char a10[] = “ 12abc”
printf(“a10 = %s ”,a10);
查看一下 12对应的ASCII
man ascii
八进制012 对应的是’ ’
‘ 12’就是’ ’
21课堂答疑
22.字符串的输入输出
#include <stdio.h>
int main (int argc,char *argv[])
{
char str[100];
printf(“请输入字符串:”);
scanf(“%s”,str); // str本身就是地址 不用&取地址
printf(“star = %s ”,str)
return 0
}
23 随机数的产生
// 先设定一个种子才能产生随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
// 随机数的产生
// 先设置种子,种子设置一次即可
// 如果srand()参数一样,随机数就一样
// srand(100);
// time(NULL)功能获取系统当前时间,由于时间会变,srand()也会改变
srand((unsigned int)time(NULL));
int i = 0;
int num;
for(i=0;i<10;i++)
{
num=rand(); // rand(产生随机数
printf("num=%d ",num);
}
return 0;
}