C语言学习笔记_MOOC浙大翁恺

第一周:程序设计与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后面总是用{},即使只有一条语句的时候。

常见错误:

  1. 忘了大括号
  2. if后面的括号
  3. 错误使用==和=(if只要求()里的值是零或非零)
  4. 使人困惑的else

建议:

  1. 在if和else之后必须加上大括号形成语句块;
  2. 大括号内的语句缩进一个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(" &#
  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值