概述
“Hello world”
#include<stdio.h>
int main()
{
printf("Hello World!n");
return 0;
}
一些新手常见错误
- 没弄清赋值关系
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=a+b;
c=a-b;
c=a*b;
c=a/b;
c=a%b;
printf("%d+%d=%dn%d-%d=%dn%d*%d=%dn%d/%d=3n%d%%d=%dn",a,b,c,a,b,c,a,b,c,a,b,c,a,b,c);
return 0;
}
#include <stdio.h>
int main()
{
int a,b;
int c;
scanf("%d%d",&a,&b);
c=a+b;
printf("%d+%d=%dn",a,b,c);
c=a-b;
printf("%d-%d=%dn",a,b,c);
c=a*b;
printf("%d*%d=%dn",a,b,c);
c=a/b;
printf("%d/%d=%dn",a,b,c);
c=a%b;
printf("%d%%%d=%dn",a,b,c);
return 0;
}
- 逻辑运算没弄清
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>b+c||b>a+c||c>a+b)
printf("non-triangle.n");
else
if(a==b&&b==c)
printf("equilateral triangle.n");
else
if ((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a) )
printf("isoceles triangle.n");
else
printf("triangle.n");
return 0;
}
/* 很容易直接翻译数学关系 从而弄错逻辑运算 如何 a==b==c*/
-不熟悉位运算和非10进制
if ( a=0xA | a >12 )
if ( 011&10==a )
printf (”%d!n”,a);
else
printf (”Right!%dn”,a);
else printf (”Wrong!%dn”,a);
011&010 == 1001&1010=1000=0x08
simply printf()
字符
类比Hello World
计算 calculation
#include <stdio.h>
int main()
{
printf("23+43=%dn", 23+43);#%d代替后面的数值。
return 0;
}
情景运用
- 超市购物
#include <stdio.h>
int main()
{
int price = 0;
printf("请输入金额(元):");
scanf("%d", &price);
int change = 100 - price;
printf("找您%d元。n", change);
return 0;
}
- 输出整型变量x对应的十进制、八进制和十六进制形式
方法一:
直接使用控制字符串
%o 八进制
%X 十六进制
方法二:
函数 char *itoa(int value, char *string, int radix)
返回值类型char
参数value 待转换的数字
参数string 转换后存储到string中
参数radix 转换到几进制
定义在 stdlib.h
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int main()
{
int userinput;
printf("Please enter a integer.n");
scanf("%d",&userinput);
char octal[MAX],hex[MAX];
itoa(userinput,octal,8);
itoa(userinput,hex,16);
printf("Octal and Hex of the integer %d that you entered is %s and %s.n",userinput,octal,hex);
return 0;
}
————————————————
版权声明:本文为CSDN博主「Cytosine」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Cytosine/article/details/59189577
一些特殊公式
- 吉姆拉尔森公式
优化后的公式 : W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7
=(d-1+y+y/4-y/100+y/400+2(m+1)+3(m+1)/5)%7
公式原理
“计算”
变量
%c 字符 %s 字符串 %d 小数 &d 整数
- 变量自增自减运算
i++ 先使用变量的值 再加一++i 先加一 再使用变量的值
同上 i-- --i - 复合运算符
- List item
如何定义变量
int char double float
关于getchar
字符输入: ch=getchar()
字符输出: putchar(ch)
//结合循环可实现字符串输入输出
关于scanf函数
1.scanf(“%d”,&A)
%3d 从头开始取三位 小数点算一位
%.3d 小数点后三位
%3.2d 小数点前三位,后两位
利用getchar()进行特殊的读取
eg:读取未知长度的数字;
scanf(),getchar()灵活结合。
其中一些details
1.sqrt(x) 求平方根
2.整数相除结果只取整数部分,小数丢弃。
3.sanf()不可以指定数据格式%m.n 会造成语言系统不理解 如:%4.2f
4.余数的符号取决于被除数
5.求余对象必须是整型!
6.(int)x 强制取整
7.c语言没有专门的逻辑字符 一般用 0 1
8.c语言中单引号里放字符 双引号里放字符串
9.或运算如果前面已经为真 后面就不会算了
10 已知int i=1; 执行语句while (i++<4) ;后,变量i的值为 答案:(5)
理解i++。
10.左对齐
在打印数字宽度前面加一个“-”,假设数字宽度为2,如果要打印的位数小于2,则在后面补足空格,如果要打印的位数大于2,则打印所有的数字,不会截断。
右对齐
在%和d之间加上数字宽度
假设数字宽度为 2,如果要打印的位数小于 2,左边补足空格;如果要打印的位数大于 2,则打印所有的数字,不会截断。
- 计算机计算规则
已知:char c=‘A’; int i = 1, j;。执行语句 j = !c&&i++; 后,i 和 j 的值是:
答:1和0。
解析:c为真 !c则为假 &&后就不会执行了
if(!k)不等价与 if(k!=!0) 因为!0为1 后者意思为k!=1 显然与前者不同
11. 进制的表示
一、八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o),例如:
//合法的八进制数
int a = 015; //换算成十进制为 13
int b = -0101; //换算成十进制为 -65
int c = 0177777; //换算成十进制为 65535
//非法的八进制
int m = 256; //无前缀 0,相当于十进制
int n = 03A2; //A不是有效的八进制数字
二、十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头,例如:
//合法的十六进制int a = 0X2A; //换算成十进制为 42
int b = -0XA0; //换算成十进制为 -160
int c = 0xffff; //换算成十进制为 65535
//非法的十六进制
int m = 5A; //没有前缀 0X,是一个无效数字
int n = 0X3H; //H不是有效的十六进制数字
一些问题解决
#include <stdio.h>
main()
{
int a;
char b;
float c;
printf("Please input an integer:");
scanf("%d", &a);
printf("integer: %dn", a);
printf("Please input a character:");
getchar(); /*将存于缓冲区中的回车字符读入,避免被后面的变量作为有效字符读入*/
scanf("%c", &b);
printf("character: %cn", b);
printf("Please input a float number:");
scanf("%f", &c);
printf("float: %fn", c)
上一行的回车符会造成被后面当成变量输入 所以需要getchar()
常见错误:
–scanf(“%d,%fn”,&a,&b);
–scanf(“%d,%f”,a,b);
–scanf(“%7.2f”,&a);
scanf(“%d%c%d”,a,b,c)这种情况下输入时不能打空格。
- 4.double
double精度比float更高
double a;
scanf(“%f”,&a); //应用scanf(“%lf”,&a);
执行上面语句时,发现double类型的输入不能使用%f进行输入,得用%lf才能正常得到a的值。
而在输出double类型时却可以用%f,这是因为printf(“%f”,a);在执行时C自动将float型的参数转换成double型!!!!
故double型的输入输出形式如下:
double a;
scanf(“%lf”,&a);
printf(“%f”,a);
数据类型
- 隐式转换
精度低的向精度高的转换
- 强制转换
(数据类型)x
表达式
(条件)?语句一:语句二 ?仅高于赋值运算符
为真语句一赋值给x 否则语句二赋值给x
运算符优先级
&&与 ||或 !非
-逗号运算符,
a=(xxx,xxx,xxx);其值为最后一个表达式的值
- &取地址符 取指定变量的地址
- 取负运算符
将正数变负数 级别高 - ()通常用于改变运算次序
- []下标运算符 通常用于数组
已知int i,a; 执行语句"i=(a=23,a5),a+6;"后,变量i的值是 。 ( 30 )
赋值运算优先级高于逗号运算
if ( a=0xA | a >12 )
if ( 011&10==a )
printf (”%d!n”,a);
else
printf (”Right!%dn”,a);
else printf (”Wrong!%dn”,a);
① a=014时
第一个数为0,说明这个数是八进制
if(a=0xA | a>12):按照“运算符优先级”,先算a>12吗?八进制14等于十进制12,所以a不大于12。结果为0
第二步:0xA | 0 :十六进制A,按位或 0,结果肯定还是十六进制A了,任何数按位或0的话,等于任何数。所以这个if为真
第三步:if(011&10 == a):这里还是要考虑运算符的优先级,的优先级比&的优先级高,所以10a吗? 第二步可以看到,a的值已经变成0xA了,十六进制A等于十进制10,所以10a为真。真就是1
第四步:011&1 为真吗? 八进制011等于二进制1001,十进制1等于二进制0001,所以1001&0001 按位与后为0001 结果为真,所以执行printf(“%d!n”, a)
第五步:第二步已经把a改变了,所以a等于10,结果10!
②a=0x14时
0x为十六进制,十六进制14等于十进制20,等于二进制10100
解答:
1、还是优先级的问题,20大于12吗?yes,yes为真为1
2、十六进制A等于二进制1010
3、1010 | 0001 结果为1011等于十进制11,所以这个时候a=11
4、if(011&10a)
5、注意优先级 10==11吗?假,为0
6、011&0 八进制11,转化为二进制为1001&0000结果0000 假
7、第6的时候为假,所以执行else,结果为Right!11
结束!!
注意问题:
1、==的优先级大于&
2、>的优先级大于| 大于=
3、c语言是按顺序执行的,a=0xA | 先运算0xA,因为0xA后面有一个 | ,所以先执行| ,执行0xA | a,但是a后面有一个>,>的优先级又比|高,所以先执行>, 执行a>12,12后面没什么东西了,所以就先执行a>12 了。
4、考点:1、按顺序执行 2、运算符优先级
a=1+2+34 等于什么呢?按照数学的话,一眼看出来先执行34,但这里是C语言
按顺序执行,先执行1+2,2后面是+号,优先级一样,所以先执行1+2=3
3+34 — 3+3 但是3后面,所以这里就先执行*了,这时3+12
所以结果等于15
交换变量
转换
判断与循环
while语句
while(表达式)
for循环
新思路:双变量设置循环条件
switch
注意每一个case 中的 break
-case后每个常量必须各不相同。
-每个case后可执行语句可大于1,不必加{ }。
Demo1:
#include <stdio.h>
main ( )
{
int x=1, y=0, a=0, b=0;
switch ( x )
{
case 1: switch ( y )
{
case 0:
a++;
break;
case 1:
b++;
break;
}
case 2: a++;
b++;
break;
}
printf ("a=%d,b=%dn", a, b );
}
输出:a=2 b=1 易错:a=1 b=0
case1 后面没有break。
位运算
& 与
| 或
^异或
~ 求反 b=~a
x>>n x<<n移位号
转移语句
break
break语句的功能
1.在 switch 语句中结束 case 子句,使控制转到switch语句之外。
2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。
例C6_6101.C:求 555555 的约数中最大的三位数是多少?
main( )
{ int j; long n;
printf(“Please input number:”);
scanf(“%ld”, &n);
/* 所求约数取值范围999~100,j从大到小 /
for (j=999; j>=100; j–)
if ( n%j==0 ) / 若能整除j,则j是约数 /
{ printf(”3 digits in %ld=%dn”, n, j );
break; / 控制退出循环 */
}
}
continue
continue语句的功能
continue语句仅能在循环语句中使用.
它的作用不是结束循环,而是开始一次新的循环。
对于for语句,将控制转到执行表达式3和条件测试部分;
对于while和do-while语句,将控制转到条件测试部分;
从逻辑上讲,适当改变程序的结构就可以不需要使用continue语句。
goto
goto语句的功能
1、将控制转移到标号所指定的语句处继续执行。
2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。
goto语句的使用说明
在C语言中,goto 语句并不是必不可少的,使用 goto 语句的地方都可以用C的其它控制流程语句改写。
#include <stdio.h>
main( )
{ int a, b, c, d, i;
for (a=1; a<=5; ++a)
/* 在a的范围内穷举 */
for (d=1; d<=3; ++d)
/* 在d的范围内穷举 */
{
b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四项的和 */
c=a*(a+d)*(a+2*d)*(a+3*d); /* 前四项的积 */
if ( b==26 && c==880 )
/* 若满足条件 */
goto
out;
/* 退出二重循环 */
}
out:
/* 语句标号 */
for (i=0; i<=20; ++i)
/* 输出运行结果 */
printf("%d,", a+i*d);
}
return(难理解)
retunrn 语句格式
格式一:return;
格式二:return (表达式);
return 语句的功能
1.return语句使程序从被调用函数中返回到调用函数的调用处继续运行。
2.如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称为返回值。
数组
数组:一组具有相同数据类型的数据的有序的集合。
- 数组元素:构成数组的数据。数组中的每一个数组
元素具有相同的名称,不同的下标,可以作为单个变
量使用,所以也称为下标变量。
• 数组的下标:是数组元素的位置的一个索引或指示。
• 数组的维数:数组元素下标的个数。
一维数组
一维数组的定义方法为:
类型说明符 数组名[常量表达式];
一维数组通常和一重循环相配合,对数组
元素进行处理。
!!下标从0开始
赋值
例: int a[4]={1, 3, 5}
则a[0]=1,a[1]=3,a[2]=5,a[3]=0
int a[ ]={1, 3, 5}
相当于 int a[3]={1,3, 5}
二维数组
基本的初始化方法
如何给开头一个元素赋值
输出
二维数组的几种输出方式
同时熟悉字符数组的赋值及输出以及一些特殊函数。
例题:
#include <string.h>
main()
{char words[5][15]={{'