文章目录
第一周:程序设计与C语言
1.1 计算机和编程语言
程序的执行
解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行。
编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言——机器语言——写的程序,然后,这个机器语言写的程序就能直接执行了。
1.3 第一个C程序
#include<stdio.h>
int main()
{
printf("Hello World\n")
return 0;
}
第二周:计算
2.1 变量
变量定义的一般形式:
<类型名称><变量名称>;
变量需要一个名字,变量的名字是一种“标识符”,意思是它用来识别这个和那个的不同的名字。标识符有标识符的构造规则。基本的原则是:标识符只能由字母、数字和下划线组成,数字不可以出现在第一个位置上,C语言的关键字(有的地方叫它们保留字)不可以用做标识符。
变量类型:
C是一种有类型的语言,所有的变量在使用之前必须定义或声明,所有的变量必须具有确定的数据类型。数据类型表示在变量中可以存放什么样的数据,变量中只能存放指定类型,程序运行过程中也不能改变变量的类型。
定义一个常量变量:
const int Amount = 100;
浮点数
当浮点数和整数放到一起运算时,C会将整数转换成浮点数,然后进行浮点数的运算。
(foot + inch / 12.0) * 0.3048
2.2 表达式
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
---|---|---|---|---|
1 | + | 单目不变 | 自右向左 | a * +b |
1 | - | 单目取负 | 自右向左 | a * -b |
2 | * | 乘 | 自左向右 | a * b |
2 | / | 除 | 自左向右 | a / b |
2 | % | 取余 | 自左向右 | a % b |
3 | + | 加 | 自左向右 | a + b |
3 | - | 减 | 自左向右 | a - b |
4 | = | 赋值 | 自右向左 | a = b |
表达式 | 运算 | 表达式的值 |
---|---|---|
count++ | 给count加1 | count原来的值 |
++count | 给count加1 | count+1以后的值 |
count– | 给count减1 | count原来的值 |
–count | 给count减1 | count-1以后的值 |
第三周:判断
3.1 判断
关系运算符的优先级:
比算术运算符低,但比赋值运算符高。判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右进行的。
if语句
if(total > count){
total += amount + 10;
}
if语句这一行结束的时候并没有表示语句结束的“;”,而后面的赋值语句写在if的下一行,并且缩进了,在这一行结束的时候有一个表示语句结束的“;”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。
==嵌套的判断:==当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句。
==else的匹配:==else总是和最近的那个if匹配
tips: 在if或else后面总是用{},即使只有一条语句的时候。
常见错误:
- 忘了大括号
- if后面的括号
- 错误使用==和=(if只要求()里的值是零或非零)
- 使人困惑的else
建议:
- 在if和else之后必须加上大括号形成语句块;
- 大括号内的语句缩进一个tab的位置
//计算时间差
#include <stdio.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, im);
return 0;
}
//判断三个数的最大值
// max3.c
#include <stdio.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);
return 0;
}
//else if
#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;
}
3.2 分支
级联的if-else if
if(x < 0){
f = -1;
}else if(x == 0){
f = 0;
}esle{
f = 2 * x;
}
多路分支switch-case
switch(控制表达式){
case 常量:
语句
......
case 常量:
语句
......
default:
语句
......
}
- 控制表达式只能是整数型的结果
- 常量可以是常数,也可以是常数计算的表达式
- 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止
- 如果所有的case都不匹配,那么就执行default后面的语句;如果没有default,那么就什么都不做
- switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。
#include <stdio.h>
int main()
{
printf("输入成绩(0-100)");
int grade;
scanf("%d", &grade);
grade /=10;
switch ( grade ) {
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("F\n");
break;
}
return 0;
}#include <stdio.h>
int main()
{
printf("请输入月份:");
int month;
scanf("%d", &month);
switch ( month )
{
case 1: printf("January\n"); break;
case 2: printf("February\n"); break;
case 3: printf("March\n"); break;
case 4: printf("April\n"); break;
case 5: printf("May\n"); break;
case 6: printf("June\n"); break;
case 7: printf("July\n"); break;
case 8: printf("August\n"); break;
case 9: printf("September\n"); break;
case 10:printf("October\n"); break;
case 11:printf("November\n"); break;
case 12:printf("December\n"); break;
}
return 0;
}
#include <stdio.h>
int main()
{
printf("请输入月份:");
int month;
scanf("%d", &month);
switch ( month )
{
case 1: printf("January\n"); break;
case 2: printf("February\n"); break;
case 3: printf("March\n"); break;
case 4: printf("April\n"); break;
case 5: printf("May\n"); break;
case 6: printf("June\n"); break;
case 7: printf("July\n"); break;
case 8: printf("August\n"); break;
case 9: printf("September\n"); break;
case 10:printf("October\n"); break;
case 11:printf("November\n"); break;
case 12:printf("December\n"); break;
}
return 0;
}
第四周:循环
4.1 循环
验证:测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等,个位数、10、0、负数。
do while 和while 的区别:
do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
4.2 循环的应用
整数的分解:
- 一个整数是由1至多位数字组成的,如何分解出整数的各个位的数字,然后加义计算
- 对一个整数做%10的操作,就得到它的个位数;
- 对一个整数做/10的操作,就去掉了它的个位数;
- 然后再对2的结果做%10,就得到原来数的十位数了;
- 依此类推。
//求平均数
#include <stdio.h>
int main()
{
int sum = 0;
int count = 0;
int number;
scanf("%d", &number);
while ( number != -1 ) {
sum += number;
count ++; //计数器
scanf("%d", &number);
}
double dsum = sum;
printf("The average is %f.\n", dsum / count);
return 0;
}
//猜数字游戏
#include <stdio.h>
int main()
{
int number = rand()%100+1;
int count = 0;
int a = 0;
printf("我已经想好了一个1到100之间的数。");
do {
printf("请猜这个1到100之间数:");
scanf("%d", &a);
if ( a > number ) {
printf("你猜的数大了。");
} else if ( a < number ) {
printf("你猜的数小了。");
}
count ++;
} while (a != number);
printf("太好了,你用了%d次就猜到了答案。\n", count);
return 0;
}
//整数逆序
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
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);
return 0;
}
习题解析
/*4-0 求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。*/
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
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++;
}
return 0;
}
/*水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例如:153 = 13 + 53+ 33。本题要求编写程序,计算所有N位水仙花数。*/
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int first = 1;
int i = 1;
while( i<n ){
first *= 10;
i++;
}
printf("first=%d\n",first);
//若n为3,则需遍历100-999
i = first;