第二章
变量的赋值与初始化
<类型名称><变量名称>=<初始值>;
int price = 0;
int amount =100;
//组合变量定义的时候,也可以在这个定义中单独给单个变量赋初值
int price = 0,amount = 100;
s
//C99的写法与ANSIC的不同在于变量的要在开头的地方就进行定义
//C99
int price = 0;
printf("Please enter price:");
scanf("%d",&price);
int change = 100 - price;
printf("return your money:%d\n",change);
//ANSIC
int price = 0;
int change = 0;s
printf("Please enter price:");
scanf("%d",&price);
change = 100 - price;
printf("return your money:%d\n",change);
常量、变量、浮点数
const int AMOUNT = 100
/* C99的写法
const是一个修饰符,加在int前面,表示这个变量一旦被初始化就不能再次修改了
*/
#include<stdio.h>
int main()
{
int a;
int b;
printf("Please enter two number: ");
scanf("%d %d",&a,&b);
printf("%d + %d = %d\n",a, b , a+b);
return 0;
}
/*任何两个int 相乘除得到的结果也只会是整数
%f */
#include<stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸,"
"如输入\"5 7\"表示5英尺7英寸:");
int foot;
int inch;
sacnf("%d %d",&foot,&inch);
printf("身高是%f米。\n",
((foot + inch /12.0)* 0.3048));
return 0;
}
#include<stdio.h>
int main()
{
printf("请分别输入身高的英尺和英寸,"
"如输入\"5 7\"表示5英尺7英寸:");
double foot;
double inch;
sacnf("%lf %lf", &foot, &inch);
printf("身高是%f米。\n",
((foot + inch /12.0)* 0.3048));
return 0;
}
/*
整数输入出用%d
带小数点的数输入用%lf 输出用%f
*/
表达式
//计算时间差
#include<stdio.h>
#include <stdlib.h>
int main()
{
int hour1 , minute1;
int hour2 , minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2;
int t = t2-t1;
printf("时间差是%d小时%d分。",t/60,t%60);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
/*
计算银行复利
1年的定期利率是3.3%连续自动转存3年,所得就是 x(1+3.3%)^3
*/
int main()
{
int x;
scanf("%d",&x);
double amount = x*(1+0.033)*(1+0.033)*(1+0.033);
printf("%f",amount);
system("pause");
return 0;
}
交换变量
#include<stdio.h>
int main()
{
int a = 5;
int b = 6;
int t;
t=a;
a=b;
b=t;
printf("a=%d,b=%d\n",a,b);
return 0;
}
复合赋值
1.赋值符号的优先级最小,在复合赋值当中,会先把右边算式当中的运算先进行运算,然后再赋值给左边的变量
2.前置和后置是不一样的,++a说明a先加1再赋值,而a++是先赋值再加1
第三章
做判断
#include<stdio.h>
#include <stdlib.h>
int main()
{
int hour1 , minute1;
int hour2 , minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int ih = hour2 - hour1;
int im = minute2 - minute1;
if(im<0){
im = 60 + im;
ih--;
}
printf("时间差是%d小时%d分。\n",ih/60,im%60);
system("pause");
return 0;
}
优先级
所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高。
7>=3+4 int r = a>0
//第一个式子先加法然后进行比较,第二个先比较再赋值
判断是否相等的==和!=的优先级比其他的要低,而连续的关系运算是从左到右进行的
5>3==6>4 //先比较再看是否相等
6>5>4 // 6>5》1>4》0
if
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbwlOSsb-1684216628056)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666680325977.png)]
有没有大括号的情况下是不一样的
嵌套的if-else
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int max = 0;
if (a>b)
{
if(a>c){
max=a;
}else{
max=c;
}
} else{
if (b>c)
{
max = b;
}else
{
max = c;
}
}
printf("The max is %d\n",max);
system("pause");
return 0;
}
级联的if-else if-if
分段函数
f(x)= -1;x<0
f(x)= 0;x=0
f(x) =2x;x>0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEl4As7C-1684216628057)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666681835899.png)]
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
int f=0;
if(x<0){
f=-1;
}else if(x==0){
f=0;
}else if(x>5){
f=2 * x;
}else{
f = 3*x;
}
printf("%d\n",f);
return 0;
}
if-else的常见错误
1.忘记添加大括号
2.if后面不要加分号 if(age>60);这种写法是错误的
多路分支
switch-case
控制表达式只能是整数类型的结果
常量可以是常数也可以是常数计算的表达式
case只是路牌,只有break才能跳出break
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPOgAb1l-1684216628058)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666683521879.png)]
第四章
循环-输入一个数判断这个数是几位数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHo1RPEe-1684216628058)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666684218518.png)]
但是如果是一个贼长的数字呢??
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int n=0;
scanf("%d",&x);
n++;
x /=10;
while (x>0)
{
n++;
x /=10;
}
printf("%d\n",n);
system("pause");
return 0;
}
do-while循环
do-while在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足再继续循环体的内容,否则就退出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gq6NVUxU-1684216628059)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666686165023.png)]
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int n = 0;
scanf("%d",&x);
do
{
x /=10;
n++;
} while (x>0);
printf("%d",n);
system("pause");
return 0;
}
循环计算
在计算之前用其他的变量保留x的值,后面输出再用那个变量代替
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int ret = 0;
//scanf("%d",&x);
x=128;
int t =x;
while (x>1)
{
x /= 2;
ret ++;
}
printf("log2 of %d is %d.",t,ret);
system("pause");
return 0;
}
改变条件初始值ret等于-1,while条件判断x>0
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int ret = -1;
//scanf("%d",&x);
x=128;
int t =x;
while (x>0)
{
x /= 2;
ret ++;
}
printf("log2 of %d is %d.",t,ret);
system("pause");
return 0;
}
将n–与输出的语句换顺序,会有不一样的结果变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoyN7pFB-1684216628060)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666688488732.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfy0nanN-1684216628061)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666688542188.png)]
猜数游戏
//让计算机想一个数然后用户猜,每输入一个数就告诉用户是大了还是小了直到猜中,最好告诉用户猜了多少次
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
int number = rand()%100+1;
int count = 0;
int a = 0;
printf("Already had one number from 1 to 100");
do
{
printf("Please guess this number from 1 to 100:");
scanf("%d",&a);
count++;
if (a > number )
{
printf("your number was too large ");
}else if (a < number)
{
printf("your number was too small ");
}
} while (a != number);
printf("so good ,you have used %d times solove the answer \n",count);
system("pause");
return 0;
}
算平均数
#include<stdio.h>
#include<stdlib.h>
int main(){
int number;
int sum = 0;
int count = 0;
scanf("%d",&number);
while (number != -1)
{
sum += number;
count ++;
scanf("%d",&number);
}
printf("%f\n", 1.0*sum/count);
system("pause");
return 0;
}
整数逆序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-be9ddM3H-1684216628062)(C:\Users\dean ambrose\AppData\Roaming\Typora\typora-user-images\1666699268415.png)]
这道题的灵魂在于 ret*10的巧妙
倒序输出12345
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
//scanf("%d",&x);调试
x=12345;
int digit;
int ret = 0;
while (x > 0)
{
digit = x%10;
//printf("%d",digit);
ret = ret*10 + digit;
printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
x /= 10;
}
printf("%d",ret);
system("pause");
return 0;
}
输出700》》007,保留了00
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
//scanf("%d",&x);调试
x=700;
int digit;
int ret = 0;
while (x > 0)
{
digit = x%10;
printf("%d",digit);
ret = ret*10 + digit;
//printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
x /= 10;
}
printf("%d",ret);
system("pause");
return 0;
}
第五章
for循环
阶乘的计算
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int fact = 1;
int i = n;
/*for ( i = 1; i <= n; i++)
{
fact *= i;
}*/
for ( ; n>1; n--)
{
fact *= n;
}
printf("%d!=%d\n",i,fact);
system("pause");
return 0;
}
Tips for choose
如果有固定的次数就用for
如果必须执行一次就用do while 循环
其他情况下用while
for(i=0;i<5;i++){printf("i=%d",i);}
printf("\n最后i=%d\n",i);
//结果:i=0 i=1 i=2 i=3 i=4 循环5轮 最后 i=5
for(i=1;i<=5;i++){printf("i=%d",i);}
printf("\n最后i=%d\n",i);
//结果: i=1 i=2 i=3 i=4 i=5 循环5轮 最后 i=6
循环控制
求素数
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
scanf("%d", &x);
int i;
int isPrime = 1; //是素数 证伪
for( i = 2; i<x ; i++){
if (x % i == 0)
{
isPrime = 0;
break;
}
}
if ( isPrime = 1)
{
printf("是素数\n");
}else{
printf("不是素数\n");
}
system("pause");
return 0;
}
关于break与continue
break意为直接跳出循环,continue表示跳过这一轮循环接着走下一轮的循环。
嵌套的循环
如何求出100以内的素数??
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
for ( x = 1; x<=100; x++)
{
int i;
int isPrime = 1;
for ( i = 2; i < x; i++)
{
if (x%i==0)
{
isPrime = 0;
break;
}
}
if (isPrime==1)
{
printf("%d ",x);
}
}
system("pause");
return 0;
}
列出正整数前50个素数
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int cnt = 0;
//for (x=1;cnt<50;x++){
x = 1;
while (cnt < 50)
{
int i;
int isPrime = 1;
for ( i = 2; i < x; i++)
{
if (x % i == 0)
{
isPrime = 0;
break;
}
}
if (isPrime ==1)
{
cnt ++;
printf("%d\t",x);
if ( cnt %5 == 0)
{
printf("\n");
}
}
x++;
}
system("pause");
return 0;
}
从嵌套的循环中跳出
break与continue只能对它所在的那层循环做
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int one ,two ,five;
int exit = 0;
scanf("%d",&x);
for (one = 1; one < x*10; one++){
for ( two =1;two < x*10/2;two++){
for (five =1 ;five < x*10/5;five++){
if (one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个五角得到%d元\n",
one,two,five,x);
exit = 1;
break;
}
}
if (exit == 1) break;
}
if (exit == 1) break;
}
system("pause");
return 0;
}
前n项求和
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdTAvyTH-1684216628062)(…/TyPircture/1667024789765.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYxYbAnq-1684216628063)(…/TyPircture/1667025363070.png)]
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
int i;
double sum = 0.0;
//int sign =1;
double sign = 1.0;
scanf("%d",&n);
for (i = 1;i<=n; i++){
sum += sign/i; //sum+=sign*1.0/i
sign = -sign;
}
system("pause");
return 0;
}
整数分解 integer factorization
输入:13425 输出:1 3 4 2 5
视频5.3.2
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
scanf("%d",&x);
x=10;
int mask = 1;
int t = x;
while (t>9)
{
t /= 10;
mask *=10;
}
printf("x=%d, mask=%d\n",x,mask);
do{
int d = x / mask;
printf("%d",d);
if (mask > 9)
{
printf(" ");
}
x %= mask;
mask /= 10;
}while (mask > 0);
printf("\n");
system("pause");
return 0;
}
求最大公约数
枚举法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PJ5sWwIj-1684216628064)(…/TyPircture/1667029855151.png)]
辗转相除法
#include<stdio.h>
#include<stdlib.h>
/*
如果b等于0,计算结束,a就是最大公约数
否则,计算a除以b的余数,让a等于b,而b等于那个余数;回到第一步
a b t
12 18 12
18 12 6
12 6 0
6 0
*/
int main()
{
int a,b;
int t;
scanf("%d %d", &a, &b);
a=12;b=18;
while (b!= 0){
t = a%b;
a=b;
b=t;
printf("a=%d,b=%d,t=%d\n",a,b,t);
}
printf("gcd=%d\n",a);
system("pause");
return 0;
}
第六章
编程练习解析
给定条件的整数集合
题目:给定不超过6的正整数A,考虑从A开始连续的4个数字,请输出所有由它们组成的无重复数字的3位数
从小到大,每行6个,空格分开,行末不要有空格
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a;
//scanf("%d", &a); 调试
a=6;
int i,j,k;
int cnt = 0;
i=a;
while (i<=a+3){
j = a;
while (j<=a+3){
k=a;
while (k<=a+3){
if (i!=j && i!=k && j!=k ) {
cnt++;
printf("%d%d%d",i,j,k);
if (cnt==6)
{
printf("\n");
cnt=0;
}else{
printf(" ");
}
}
k++;
}
j++;
}
i++;
}
system("pause");
return 0;
}
水仙花数
题目:指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,153 =1的3次方+5的3次方+3的3次方
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
//scanf("%d",&n);
n=3;
int first = 1;
int i = 1;
while ( i<n ){
first *= 10;
i ++;
}
printf("first=%d\n",first);
//遍历100-999
i = first;
while ( i<first*10){
int t = i; //定义一个变量t去拆解,保留变量i
int sum = 0;
do{
int d = t%10;
t/=10;
int p =d; //int p = 1;
int j =1; //int j = 0;s
while (j<n){
p *=d;
j++;
}
sum += p;
}while(t>0);
if ( sum==i){
printf("%d\n",i);
}
i++;
}
system("pause");
return 0;
}
九九乘法表
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
n=9;
int i ,j;
i = 1;
while (i<=n)
{
j = 1;
while ( j<=i){
printf("%d*%d=%d",j,i,i*j);
if (i*j <10){
printf(" ");
}else {
printf(" ");
}
j++;
}
printf("\n");
i++;
}
system("pause");
return 0;
}
统计素数并求和
//统计给定整数M和N闭区间内素数的个数并且对他们求和
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n;
int i;
int cnt = 0;
int sum = 0;
scanf("%d %d", &m, &n);
if (m==1)
{
m=2;
}
for (i=m;i<=n;i++){
int isPrime = 1;
int k;
for (k=2;k<i-1;k++){
if (i%k==0){
isPrime = 0;
break;
}
}
//判断i是否为素数
if (isPrime){
//printf("%d",i);
cnt++;
sum+=i;
}
}
printf("%d %d\n",cnt,sum);
system("pause");
return 0;
}
C语言的数据类型
整数:char(8个bit)、short、int、long、long long
浮点数:float、double、long double
输入时int用%d,long用%ld(长整型),double用%lf
所表达的数的范围:char<short<int<float<double
int就是用来表达寄存器的
sizeof
一个运算符,给出某个类型或变量在内存中所占据的字节数
静态运算符,它的结果在编译时刻就决定了
不要在sizeof的括号内做运算,这些运算它不会做的
unsigned
unsigned char c = 255 //表示这个数不以补码的形式来表达负数
char c = 255 //输出为-1
//表达的负数会扩大一倍,但不能表达负数了
//扩展数字能表达的范围,初衷是为了做纯二进制运算,为了最高位的1不起作用
整数越界
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ZBHbI0b-1684216628065)(…/TyPircture/1667207554870.png)]
图一为char 图二为unsign char
整数类型的选择
没啥特殊需要就只用int 就行了
浮点数
float 输入%f 输出%f %e(科学计数法)
double 输入%lf 输出%f %e
输出精度
printf("%.3f\n",-0.0049)
printf("%.30f\n",-0.0049)
printf("%.3f\n",-0.00049)
char类型
char c
scanf("%c",&c); //1
printf("c=%d\n",c); //49
printf("c='%c'\n",c); //'1'
========================================
int i
char c
scanf("%d",&i); //1
c=i
printf("c=%d\n",c); //1
printf("c='%c'\n",c); //' '
=======================================
//混合输入
int i;char c;
scanf("%d %c",&i,&c);
printf("i=%d,c=%d,c='%c'\n",i,c,c);
12 1
12 49 '1'
12a
12 97 'a'
//不带空格的
scanf("%d%c",&i,&c);
printf("i=%d,c=%d,c='%c'\n",i,c,c);
12 1
12 32(空格的意思) ' '
12a
12 97 'a'
12 1
12 32 ' '
=======================================
char c; char d;
c=1; d='1';
printf("c=%d\n",c); //c=1
printf("d=%d\n",d); //d=49
在百分号之后没有空格意思是整数只读到整数结束为止
类型转换
自动类型转换
当运算符的两边出现不一致的类型时会自动转换成较大的类型
对于printf,任何小于int的类型会被转换成int,float会被转换成double
char>short>int>long>long long
int>float>double
强制类型转换
(类型)值
eg:(int)10.2 (short)32
只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变
强制类型转换的运算优先级比四则运算高
double a = 1.0;
double b = 2.0;
int i = (int)(a/b);
int a = 5;
int b = 6;
double d = (double)(a/b);
逻辑运算
如何表达数学中x属于(4,6)或x属于【4,6】
x>4&&x<6
判断一个字符c是否为大写字母:c>=‘A’&&c<=‘Z’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h1z7r6gk-1684216628066)(…/TyPircture/1667216546665.png)]
条件运算符与逗号运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfnABPlZ-1684216628067)(…/TyPircture/1667216658642.png)]
int i
i= 3+4,5+6;
printf
//输出的7
i=(3+4,5+6);
//输出的是11
nf(“%d”,&i); //1
c=i
printf(“c=%d\n”,c); //1
printf(“c=‘%c’\n”,c); //’ ’
//混合输入
int i;char c;
scanf(“%d %c”,&i,&c);
printf(“i=%d,c=%d,c=‘%c’\n”,i,c,c);
12 1
12 49 ‘1’
12a
12 97 ‘a’
//不带空格的
scanf(“%d%c”,&i,&c);
printf(“i=%d,c=%d,c=‘%c’\n”,i,c,c);
12 1
12 32(空格的意思) ’ ’
12a
12 97 ‘a’
12 1
12 32 ’ ’
=======================================
char c; char d;
c=1; d=‘1’;
printf(“c=%d\n”,c); //c=1
printf(“d=%d\n”,d); //d=49
**在百分号之后没有空格意思是整数只读到整数结束为止**
### 类型转换
#### 自动类型转换
*当运算符的两边出现不一致的类型时会自动转换成较大的类型*
*对于printf,任何小于int的类型会被转换成int,float会被转换成double*
char>short>int>long>long long
int>float>double
#### 强制类型转换
(类型)值
eg:(int)10.2 (short)32
只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变
强制类型转换的运算优先级比四则运算高
~~~c
double a = 1.0;
double b = 2.0;
int i = (int)(a/b);
int a = 5;
int b = 6;
double d = (double)(a/b);
~~~
### 逻辑运算
如何表达数学中x属于(4,6)或x属于【4,6】
x>4&&x<6
判断一个字符c是否为大写字母:c>='A'&&c<='Z'
[外链图片转存中...(img-h1z7r6gk-1684216628066)]
## 条件运算符与逗号运算符
[外链图片转存中...(img-gfnABPlZ-1684216628067)]
~~~c
int i
i= 3+4,5+6;
printf
//输出的7
i=(3+4,5+6);
//输出的是11
~~~