C语言
- pychart
- 用户交互 pythonweb
- GUI编程
- 网络编程
常量、变量、常变量、标识符
常量
-
字符常量单引号
-
字符串型常量是双引号
-
符号常量大写,结尾不用分号,比如: #define PI 3.14(符号常量不占内存,只是一个临时符号,预编译结束后就会消失,大写表示)
转义字符
- \n
- \t 制表符
变量
- 由数字、字母、下划线组成
- 不能以数字开始
- 不能使用关键字
先定义后使用,跟python不一样 哦
系统根据变量类型分配内存空间的大小
常变量:const int a 不可以对a再赋值
八进制不能直接16进制
%d %o %x
0x85 表示的是16进制
原码
最左边的一位是符号位,0正 ,1负
比如-5 -> 1000 0101,而5 -> 0000 0101
反码
正数的反码是本身,负数的反码 除了符号为其余为数按位取反
-0 的原码是1000 0000 反码是 1111 1111
补码
正数的原反补是本身,负数的补码是反码+1
补码 经过取反加1 得到原码(千万别逆着算回去)
补码运算没毛病
补
码
=
反
码
+
1
补码=反码+1
补码=反码+1
补码的意义
- 统一了0的编码
- 将减法运算变为加法运算
- 两个用补码表示的数相加,如果高位进位,则舍弃进位
数据类型
- int整型 占4个字节
- short int 短整型占2个字节
- long int 长整型占4字节
- long long int 双长整型占8字节
sizeof(a) 输出a变量的所占字节空间
unsigned 无符号整数
signed 有符号整数 一般默认都是有符号整数
字符型数据 char 1个字节
float 4字节
double 8字节
long double 16字节
二维数组中的一维长度可以省略但是二维不可以
字符串是一串单个字符连起来的,以’\0’结尾
运算符
分为:算数、赋值、比较、逻辑、位运行算符
ps: 5/2=2 在乘除法中可以将某一数*1.0就可以得出正确结果
c语言中真是1,假是0
结构
- 顺序结构
- 选择结构
- 循环结构
条件运算符
表达式1? 表达式2:表达式3
如果表达式1值是真那么就是返回2
如果表达式1为假那么就是返回3
int max = a>=b ?a:b;
printf("max is %d",max);
switch(name){
case 'yang':
printf("I am yang");
break;
case 'niu':
printf("I am niu");
break;
default:
printf("your enter is illeagle");
break;
}
润年
(year%40&&year%100!=0)||year%4000
for和while
int item=1;
int res=0;//如果不给res赋初值,那么res就是一个随机数
while(item<=100){
res += item;
item++;
}
printf("the res is %d",res);
int i;
int sum = 0;
for(i=1;i<=100;i++){
sum+=i;
}
printf("the sum of 100 is %d",sum);
素数只能被1和本身整除
int num=0;
int i=1;
printf("请输入数字\n");
scanf("%d",&num);
for(i=2;i<=num-1;i++){
if(num%i==0){
printf("this is 非素数");
break;
}else{
printf("this is 素数");
break;
}
}
// 如果程序非正常结束.应该i=num
if (i<num){
printf("%d不是素数",num);
}
break跳出本循环,在嵌套循环中跳出最接近它的循环,并且终止
continue跳出本次,开始下一次循环
for(int i=0;i<10;i++){
if(i%2==0){
printf("%d是偶数\n",i);
continue;
//如果写continue就会打印所有的偶数,break只能写一个偶数就终止了
}
}
goto a;
printf("111\n");
printf("222\n");
a:
printf("333\n");
//这样直接开始打印333,就不管前面了
数组
在内存中开辟的地址都是连续的
只有在定义的同时才能初始化。如果定义完了再赋初值会报错,因为数组名是一个常量,不能对常量赋初值
还可以局部初始化
int a[10] = {1,2,3,4,5}
printf("sizeof(a) is %d\n",sizeof(a));
//--> 这会显示40,因为int占4个字节,一共开辟了十个元素-> 4*10
// 那么数组a的长度就是:sizeof(a) / 4
数组名的地址就等于数组首个元素的地址
找出数组中的最大的数c
//找出数组中的最大的数c
int a[10] ={1,2,3,5,6,112,45,4,1};
int max=a[0];//定义一个max去打擂台
for(int i=0;i<10;i++){
//遍历擂台进行比较
if(a[i] >= max){
max >= a[i];//如果比max大那么就更新
}
}
实现数组的反转
int a[6] = {1,2,3,4,5,6};
int i=0;
int temp;
int length = sizeof(a) / sizeof(int)-1;//数组末尾元素
while(i<length){
temp = a[i];
a[i] = a[length];
a[length] = temp;
i++;
length--;
}
for (int i=0;i<6;i++){
printf("%d\n",a[i]);
}c
实现数组的排序
int a[8] = {1,3,2,5,12,4,35,14};
int i=0;
int j=0;
int temp;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(a[i]<a[j]){
temp = a[i];
a[i] = a[j];
a[j]= temp;
}
}
}
for(int i=0;i<8;i++){
printf("%d\n",a[i]);
}
给定一个数,找到数组中不重复的两个数的和与此数相同的元素下标
int a[8] = {1,3,2,5,12,4,35,14};
int target = 9;
int i,j;
int n = sizeof(a) / sizeof(int);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){//俩数不能重复,所以j+1
if(a[i]+a[j] == target){
printf("i is %d,j is %d\n",i,j);
}
}
}
二维数组
可以 看作是一维数组的数组
int a [行] [列] 第二个列必须写长度,第一个不能写
逻辑结构是二维数组,等效于我们见到的表格,但实际仍是线性结构存储
访问不要越界
可以使用sizeof(数组名)计算数组大小 a[2] [3] sizeof(a) ==24
//二维数组赋初值
int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
}
int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
//经常使用第一种方式
int c[3][4] = {
{1},
{3},
{5}
}
二维数组行列互换
//行列互换 a[i][j] = b[i][j];
int a[2][3] = {
{1,2,3},
{4,5,6} };
int b[3][2];
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++){
b[j][i] = a[i][j];
}
}
for(i=0;i<3;i++){
for(j=0;j<2;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
求出二维数组的最大值
int i,j;
int a[3][4]={
{5,1,3,1},
{9,1,2,3},
{12,22,3,1}
};
int max = a[0][0];
//打擂台赛比较大小
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if(max<a[i][j]){
max = a[i][j];
row = i;//最大值的行
column = j;//最大值的列
}
}
}
printf("The max is %d\n",max);
求二维数组行数列数
int a[3][4]={
{5,1,3,1},
{9,1,2,3},
{12,22,3,1}
};
int row =sizeof(a)/sizeof(a[0]);//二维数组行数
int column = sizeof(a[0])/sizeof(a[0][1])//二维数组列数
字符数组
char a[10]
c语言没有字符串类型字符串存放在字符数组
字符串一定是字符数组,字符数组不一定是字符串
字符数组+\0 ---->字符串
\0后面加数字就会转义可麻烦的!!!
char a[] = {'a','p','p','l','e','\0'};// \0结尾就是字符串 char a1[] = {'a','p','p','l','e'};// 这就是字符数组 char a3[] = "apple";printf("%s"),a3 // ->输出是apple 自动隐藏\0 sizeof(a3)/sizeof(char) == 6 多了一个字节那就是\0
逐个输出用%c
一坨输出用%s。遇到\0就会结束
scanf不做越界介绍
字符串
1.get函数,gets() 功能是从键盘中读取字符串到指定数组
char str[100]; gets(str)
gets函数允许输入有空格,但是scanf不允许输入有空格
- puts 用法
char str[100] = “china”;
puts(str)
puts在输出到屏幕时候加了\n 但是字符串本身并没有变化
函数
先定义后调用
#include<stdio.h> int Compare(int num1,int num2){ if(num1>num2){ return num1; }else{ return num2; } } void Do(char s[10]){ printf("i am doing %s",s); } int main(){ int n1 = 3; int n2 = 4; int max = Compare(n1,n2); printf("max is %d\n",max); char s[10] = "homework"; Do(s); return 0; }