Linux C系列学习笔记_第四集

局部变量和全局变量可以重名,作用域遵循就近原则

#include <stdio.h>
int a = 10;                     //全局变量a
void fun()
{
    printf("1.%d\n", a);
    int a = 1;
    //a = 1;
    printf("2.%d\n", a);            
}
int main()
{
    int a = 8;                   //局部变量
    //a = 8;   			           //改全局变量的值
    fun();
    printf("3.%d\n", a);
    return 0;
}

输入输出

1.1按字符输入输出

getchar

函数:

int getchar(void);

功能:向终端输入一个字符

参数:无

返回值:终端输入的字符的ASCII码值

int res=getchar();
printf("%d\n",res);

putchar

函数:

int putchar(int c);

功能:终端输出一个字符

参数:字符的ASCII码值

返回值:字符的ASCII码值

putchar没有换行的效果,需要额外添加

  int res=getchar();
    putchar(res);
    int num=putchar('\n');//putchar(10);
    // printf("%d\n",num);

1.2按格式输入输出

printf

#include <stdio.h>

int printf(const char *format, ...);

功能:按指定的格式向终端输出

参数:多个

返回值:正确输出字符个数

格式:

%d                 int

%c                char

%f                 float

%lf                 double

%s                 字符串

%p                 指针

%o                 八进制 %#o

%x                十六进制 %#x

printf("hello\n");
int a=0x123;
printf("%#x\n",a);
int b=456;
printf("a:%d b:%d\n",a,b);

scanf

#include <stdio.h>

int scanf(const char *format, ...);

功能:按指定的格式向终端输入 (输入完毕时以回车结束)

参数:多个

返回值:正确输入的字符个数

第一个字符输入格式错误,直接返回0

scanf格式必须和终端输入格式一一对应,不能加'\n'

变量名前边加&(取地址符),表示取变量的地址

int a=0;
scanf("%d",&a);
printf("a:%d\n",a);
=====================
int a=0,b=0;
scanf("%d %d",&a,&b);
printf("a:%d b:%d\n",a,b);

垃圾字符回收

2.1 通过空格回收

可以回收一个或多个空格 tab 回车

2.2 %*c 抑制符

char c=0,d=0;
scanf("%c%*c%c",&c,&d);
printf("c:%c d:%c\n",c,d);

2.3 getchar

scanf输入结束时,会在终端输入'\n';

解决'\n'对程序造成的影响:

示例程序

#include <stdio.h>
int main()
{
	// int res = getchar();//取第一个字母
	// putchar(res);
	// putchar('\n');
	// printf("ascii=%d\n", res);
	// int num = putchar('\n');//( \n = 10 )putchar(10);
	// printf("%d\n",num);
	char a, b;
	printf("输入两个字母\n");
	scanf("%c %c", &a, &b);
	//scanf("%d%*c%d", &a, &b);
	//scanf("%c", &a);
	//scanf("%c", &b);
	getchar();
	printf("a:%c b:%c\n", a, b);
	printf("输入两个字母\n");
	scanf("%c %c", &a, &b);
	getchar();
	printf("a:%c b:%c\n", a, b);
	return 0;
}

if循环

基本结构:

if(常量值或表达式)
{
	//代码块;
}
=====================
int age=10;
    if(age>18)
    {
        printf("work\n");
    }
========================
if(常量值或表达式)
{
	//代码块1;
}
else
{
	//代码块2;
}
===========================
int age=10;
    if(age>18)
    {
        printf("work\n");
    }
    else
    {
        printf("study\n");
    }

多层分支

if(表达式1)
{
	代码段1;
}
else if(表达式2)
{
}
else
{
}

例题:

终端输入一个年份,判断平年或闰年:

#include <stdio.h>
int main()
{
	int year = -1;
	while (1)
	{
		printf("输入年份,-1退出\n");

		scanf("%d", &year);
		getchar();

		if (year < 0)
			break;
		else if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
		{
			printf("%d 是闰年\n", year);
		}
		else
		{
			printf("%d 不是闰年\n", year);
		}
	}
}

终端输入大写,输出小写;输入小写,输出大写

输入其他报错

#include <stdio.h>
int main()
{
	char c;
	while (1)
	{
		printf("输入一个字母判断其大小写\n");
		scanf("%c", &c);
		getchar();
		printf("%c ", c);
		if (c >= 'A' && c <= 'Z')
		{
			printf("是大写字母\n%c\n", c + 32);
		}
		else if (c >= 'a' && c <= 'z')
		{
			printf("是小写字母\n%c\n", c - 32);
		}
		else
		{
			printf("输入错误\n");
			break;
		}
	}
	return 0;
}

注意:

  1. if后边可以没有else, else前边必须有if
  2. 分支语句代码块只有一句时,可以省略{ }

switch

switch(常量值或表达式)

{

case 常量值1:

代码块1;

break;

case 常量值2:

代码块2;

break;

default:

代码块n;

break;

}

例题:

输入成绩输出等级

100-90: A

89-80: B

79-70: C

<70: 补考

#include <stdio.h>
int main()
{
	int grade = -1;
	while (1)
	{
		printf("输入成绩\n");
		scanf("%d", &grade);
		getchar();
		if (grade < 0 || grade > 100)
			break;
		switch (grade / 10)
		{
		case (10):
		case (9):
			printf("A");
			break;
		case (8):
			printf("B");
			break;
		case (7):
			printf("C");
			break;
		default:
			printf("你无敌了");
			break;
		}
		printf("\n");
	}
	return 0;
}

注意:

  1. case后边的常量值是整型或字符型,不能是浮点型或字符串
  2. case分支遇到break结束; 后边可以没有break,会从符合条件的分支开始一直运行到整个switch语句执行完才结束

练习题:

终端输入一个日期,判断是这一年的第几天

闰年2月29天,平年2月28天

使用case无脑方法:

#include <stdio.h>
int main()
{
	int year, month, day;
	int runnian;
	printf("输入年 月 日\n");
	scanf("%d %d %d", &year, &month, &day);
	getchar();
	if (month > 12 || day > 31)
	{
		printf("输入错误\n");
		return 0;
	}
	if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
		runnian = 1;
	else
		runnian = 0;

	switch (month)
	{
	case (1):
		printf("是一年的第 %d 天\n", day);
		break;
	case (2):
		printf("是一年的第 %d 天\n", day + 31);
		break;
	case (3):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian);
		break;
	case (4):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31);
		break;
	case (5):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30);
		break;
	case (6):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31);
		break;
	case (7):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30);
		break;
	case (8):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30 + 31);
		break;
	case (9):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30 + 31 + 31);
		break;
	case (10):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30 + 31 + 31 + 30);
		break;
	case (11):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31);
		break;
	case (12):
		printf("是一年的第 %d 天\n", day + 31 + 28 + runnian + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30);
		break;
	default:
		printf("输入错误");
		break;
	}

	return 0;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值