三级C语言.txt
别妄想泡我
884次浏览
2020年08月02日 08:13
最佳经验
本文由作者推荐
喊口令技巧-日晷怎么读
长整型: 65000 25 17 9900000 0
实型: 3.14159 2.56 300
字符型: 'a' 'b' '9' '*' '!'
字符串型: "windows" "硬件" "abcde" "a"
科学计数法常量: 2e3 4e-2 56.78e1
e前必有数,e后必整数
变量:1)变量名必须以 _ 及字母开头,可包含数字
2)变量名不能与关键字重名
int Int=500;
类型: 整型: 500 20 -3 int %d
长整型: 987654 20 -3 long %ld
实型:单精度: 3.14 25.67 890 float %f
双精度: 3.14 25.67 890 double %lf
字符型: 'a' 'b' '*' '!' '9' char %c
必须以单引号括起且只占一个宽度
char k='M'; char k="M";
char k="windows"; char k='abc';
字符串: "windows" "abcde" "硬件" char 数组名[] %s
必须以双引号括起且多一个'0'标志
↓
字符串的结束标志
char k[]="windows"; char k="windows";
char k[]='abc'; char k[7]="windows";
char k[4]="windows"; char k[100]="windows";
sizeof():计算空间大小
注:符号常量: #define 符号 值
如: #define k 500
二.运算符/表达式:
1.算术运算符: + - * / %:a.求余两端必整型
b.求余符号与前者相同
38%7 38%-7 -38%7 -38%-7
3 3 -3 -3
利用求余特性来判断是否能被几整除
k%5=====>0 a%b===>0
来判断奇偶数
k%2====>0 :偶数
k%2!=0 :奇数
注:1)头文件的作用:调用库函数
格式:#include "_______.h"
如: #include "math.h"
abs():求绝对值(针对整型)
fabs():求绝对值(针对实型)
sqrt():求平方根
pow(x,y):求x的y次方
2)整型与整型永远是整型
10/3=3 9/2=4 872/100=8
例:求 1/2+1/3+1/4+1/5=?
3)整型与字符型可混合计算
int char
%d %c
利用这个特性来实现: 大小写的转换
大写+32===>小写 小写-32====>大写
来实现: 数字/字符的转换
'9'=======>9 '9'-'0'=====>9
9========>'9' 9+'0'======>'9'
2.关系运算符: > >= < <= = == !=
赋值 判断
if(甲=乙) if(甲==乙)
注: 优先级别: 自左向右 k=3<4<5 ===> k=1
3.逻辑运算符: 非 > 与 > 或
! && ||
if( a>b&&c>d)
例:找出满足条件的数,要求能被5或7整除,但不能同时
被5和7整除
35 21 15
if(k%5==0||k%7==0&&k%35!=0)
解1: if((k%5==0||k%7==0)&&k%35!=0)
解2: if(k%5==0&&k%7!=0||k%7==0&&k%5!=0)
例:找出外语系或法律系的女生
if(系="外"或系="法且性别="女" )
if((系="外"或系="法)且性别="女" )
注: 1)if中不允许连大连
小连等
if(a>b>c) if(a>b&&b>c)
if(a=b=c) if(a==b&&b==c)
2)与的非是或,或的非是与
if(!(x>3&&x<10)) ===> if( x<=3 || x>=10)
4.赋值运算符:
普通赋值: = a=7 b='M' k=65.23
注:定义时不能连等赋值
int a=b=c=100;
a.先定义,再连等 int a,b,c; a=b=c=100;
b.定义时分开赋值 int a=100,b=100,c=100;
复合赋值: += -= *= /= %=
a+=3;======>a=a+3;
k*=5;======>k=k*5;
c-=10;=====>c=c-10;
如: a*=b+c; ===>a=a*b+a*c;
===>a=a*b+c;
自加/自减运算: i++ ++i i-- --i
i=5;
k=i++; 先赋再加:先把i赋予k,然后i再自加1
k=5 i=6
i=5;
k=++i; 先加再赋:先让i自加1,然后再把i赋予k
i=6 k=6
m=10; m++; ++m;
5.强制类型转换:
格式: (类型名) 表达式
如: int k; float a=36.57;
k=(int) a;
注:1)强制类型只转换离它最近的表达式
2)强制类型转换对原有数据类型不破坏
k=(int) a+b;
题型:精度计算(保留2位小数的四舍五入)
k=56.7368========>56.74
k*=1000;
k=(long)((k+5)/10);
k/=100;
k=56736.8
k=56741.8==> k=5674.18====>k=5674
k=56.74
6.逗号表达式
表达式1,表达式2,表达式3,.....表达式n
注: N 关 逻 条 赋 逗
k=5+2*7<8||3*7>5-2;
k=5+14<8||21>3
k=19<8||21>3
7.条件表达式
表达式1? 表达式2:表达式3
如: k=a>b? a:b; k=a>b?a+3:b-5;
例:找出 a,b,c的大数max
max=a>b?a:b;
max=max>c?max:c;
例:找出 a,b,c,d四数的最大数max
m=a>b?a:b;
n=c>d?c:d;
max=m>n?m:n;
三.输入输出函数: 通常用到 #include "stdio.h"
1.输出函数:
printf(): 格式符: %d %ld %f %lf %c %s
%nd/%-nd a.超长,左补空格,不够原样输出 b."-"表示右补空格
%和%- %% %x %o %e
%X %O
注: C语言提供十进制,八进制,十六进制常量
以0开头 以0x/0X开头
int k=1011010
转义符:
b t ' " ddd xdd
puts():输出一个字符串,它等效于printf中的%s
putchar():输出一个字符,它等效于printf中的%c
2.输入函数:
scanf(): &
格式: scanf("格式符",地址表列)
如: scanf("%d%d",&a,&b);
注:默认的分隔符为 空格 回车 TAB键
输入格式必须一致
*表示跳过输入
例:输入任意两整数,并求两数之和
gets():表示输入一个字符串,它基本等效于scanf中的%s
例:输入任意一个串,并将它原样输出
gets与scanf中%s的区别
注:数组名本身代表数组的首地址
getchar():表示输入任意一个字符,它等效于scanf中的%c
getchar(k); k=getchar();
第三讲.语言的控制结构
语言的控制结构: 顺序/选择/循环
编程原则:宁简勿繁
例:编程实现任意两元素互换 a=500 b=800
解1: a=b; a=800
b=a; b=800
解2:
a=a+b; a=1300
b=a-b; b=1300-800=500
a=a-b; a=1300-500=800
解3:
t=a; t=500;
a=b; a=800;
b=t; b=500;
一.顺序结构:
main()
{ ---------;
---------;
---------;
}
题型:1)互换原理:
t=甲;
甲=乙;
乙=t;
2)精度计算(保留2位小数四舍五入)
k*=1000;
k=(long)((k+5)/10);
k/=100;
例:输入一个正数,求该数的平方根
sqrt
二.选择结构:
1.基本格式:
if(条件) if(条件) if(条件)
{语句系列;} -------;1 {-------;1
-------;2 -------;2
-------;3 -------;3
}
2.转向格式:
if(条件) if(条件)
{ 语句系列1;} ---------;1
else ---------;2
{语句系列2;} else
---------;3
---------;4
变例:嵌套格式:
if(条件1) if(条件1)
{ if(条件2) { if(条件2)
--------;1 } if(条件3)
else --------;1 }
---------;2 else
----------;2
注:else总是跟它最近的if配对且不允许跨越括号
例:找出a,b,c三数中的最大数max
解1.
if(a>b&&b>c) max=a;
if(a>c&&c>b) max=a;
6个if
解2.
if(a>b&&b>c||a>c&&c>b) max=a;
3个if
解3.
if(a>b&&a>c) max=a;
3个if
解4.两两比较法(推荐)
if(a>b) max=a; if(a>b) max=a;
else max=b; else max=b;
if(max>c) max=max; if(max
解5.条件表达式
max=a>b?a:b;
max=max>c?max:c;
解6.嵌套格式:
if(a>b) if(a>b)
if(b>c) if(a>c)
max=a; max=a;
else if(a>c) else
max=a; max=c;
else else if(b>c)
max=c; max=b;
else if(b>c) else
max=b; max=c;
else
max=c;
例:找出a,b,c三数中的最大数max及最小数min
习题:
例:找出a,b,c三数中最中间的数mid
if(a>b&&b>c||c>b&&b>a) mid=b;
if(c>a&&a>b) mid=a;
if(a>c&&c>b) mid=c;
解2:
mid=a+b+c-max-min;
例:将a,b,c三数从小到大排序
解1:换输出语句
解2:交换原理
排序前:a,b,c
排序后:a,b,c
if(a>b) {t=a; a=b; b=t;}
if(a>c) {t=a; a=c; c=t;}
if(b>c) {t=b; b=c; c=t;}
三.循环结构:
循环
格式: for(变量=初值;终值(条件);增量)
{语句系列;}
如: for(i=10;i<=40;i++)
for(a=3;a<=59;i+=4)
for(k=200;k>=60;k--)
例:将一个字符串输出5次
例:求1+2+3+4+5+......100=?
s+=i;(s不断地累加i)
求1+3+5+7+9+.....99=?
2+4+6+8+10+.....100=?
10!=? 1*2*3******10=?
题型:分子分母法:
例: 求 5+1/2+2/3+3/4+4/5+5/6+......99/100=?
分子循环
for(i=1;i<=99;i++)
s+=i/(i+1);
分母循环
for(i=2;i<=100;i++)
s+=(i-1)/i;
例:求 8+1/3+3/5+5/7+7/9+......97/99=?
例: 有一数列 1*2 2*3 3*4 4*5 5*6 ,求该数列的
3*4, 4*5, 5*6,6*7,7*8
前20项之和
题型:异号类
例: 求 1-2+3-4+5-6+7-8......100=?
解1: 1 3 5 7 9 ....===>s1
2 4 6 8 10....===>s2
s=s1-s2
解2:全当正的编
int m=1 s=0
for(i=1;i<=100;i++)
{s+=i*m; m=-m;}
例:求 8-1/3+3/5-5/7+7/9-9/11........97/99=?
求 1-3+5-7+9-11+13-15.......99=?
题型:同步循环
for(i=1;i<=100;i++)
如 for(a=1,b=7; a<=100; a++,b++)
for(a=3,b=20; a<=50; a+=5,b+=7)
for(a=1,b=3; a<=99; a+=4,b+=4)
s+=a-b;
s=0+ 1-3 +5-7 +9-11
题型:循环中加条件
例: 输出1---100中能被3整除的偶数
输出1----1000之内能被5或7,但不能同时被
5和7整除的数
例: 输出100----999的水仙花数
分析:
for(i=100;i<=999;i++)
{ a=
b=
c=
if(i==a*a*a+b*b*b+c*c*c)
输出i
}
注:如何取出个/十/百/千? 永远是%10
9762===>9 9762/1000%10===>9
853====>8 853/100%10===>8
853====>5 853/10%10====>5
853====>3 853%10=======>3
例:输出2000----6000的所有回文数
回文数: 8888 6666 3773 5225 4994
变例:求 2000---6000中回文数的个数以及它们的和
cnt++ sum+=数
例:统计1000---5000中满足千+个=百+十的数的个数
并求它们的和
习题:统计 100----999中满足百>十>个 的数的个数
并求它们的和
2.跳出循环: break;
例:将一个字符串输出5次
题型:素数类
素数:>=2的正整数
11 13 5 19 17
例:输入任意一个正整数,判断是否为素数
flag原理: 11 25
flag=1;
for(i=2;i<=数-1;i++)
if(数%i==0) {flag=0; break;}
else flag=1;
当循环结束 if(flag==1) 是素数
else 不是素数
3.多重循环(二重/三重)
for(a=1; a<=100; a++)
for(b=1; b<=100; b++)
for(c=1; c<=100;c++)
例:百钱买百鸡 数量
1只公鸡: 5元 a
1只母鸡: 3元 b
3只小鸡: 1元 c
分析:
例: 输出100---999的水仙花数
例: 求满足的方程的解的个数,以及它们的和
要求 a-c=5 a+b+c=13
习题: 输出 10----100的所有素数
第四讲.数组
一.一维数组
1.定义
2.赋值
例:找出给定一维数组中的最大数max(起泡法)
int k[7]={34,128,-9,800,56,287,22}
例:找出给定一维数组中的最大数max及最小数min
例:有一歌手的分数保存在一个一维数组中
float k[7]={9.9, 9.5, 8.0, 10, 8.0, 10, 9.4}
求该歌手的最后得分
分析:
1)找最大值max及最小值min
2)对7个数求和==>sum
fs=(sum-max-min)/5
注:数组的下标必为整型
int k[7.8]
题型:找数存储: m[cnt++]=找到的数
例:将给定一维数组中能被5整除的数,存储至另一数组中
int k[7]={17,55,39,128,60,15,40}
cnt=0
m[0]=55 cnt=1
m[1]=60 cnt=2
m[2]=15 cnt=3
m[3]=40 cnt=4
例:将给定一维数组中满足千+个=百+十的数,存储至另一数组中
int k[10]={2567,8562,3657,4852,6254,9632,5142,7457,6325,8574}
例:将给定一维数组中满足千>百>十>个的数,存储至另一数组中
题型:排序类(双重循环)
例:将给定一维数组中的数升序排序
int k[7]={34,128,-9,800,56,287,22}
解1: for(i=0;i<7;i++)
for(j=0;j<7;j++)
if(k[i]
{t=k[i]; k[i]=k[j]; k[j]=t;}
解2:
for(i=0;i<7;i++)
for(j=i+1;j<7;j++)
if(k[i]>k[j]) ===========>升序
{t=k[i]; k[i]=k[j]; k[j]=t;}
例:有一歌手的分数保存在一个一维数组中
float k[7]={9.9, 9.5, 8.0, 10, 8.0, 10, 9.4}
求该歌手的最后得分
分析: 1)先排序
2)sum+= 1----->5 (去掉第0个/第6个)
fs=sum/5
例:找出给定一维数组中的次最大数cmax
900 900 900 800 700 600 300 200 100 100 100
int k[10]={300,800,900,500,800,900,100,700,100,900}
例:
分析: 1)先降序
2)从1----->最后 <第[0] 就是cmax
题型:找数排序
a.先找数(单循环): m[cnt++]=找到的数
b.再排序(双循环):
例:将给定一维数组中能被5整除的数降序存储至另一数组中
int k[10]={12,-37,55,17,60,15,-3,20,100,93}
例:将给定一维数组中满足千>百>十>个的数并升序存储至
另一数组中
int k[10]={6254,9632,2568,7452,
6210,5862,7431,8520,2365,5723}
例:将给定一维数组中的素数降序存储至另一数组中
int k[10]={100,17,5,23,11,97,66,24,19,48}
题型:数列类 ? ? ? ? ?
例:有一数列 0 1 1 2 3 5 8 13 21 34 55 89......
求该数列的第15个数
分析: k[i]=k[i-2]+k[i-1]; (固定前2,i=2)
例:有一数列 1 2 5 10 17 26 37 50 65 82......
求该数列的第15个数
规律1:
k[i]=k[i-1]+? (固定前1,i=1)
规律2: 平方+1
k[i]=i*i+1 (无需固定,i=0)
例:有一数列 0 1 1 2 3 5 8 13 21 34 55 89.....
求数列中不大于500的最大的那个数
二.二维数组(双重循环)
1.定义及赋值 行 列
定义: 类型名 数组名[下
标1][下标2];
如: int k[3][4]; float b[4][5]; char c[5][100];
赋值:
int k[3][4]={{2,6,7,8},
{3,5,4,1},
{9,8,2,6}}
for(i=0;i<3;i++)
for(j=0;j<4;j++)
例:将3*4矩阵中所有元素求和
例:求一个 5*5矩阵中右上半角元素之和
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if( )
sum+=k[i][j];
右上半角: if(i<=j)
右下半角: if(i+j>=4)
左上半角: if(i+j<=4)
左下半角: if(i>=j)
两条对解线: if(i==j||i+j==4)
周边元素之和: if( i==0||i==4||j==0||j==4)
非周边元素之和: if(i!=0&&i!=4&&j!=0&&j!=4)
if(i*j%4==0)
例:将给定的二维数组按行降序排序
int k[4][5]={{2,5,6,7,1},
{6,3,2,1,4},
{5,9,8,3,4},
{2,8,6,3,7}}
for(i=0;i<行;i++)
{
按行操作
}
例:找出给定二维数组中每行的最大数
for(i=0;i<行;i++)
{
冒泡法
}
题型:复合排序
for
for
if 1<2 =======>表示先按第一种情况的升序排
t交换
else if 1==2 ====>表示若第一种情况相等
if 3>4 =====>表示再按第二种情况的降序排
t交换
例:将给定的一维数组中的数先按后三位的升序排,
若后三位相等,再按原数的降序排
int k[10]={2567,3146,8567,5146,3333,6567,9146,6333,
2333,7567}
9146 5146 3146 6333 3333 2333 8567 7567 6567 2567
注:如何取出后三位? 永远是%1000
5146======>146 5146%1000===146
例:将给定的一维数组中的数先按个位的降序排
若个位相同,再按百位的升序排
int k[10]={256,347,912,386,157,752,476,957,682,652}
三.字符串数组
char k[]="windows";
1.字符串函数: 必须用到 #include "string.h"
strlen(串):求字符串的长度(不含'0')
a:"windows"; m=strlen(a);===>m=7
for(i=0;i
strcat(串1,串2):字符串连接函数
a:"windows" b:"abcde"
strcat(a,b); a==>"windowsabcde" b:不变
memset(串,0,长度):清零
char a[100]; memset(a,0,100);
strcpy/strncpy: 字符串复制函数
strcpy(串1,串2): 永远拷到结束
a:"windows" b:"abcde"
strcpy(a,b); a===>"abcde" b:不变
变例:strcpy(串1,&串2[?])
strcpy(a,&b[2]); a===>"cde" b:不变
strncpy(串1,串2,n):
a:"windows" b:"applestudent"
strncpy(a,b,5); a====>"applews" b:不变
变例:strncpy(串1,&串2[?],n)
注:为避免出现'0'错误,凡定义一个新串,最好用
memset将串清零
strcmp(串1,串2):字符串比较函数
(不是比较长度,而是逐个比较ASCII码值)
正值: 串1>串2
0: 两串相等
负值: 串1<串2
注:若 a,b是数
if(
a>b) if(a==b) a=b;
若 a,b是串
if(strcmp(a,b)>0) if(strcmp(a,b)==0) strcpy(a,b);
2.字符函数: 必须用到#include "ctype.h"
1)isalpha():判断是否为字母
if(k[i]>='a'&&k[i]<='z'||k[i]>='A'&&k[i]<='Z')
if(isalpha(k[i]))
2)islower()/isupper():判断是否为小写/大写字母
if(k[i]>='a'&&k[i]<='z')
if(islower(k[i]))
例:将给定的字符串升序排序
char k[]="aayyeeffbbcc"
例:将给定的字符串中第一个字符移至最后,剩余字符
依次前移.
如: "windows"=====>"indowsw"
分析: t=k[0];
for(i=1;i
k[strlen(k)-1]=t;
例:将给定的字符串逆序存储
如:"windows"=====>
"swodniw"
串=====>文章类
例:将一篇英文文章按行逆序存储
char k[4][80]={"she is a good student.",
"Welcome to Beijing!",
"Nice to see you!",
"Chinese is our native language."}
for(i=0;i<行;i++)
{ 按行操作
}
例:将一篇英文文章按行升序排序
char k[4][80]={"yyzzaaffeebb",
"66331155998844",
"AANNMMFFHH",
"aa22bb5588BB77AA"}
题型: 左右题型(凡牵扯到右半部分,必须考虑奇偶数)
windows windowsk
奇数:
左半: 0--- <总长/2 右半: 总长/2+1------ <总长
0 2 4 6
偶数:
左半: 0--- <总长/2 右半: 总长/2 ------- <总长
0 3 4 7
if(总长%2!=0)
n=总长/2+1; =============> n=(总长+1)/2;
else
n=总长/2;
小结:
头尾循环: for(i=0;i<总长;i++)
左半循环: for(i=0;i<总长/2;i++)
右半循环: n=(总长+1)/2;
for(i=n; i<总长;i++)
逆序: for(a=0,b=总长-1; a左右互换: n=(总长+1)/2;
for(a=0,b=n; a<总长/2; a++,b++)
例:将给定的字符串左右互换
如: "windows"============>
"owsdwin"
例:将一篇英文文章按行实现左右互换
char k[4][80]={"112233AABBCC",
"ABC345",
"5687",
"abcde"}
例:将一篇英文文章左半升序后再左右互换
char k[4][80]={"231yzh",
"5721abcd",
"221144bbeeff",
"yyaahh445566"}
分析:
for(i=0;i<4;i++)
{
左半升序
n
左右互换
}
例:将给定的一篇英文文章按行实现左降右升
char k[4][80]={"231yzh",
"5721abcd",
"221144bbeeff",
"yyaahh445566"}
例:将给定字符串中所有的小写字母改成它的下一个字母
如果是'zif(k[i]>='a'&&k[i]<='y')
k[i]+=1;
else if(k[i]=='z')
k[i]='a';
例:将给定字符串中所有的大写字母改成它的上一个字母
如果是'A)
max=k[i];
例:将本班学生按学号的降序排序
南开百套机试题库
1.函数体外已定义的变量无需再定义
2.C语言的大小写有严格的区别
3.无需输出语句
语句若出现在循环中,本身可当跳出循环使用
(与 break 作用完全相同 )
一.排序类:(共计45题)
1.结构体排序:(计12题)
7 12 13 31 32 38 42 47 61 99 60 75
复合排序:
for
for
if 1<2 ===>表示先按第一种情况的升序排
t交换
else if 1==2 ==>表示若第一种情况相同
if 3>4 ====>表示再按第二种情况的降序排
t交换
找数排序:
a.先找数(单循环): m[cnt++]=找到的数
b.再排序(双循环)
for( )
{
if( )
m[cnt++]=找到的数;
}
for
for
if <
t交换
2.找数排序(计27题)
2 15 27 28 29 48 51 52 53 54 55 68 69 72
76 77 78 85 86 89 14 30 45 46 5 6
48.
if(k4+k1==k3+k2)
51.
注: isP()/ isprime()/ isPrime() 均表示判断是否
为素数
if(isprime(ab)&&isprime(cd)&&k4!=0&&k1!=0)
52.
if(ab%2!=0&&cd%2!=0&&(ab%5==0||cd%5==0)
&&k4!=0&&k3!=0)
53.
if(k4-k3-k2-k1>0)
54.
if(k4+k3==k2+k1)
55.
for(i=0;i<300;i++)
if(isP(a[i]))
b[cnt++]=a[i];
59.
if(ab
if(k1%2!=0&&k2%2!=0&&k3%2!=0&&k4%2!=0)
69.
if(k4-k3-k2-k1>=0&&a[i]%2!=0)
72.
if(ab%2==0&&cd%2==0&&(ab%9==0||cd%9==0)
&&k1!=0&&k3!=0)
76.
if( (ab+cd)%2!=0
&&(ab%17==0||cd%17==0) &&k1!=0&&k3!=0 )
77.
if(k4+k2==k3+k1&&a[i]%2==0)
78.
if(k4>=k3&&k3>=k2&&k2>=k1&&a[i]%2!=0)
86.
if(ab>cd&&ab%2==0&&ab%5==0&&cd%2!=0&&k4!=0&&k1!=0)
14------46
连续大于以后的5个数:
0---194 if(a[i]<=a[i+j]) {flag=0; break;}
连续小于以前的5个数
5---199 if(a[i]>=a[i-j]) {flag=0; break;}
5--6
注:如何取出后三位? 永远是%1000
8536=====>536 8536%1000
3.字符串排序:
9 88 43 44 50 71
头尾循环 for(i=0;i<总长;i++)
左半循环 for(i=0;i<总长/2;i++)
右半循环 n=(总长+1)/2;
for(i=n; i<总长; i++)
逆序: for(a=0,b=总长-1; at交换
左右互换 n=(总长+1)/2;
for(a=0,b=n; a<总长/2; a++,b++)
t交换
for(i=0;i<行;i++)
{
按行操作;
}
串----------->文章
英文文章: for(i=0;i
1.字符串替换(计11题)=====>反向
8 18 36 37 56 62 95 96 97 98 74
if(新<=32||新>130) if(新>32&&新<=130)
原=原 反向 原=新;
else ==========>
原=新
原:xx[i][j] 新:k
注: if(原是小写) =========>if(!原是小写)
if(islower(xx[i][j]))