- 变量(必须是一个合法的标识符)命名规矩
- 不能用关键字和特定字
- 必须字母和下划线开头
- 除了字母、数字、下划线不允许其他字符
- 大小有别
- printf("格式控制" , 输出表列);
- %[ -左对齐 0左空位填零 <数字> . <数字>] 类型字符
- scanf("格式控制", &地址表列);
- 没有精度控制
- 在输入 空格、回车、Tab、不属于数值的字符,认为输入结束【例如:scanf("%d%lf",&a,&b); 输入: 3.14 100↙ 输出: a=3, b=0.14】
- 空值型void(出现在函数定义头部,表示无返回值)
- 优先级(高到低):
- 括号
- 单目运算符:!
- 算数运算符:+-*/
- 关系运算符:=<>
- 逻辑运算符(不包括!)&&||
- 三目运算符:max=a>b?a:b
- 赋值运算符
- 逗号运算符最低(左→右,最后一个为整个的值)a=1,b=2; 等价于a=1;b=2;
- 注释
- 全部1024 = pow(2 , 10) 倍 B字节 < KB < MB兆 < GB < TB
-
进制转换(八%o,十六%x)
-
2转某—2幂(八-3;十六-4)
-
某转2—2余数
-
某转10—某幂
-
10转某—某余数
-
-
负数 原码-倒过来—反码-加1—补码
-
ASCII表:字符被替换成十进制数字;数字即字符、字符即数字
-
不可显示字符:\n'=换行; '\t'=Tab(对对齐); \b=退格(删除其实); \r=回车
-
常用的ASCII码:'A'=65 , 'a'=97 【大小写差32】;'0'=48
-
- 逻辑运算符(判断真-非0;假-0)
&&、||、! (b=5; !b=0)
优先级:!> 关系运算符> || >&&
||&&从左到右,一旦成功表达式1,不再判断执行表达式2
例如:x=2; printf("%d ", 'A'&&(x=6)); printf("x=%d ", x); 输出:1_ x=6
- 复合赋值运算符
- 右⬅左
- += -= /= *=
-
例如:a=12; a+=a-=a*a 得出 - 264
- (++)与(--)
-
只能用于变量,表达式不行
-
看到式子就先搞左的,运算后,再右的
-
例如:a=1; b = (++a*a++)+(++a); 得出a=4; b=7
-
-
赋值过程中的类型转化书本62.07bmaybe
- 常用数学函数<math.h>
- fabs(x)——绝对值
- pow(x,y)——x的y次方
- sqrt(x)——根号x
- 常见的程序
- 2、整数计算(两整数相除为整数,要小数 . 一下)(参与%的必须为整数)
- 即加减乘除:5/2=2;2/5=0;5%2=1;2%5=2(余本身);除数不为0
- 5、分离位数
- 个位=n%10 十位=n/10%10 百位=n/100 以此类推
- 6、#define宏变量
- #define A 123(无分号)程序里的A全部替代为123
- 闰年
- 需满足①能被4整除,但 不能被100整除。②能被400整除;
(year%4==0 && year%100!=0) || year%400==0
- 需满足①能被4整除,但 不能被100整除。②能被400整除;
- putchar()函数
- putchar(c); 显示参数c所表示的一个字符。参数c可以是字符型常量、字符型变量或整型变量。类printf
- getchar()函数
- getchar();//不需要参数。接收从键盘输入的一个字符(包括空白字符)。类似scanf
- 例如:c=getchar();printf("%d" , c); 输入A 输出65
- 例如:printf("%04c" , getchar() ); 输入A输出000A
- 2、整数计算(两整数相除为整数,要小数 . 一下)(参与%的必须为整数)
- 顺序结构
//输入两个整数x和y,交换二者的值,然后输出
#include <stdio.h>
int main()
{
int x, y, temp;
scanf("%d%d", &x, &y);
temp = x; //将x的初值赋予变量temp
x = y; //仅改变变量x的值,y的值不变
y = temp; //变量y被赋予新的值,原值被覆盖
printf("%d %d\n",x,y);
return 0;
}
- 选择结构if & switch
-
if语句
#include<stdio.h> int main( ) { if(表达式)【非0为真,0为假;真就执行,假就跳过 】【if(n)=if(n!=0);本来就是判断表达式是否为0,所以没差】 语句1; 【if到这个; 】 else if(表达式)【x=100是赋值!!得==】 语句2;【复合语句要打包成语句块 ,语句块结尾不要;】 else 语句3; return 0; }
{if(a>b)
max=a;
else
max=b;} 等价于max=(a>b)?a:b; - switch语句
#include<stdio.h>//switch通常用在多分支的 int main() { char grade; scanf("%c",&grade); switch (grade)//括号里只能整形&字符型,不能浮点数 { case'A':printf("优");break; //case标记作用(必须是不同常量),break跳出 case'B':printf("良"); printf("haha"); break; case'C':printf("合格");break; case'D': case'F':printf("不合格");break; default :printf("滚");//如果没有default,跳到后面。 } return 0; } //若没有printf后面的,就跳到下一行;即多个case共用一组执行 //case后的语句组,不要{ }
-
例:② 运输公司对用户计算运输费用。路程(s km)越远,每吨·千米运费越低。标准如下:
s < 250 没有折扣 250 ≤ s < 500 2%折扣 500 ≤ s < 1000 5%折扣
1000 ≤ s < 2000 8%折扣 2000 ≤ s < 3000 10%折扣 3000 ≤ s 15%折扣#include <stdio.h>//利用了折扣变化点,和除法只保留整数的特点 int main() { int c,s; float p,w,d,f; printf("please enter price,weight,discount:"); scanf("%f,%f,%d",&p,&w,&s); c = (s>=3000)?12:(s/250); switch (c) { case 0: d=0; break; case 1: d=2; break; case 2: case 3: d=5; break; case 4: case 5: case 6: case 7: d=8; break; case 8: case 9: case 10: case 11: d=10; break; case 12: d=15; break; } f = p * w * s * (1 - d / 100); printf("freight=%10.2f\n",f); return 0; }
-
-
循环结构while、do..while、for
-
while语句
while函数【计数循环】 #include<stdio.h> int main() { int x; while(判断条件)//没条件就while(1) { 循环 } return 0; }
例如·:求班级53人平均成绩
#include <stdio.h> int main() { int i=0; double total,average,mark; while (i < 53) { scanf("%lf", &mark); total += mark; i++; } average=total/53.0; printf("%.2f",average); return 0; }
-
例如:输入两个整数,分别输出他们的最大公约数和最小公倍数
#include <stdio.h>//辗转相除法 int main() { int a,b,x,y; scanf("%d %d",&a,&b); x=a*b; y=a%b; while(y) { a=b; b=y; y=a%b; } printf("最大公约数是:%d;最小公倍数是:%d",b,x/b); return 0; }
-
do....while
do while函数【不确定循环】 #include<stdio.h> int main() { int x; do { 循环 }while(循环条件);//记得" ; " 复合语句记得加大括号 //经常是while ((c=getchar())!='\n') //putchar(c); return 0; }
例如:输入一个非负整数,并进行逆向显示,输出要求忽略最高位的0, 如输入,2100,输出12;
#include <stdio.h> int main() { int x,n,i; do { scanf("%d",&x); if(x<=0) printf("请输入正整数\n"); }while(x<0); while(x>0) { i=x%10;//个位数 n=n*10+i;//前进一位+个位数 x/=10;//撇了个位数 } printf("%d",n); return 0; }
-
for语句
#include<stdio.h> int main() { int x; for(初始条件;判断条件;循环变量更新) { 循环 } return 0; }
-
for嵌套循环
-
????
#include <stdio.h> int main() { int i,j; for(i=5;i>0;i--)//五行,\n;其实这一步就是很巧妙的让下面简单很多 { for(j=1;j<6-i;j++) //做前面空格嫁妆,第一排1个 第二排2个 printf(" "); for(j=1;j<=2*i-1;j++) //每排*的个数 printf("*"); printf("\n"); } return 0; }
- ②百钱买百鸡
公鸡5块,母鸡3块,小鸡1/3块,100块钱买了一百只鸡,请问各买几只?#include <stdio.h> int main() { //这道题两个条件1、一百只鸡2、一百块钱 int rooster,hen,chick; for(rooster=0;rooster<=20;rooster++) { for(hen=0;hen<=33;hen++) { chick=(100-5*rooster-3*hen)*3; if(chick+rooster+hen==100) printf("公鸡%d只 母鸡%d只 小鸡%d只\n",rooster,hen,chick); } } return 0; }
-
-
break语句
-
用于①switch语句的case分支中、②循环结构的循环体中 !!只能这两!!
-
作用是在满足某种条件时跳出循环,故常与if搭配【结束他所在的循环体的循环】
- 例如:在全系1000学生中,征集慈善募捐,当总数达到 10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目
#include <stdio.h> int main() { int student; double money,sum; for(student=1;student<=1000;student++) { scanf("%lf",&money); sum+=money; if(sum>=100000) break; } printf("捐款人数是:%d 人均捐款:%.2lf",student,sum/student); return 0; }
-
-
continue语句
-
for/while/do…while语句的循环体中【爱if】
-
满足某种条件时中止本次循环,就是跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断【节省循环时间】看不懂,——已看懂
#include <stdio.h> int main() { int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(j==i+1) continue; printf("*"); } printf("\n"); } return 0; }
例如:要求输出100~200之间的不能被3整除的数
#include <stdio.h> int main() { int i; for(i=100;i<=200;i++) { if(i%3==0) continue; printf("%d ",i); } return 0; }
-
-
-
数组
-
用来批量表达函数,可以先存储后运算
-
double s[100] 【这一批数字有100个】【这批数据类型一样都是double】
s[i-1] 【表示第i个数】;因为一切从0开始,所以得 i - 1 / / a[5]是第6个数 -
一维数组:类型符 数组名[常量表达式] // 数组的名称并不是变量
-
例如:
int n=5,a[10], b[5]={1,2,3,4,5};
a[0]=a[5]+a[7]-a[2*3] 合法
a[n]=20; 合法
/*int c[4]={0,1}; 相当于int c[4]={0,1,0,0};
int b[5]={1,2,3,4,5}; 可写为 int b[ ]={1,2,3,4,5};*/ -
例如:有6个人的代号,要求对它们按由小到大的顺序排列【冒泡泡】
#include <stdio.h> int main() { int i,j,t,a[10]; printf("input 10 numbers :\n"); for (i=0; i<10; i++) { scanf("%d",&a[i]);//循环输入10个数 } printf("\n");//跳出后回车 for (j=0;j<9;j++)//此循环为了固定一下 { for (i=0;i<9-j;i++) //开始冒泡泡 { if (a[i]>a[i+1]) //让最大的数沉淀到a[9] t=a[i]; a[i]=a[i+1]; a[i+1]=t; //通过辗转得到ai+1为大,ai为小 } printf("the sorted numbers :\n"); } for (i=0; i<10; i++) printf("%d ",a[i]); //从小到大输出 printf("\n"); return 0; }
-
二维数组:int a[3][6] ; 就是有横纵的。3为行,6为列
-
初始化:int a[2][3]={{1,2,3},{4,5,6}}; 可以跳过其中的某行,对其他行进行赋值
等价于=int a[ ][4]={1,2,3,4,5,6}; -
二维数组转置:
1 2 3 变成 4 1
4 5 6 5 2
6 3#include<stdio.h> int main( ) { int a[2][3]={1,2,3,4,5,6},b[3][2],i,j; printf("array a: \n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%4d ",a[i][j]); b[j][i]=a[i][j]; }printf("\n"); } printf("array b:\n"); for(i=0;i<3;i++) { for(j=0;j<2;j++) { printf("%4d ",b[i][j]); }printf("\n"); } return 0; }
-
有一个3×4的矩阵,要求编程序求出其中值最大 的那个元素的值,以及其所在的行号和列号。
#include<stdio.h> int main( ) { int a[3][4]={38,47,10,24,46,37,57,2,28,1,4,3},max,row,colum; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) if(a[i][j]>max) { max=a[i][j]; row=i+1; colum=j+1; } } printf("%d %d %d",max,row,colum); return 0; }
-
字符数组(scanf输入不能带空格。不然直接跳下一个。
-
初始化:char a[3]={'Y','e','s'};
-
字符串数组:string
1、一定用‘\0’表示结束(其acsii表—0)【'0'与'\0':\0不可见只是用来结束用的,'0'acsii为48】
2、char a[4]={"Yes"}; 【{}加不加无所谓】
3、printf("%s" , a[4]);
4、输入:
①逐个字符输出: int n = -1; scanf("%c" , &a[++n]);
②直接字符串输入: char a[3] ; scanf(" %s ", a);
③多个字符串输入,以“空格”为界 切换下一个字符串
5、使用字符串函数时候#include <string.h>
输出:puts(数组名称);
输入:gets(字符数组); (不会被空格分隔,只被回车)(超出的话会覆盖电脑里其他重要东西,不安全)
所以输入选择了fgets。fgets(字符名,个数,stdin); 其实只输入个数-1个,stdin占\0
strcat将多个字符数组拼接到第一个数组里面去:strcat(字符数组1 , 字符数组2); char str1[30]="abcd"; char str2[]="efj"; printf("%s" , strcat(str1,str2)); 输出:abcdefj 所以第一个[]要足够大
strcpy(数组1,数组2); 将2复制进入1 char str1[10]; str2="emm"; printf("%s" , strcpy(str1,str2)); or printf("%s" , strcpy(str1, "emm"));
strncpy:将2的前n个复制到1去;strncpy(str1,str2,4);复制一点的话不包括\0,n不能超过1的长度
strcmp:比较字符串大小(acsii码表里的顺序);strcsmp(str1,str2);若1=2,函数值为0;1>2,函数为正整数;1<2,负整数;例如:if(strcmp(str1,str2)>0)
strlen:测量字符串长度,不包含\0. printf(“%d” , strlen(数组名称))
strlwr转小写,strupr转大写
memset:给数组赋值,按字节赋值。char a[10];memset(a,0,sizeof(a));将数组赋值为0;(一个整数,4个字节,如果memset(a,1,5)只是赋值了一个数字+一个字节。)
-
-
关灯问题:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关 (这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打 开,开着的灯将被关闭),依此类推。一共有k个人,问最后由哪些灯开着?输入:n 和k,输出开着的灯的编号。0<=k<=n<=1000。
样例输入:7 3,样例输出:1 5 6 7#include<stdio.h> int main( ) { int n,k; int a[n],b[k],i,j; int x[1001]={0};//0表示黑灯,1表示亮灯 scanf("%d %d",&n,&k); a[i]=i; b[j]=j; for(j=1;j<=k;j++) { for(i=1;i<=n;i++)//让灯和人进入循环 { if(i%j==0)//如果灯号是人号的倍数 { if(x[i]==1)//如果这个灯本来亮着,就关了它 x[i]=0; else//如果不是,就开灯 x[i]=1; } } } for(i=0;i<=n;i++)//上面开开关关完了,现在来看一下谁开谁关 { if(x[i]==1) printf("%d ",i); } return 0; }
-
输入一个3x3的整数矩阵,把以正中心的数字为轴左转90度后输出。
#include <stdio.h> int main() { int a[3][3]; int i,j; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { scanf("%d",&a[i][j]);//输入 } scanf("\n"); } for(j = 0; j <3; j++) { for( i = 2; i >=0; i--) { printf("%3d",a[i][j]);//结果是从左下角向上打。说实话。有点没看懂。 } printf("\n"); } return 0; }
-
统计单词数
#include<stdio.h> int main() { char s[81],c; int i,num=0,word=0; fget(s,81,stdin); for(i=0;(c=s[i]!='\0');i++) { if(c==' ') word=0; else if(word==0) { word=1;num++; } printf("%d word\n",num); } return 0; }
-
3个字符串比较大小/和数字比较大小对比学习
#include<stdio.h> #include<string.h> int main() { char str[3][10],string[10]; int i; for(i=0;i<3;i++) { fgets(str[i],10,stdin); } if(strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); if(strcmp(str[2],string)>0) strcpy(string,str[2]); printf("\nthe largest:\n%s\n",string); return 0; }
-
高精度加法
输入两个1000位以内的正整数,输出他们的和。输入123456789 987654321 输出1111111110.
字符转数字-‘0’#include<stdio.h> #include<string.h> char sa[1001],sb[1001]; int i,a[1001],b[1001],c[1001];int la,lab; int main() { scanf("%s %s",sa,sb); la=strlen(sa);lb=strlen(sb); memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c)); for(i=0;i<la;i++)//低位对齐 a[la-i-1]=sa[i]-'0'; for(i=0;i<lb;i++) b[lb-i-1]=b[i]-'0'; lc=la>lb?la:lb; for(i=0;i<lc;i++) { c[i]=a[i]+b[i]+c[i]; if(c[i]>=10) { c[i+1]=1; c[i]=c[i]-10; } } if(c[lc]>0)lc++; for(i=lc-1;i>=0;i--) printf("%d",c[i]); return 0; }
-
-
函数
-
函数定义
#include<stdio.h>//??? int f(int x) { int r = 2*x; return r; } int main() { scanf("%d",&x) printf("%d",f(x)); return 0; }
-
函数没有返回值,就用viod
#include<stdio.h> void greeting() { printf("Good morning!\n"); } int main() { greeting(); return 0; }
-
无参函数、有参函数、空函数
无参函数 int f(void)//or f() { 函数体 } 有参函数 int add(int a,int b) { int res; res=a+b; return res; } 空函数 void f() { }
-
调用函数(返回值)
-
函数类型 函数名(实参表列)【无参函数括号里可以没东西,多个,隔开】
//简单看点 #include <stdio.h> int max(int a,int b) { int c; c=a>b?a:b; return c; } int main() { int x,y,z; scanf("%d%d",&x,&y); z=max(x,y); printf("%d",z); return 0; }
调用函数截止于第一个return。
-
-
调用函数
//两数比大小 #include<stdio.h> int max(int a, int b); int max(int a,int b) { if(a>b) return a; else return b; } int main() { int x,y,c; scanf("%d%d",&x,&y); c=max(x,y); printf("%d",c); return 0; }
-
-
-
-
指针
-
指针-变量地址;数组-变量本身 //*取值; &取地址 p:指针变量-地址; *p:指向这个地址中的数值
char *a = &b;
printf("%c",*a);
-
-
递归
//年龄问题5小孩 #include<stdio.h> int age(int n); int age(int n) { } int main() { printf(
-
阶乘
#include<stdio.h> int fact(int n); int fact(int n) { int x; if(n>0) x=n*fact(n-1); else x=1; } int main() { int x,y; scanf("%d",&x); y=fact(x); printf("%d",y); }
汉诺塔
//64盘子的汉诺塔 #include
-