前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【蓝桥杯系列】第一节 C的基本用法

【蓝桥杯系列】第一节 C的基本用法

作者头像
编程范 源代码公司
发布2018-04-18 12:05:21
1.1K0
发布2018-04-18 12:05:21
举报
文章被收录于专栏:C语言及其他语言

置顶编程范收获更多热门编程快讯

大家好,最近很多小伙伴向我反应小编!我参加了蓝桥杯但是我连那是什么都不知道,我该怎么训练?是不是在网站刷题就可以啊?

在这里我要回答的是刷题是必须的,著名土神(tourist)刷题超过10000道

每道估计40分钟,大约要7000个小时。可是说是地标最强【俄罗斯真是恐怖

当然我们做题是要有章法的,今天我们先统一学一遍C的基本用法

课前准备

  1. Dev-cpp
  2. C语言网

推荐课外学习教材:《算法竞赛入门经典(第2版)》 刘汝佳 编著 清华大学出版社

C语言

编程规范

  • 缩进
    • 代码 {} 内的所有代码加上一个 缩进(Tab)

12345678910111213

#include<stdio.h>int main(){ // 这是 main 函数的代码块 int radius; scanf("%d", &radius); if(radius > 10){ // 这是 if 语句的代码块 printf("输入的半径大于 10"); } // if 语句结束 else{ // 这是 else 语句的代码块 printf("输入的半径小于 10"); } // else 语句结束 return 0;} // main 函数结束

  • 标识符
    • ans:表示答案。
    • flag:表示标志。
    • sum:表示求和。
    • 除规定好的标识符规范之外,要求标识符尽量 有意义
    • 常用的标识符:

1234

int radius; // 表示半径double PI = 3.1415; // 表示圆周率double ans; // 表示答案

基本数据类型

关键字

类型名称

说明

int

整型

取值范围在 – 231 ~ 231 – 1(大约 21 亿)

short int

短整型

不常用

long int

长整型

取值范围在 – 231 ~ 231 – 1(与 int 范围等同)

long long int

取值范围在 – 263 ~ 263 – 1

float

单精度浮点数

不常用

double

双精度浮点数

char

字符型

1234567891011121314

#include<limits.h>#include<stdio.h>int main(){ // 测试下 int、long int、long long int 的最大值 printf("int %d\n",INT_MAX); printf("long int %ld\n",LONG_MAX); printf("long long int %lld\n", LLONG_MAX); // 注意 long long int 所用的占位符 return 0;}

几个常用的字符型常量

代码语言:javascript
复制
65

运算符、输入与输出

运算符

代码语言:javascript
复制
两侧操作数做加法运算

题目 1:输入一个半径,输出圆的面积。

123456789101112

#include<stdio.h>int main(){ double radius; // 输入需要一个变量进行存储 double PI = 3.1415926; scanf("%lf", &radius); // 输入 printf("%lf\n", PI * radius * radius); // 直接将表达式作为结果输出 return 0;}

如果对精度有要求:%.mlf // m 表示精度

12345678910111213141516

#include<stdio.h>int main(){ int a = 10; // 自增前缀运算符 printf("a = %d\n", a++); printf("a = %d\n", a); // 自增后缀运算符 a = 10; printf("a = %d\n", ++a); printf("a = %d\n", a); return 0;}

代码语言:javascript
复制
大于

逻辑运算符

作用

&&

逻辑与

||

逻辑或

!

逻辑非

在 C 语言中,非 0 即真。

位运算符

作用

&

按位与

|

按位或

^

按位异或

~

按位非

<<

左移

>>

右移

  • 赋值运算符 = 可以与其他运算符(除逻辑运算符)进行合并。
  • 类型转换
    • 表达式的结果的类型为操作数中精度最高的类型。
    • 高精度向低精度转换需要 强制转换

输入、输出

  • 格式输入输出函数

123

scanf("格式符", &变量1, &变量2, ...);printf("要输出的字符串、格式符以及转义字符", 变量1, 变量2, ...);

代码语言:javascript
复制
整型变量
  • 单字符输入输出函数

1234

char c;getchar(c); // 输入一个字符putchar(c); // 输出一个字符

  • 多字符输入输出函数

1234

char c[10];gets(c); // 输入一个字符串puts(c); // 输出一个字符串

gets 函数可以读取字符串中的空格,scanf 函数不能。

选择 | 循环

选择

1234567891011121314

if(条件){ // 条件成立则执行 语句;}else if(条件){ // 前面的条件不成立且当前条件成立则执行 语句;}...else{ // 前面所有套件都不成立 语句;}

题目2:输入三个数,输出最大值。

1234567891011121314151617181920212223242526272829303132

#include<stdio.h>int main(){ int a, b, c; scanf("%d%d%d", &a, &b, &c); // 注意占位符之间不需要空格,但输入时两个数字用空格或回车隔开 if(a > b){ if(b > c){ printf("%d\n",a); } else if(a > c){ printf("%d\n",a); } else{ printf("%d\n",c); } } else{ if(a > c){ printf("%d\n",b); } else if(b > c){ printf("%d\n",b); } else{ printf("%d\n",c); } } return 0;}

太麻烦了!

123456789101112131415161718

#include<stdio.h>int main(){ int a, b, c; scanf("%d%d%d", &a, &b, &c); int max = a; // 使用辅助的变量存储最大值 if(max < b){ max = b; } if(max < c){ max = c; } printf("%d\n", max); return 0;}

还可以用条件运算符或函数进行简化。

题目3:鸡兔同笼 一个笼子中同时装有一些鸡和一些兔,输入头和脚的个数,输出鸡和兔的数目,否则输出无法计算。

12345678910111213141516171819

#include<stdio.h>int main(){ int head, feet; scanf("%d%d", &head, &feet); if((feet % 2) || (feet < head * 2) || (feet > head * 4){ // 需要注意特殊情况 printf("无法计算\n"); } else{ int rabbit = (4 * head - feet) / 2; // 直接使用推导的公式 int chicken = head - rabbit; printf("chicken = %d\nrabbit = %d\n", chicken, rabbit); } return 0;}

开关语句

12345678910111213

switch(变量值){ // 变量值只能为 整型、字符型、浮点型 case 值1: // 变量值为值 1 时 语句; // 执行该语句 break; // 跳出 switch 语句,若省略则继续执行下面的 case case 值2: 语句; break; ... default: // 上面的 case 全部不成立时执行 语句; break;}

题目4:彩票中奖 若彩票号码为 123, 456, 789 中一等奖,为 147, 258, 369 中二等奖,为 159, 357, 555 中三等奖,其余号码均未中奖。

1234567891011121314151617181920212223242526272829

#include<stdio.h>int main(){ int num; scanf("%d",&num); switch(num){ case 123: case 456: case 789: printf("中一等奖\n"); break; case 147: case 258: case 369: printf("中二等奖\n"); break; case 159: case 357: case 555: printf("中三等奖"); break; default: printf("未中奖"); break; } return 0;}

循环

123456789101112131415

// while 循环while(条件){ 循环语句;} // do-while 循环do{ 循环语句;}while(条件) // for 循环for(初始化; 条件; 循环自增){ 循环语句;}

题目5:转换密码 按照转换规则,将一串密码转换成对应的密码。 规则:’A’ 转换成 ‘E’,’B’ 转换成 ‘F’,…,’Z’ 转换成 ‘D’(仅输入大写字符)。

123456789101112131415161718

#include<stdio.h>int main(){ char c; while((c = getchar()) != EOF){ // 注意这道题没有提示输入结束的标志 if(c >= 'A' && c <= 'Z'){ putchar((c - 'A' + 4) % 26 + 'A'); } else if(c >= 'a' && c <= 'z'){ putchar((c - 'a' + 4) % 26 + 'a'); } } putchar('\n'); return 0;}

scanf() 函数具有返回值,为输入正确输入的个数或 EOF。 getchar() 函数同样具有返回值,为输入正确的字符或 EOF。 当输入结束时,可以输入 Ctrl + Z 结束输入。

题目6:打印九九乘法表

12345678910111213

#include<stdio.h>int main(){ // 循环变量默认使用 i, j, k for(int i = 1; i <= 9; i ++){ // 可以在循环初始化条件中声明循环变量 for(int j = 1; j <= i; j ++){ printf("%d*%d=%d ", i, j, i * j); } printf("\n"); } return 0;}

数组

12345

类型 数组名[数组大小]; // 数组的声明 int a[10]; // 声明一个大小为 10,数组名为 a 的整型数组char s[10]; // 声明一个大小为 10,数组名为 s 的字符串

  • 数组的元素下标从 0 起始,若大小为 10,则最后一个元素的下标为 9。
  • 字符串总是以 '\0' 结尾。

题目5:

123456789101112131415161718192021

#include<stdio.h>#include<string.h> // 需要使用 strlen() 函数int main(){ char s[100]; scanf("%s", s); // 输入字符串使用 %s int m = strlen(s); // strlen() 的作用是返回字符串的长度 for(int i = 0; i < m; i ++){ // 数组下标从 0 起始,到 长度 - 1 结束 if(s[i] >= 'A' && s[i] <= 'Z'){ printf("%c", (s[i] - 'A' + 4) % 26 + 'A'); } else if(s[i] >= 'a' && s[i] <= 'z'){ printf("%c", (s[i] - 'a' + 4) % 26 + 'a'); } } printf("\n"); return 0;}

题目7:数组插入数字 已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。

1234567891011121314151617181920212223

#include<stdio.h>int main(){ int num[9]; for(int i = 0; i < 9; i ++){ scanf("%d", &num[i]); } int x; scanf("%d", &x); for(int i = 0, flag = 1; i < 9; i ++){ if(flag && num[i] >= x){ // 当输出过 x 值时 flag 置为 0 printf("%d\n", x); flag = 0; } printf("%d\n", num[i]); } return 0;}

结构体

12345678910

struct 结构体名{ 结构体内的数据;}; // 定义一个点struct point{ int x; int y;};

  • 结构体通常定义在函数外。
  • 结构体实质上将多个变量整合在一起,使分离的变量之间具有一定的意义。

123456

struct point p1, p2; // 定义两个结构体变量p1.x = 0; // 使用成员运算符 `.`p1.y = 2;scanf("%d%d", &p2.x, &p2.y);printf("%d %d", p2.x, p2.y);

题目8:两点之间距离 输入两点坐标(xx, y1), (x2, y2),计算并输出两点间的距离。

123456789101112131415161718

#include<stdio.h>#include<math.h> // 使用 sqrt() 函数struct point{ int x; int y;};int main(){ struct point p1, p2; while(scanf("%d%d%d%d", &p1.x, &p1.y, &p2.x, &p2.y) != EOF){ // 注意是多组输入数据 int x = (p1.x - p2.x) * (p1.x - p2.x); int y = (p1.y - p2.y) * (p1.y - p2.y); printf("%.2lf\n", sqrt(x + y)); // 用 sqrt() 计算平方根 } return 0;}

函数与递归

函数的定义

12345

返回值类型 函数名(参数列表){ // 函数体 语句;}

  • 返回值类型即 return 后跟着的变量或值的类型,若没有返回值或省略则填写 void
    • 通过 return 语句可以 提前结束 函数并返回调用处。
    • 若省略返回值则 执行到大括号 并返回调用处。
  • 参数列表中为函数需要的各个参数,在调用时需要 提供对应的参数

递归

123456789101112131415

#include<stdio.h>int f(int x){ if(x < 5){ f(x + 1); // 递归的入口 } else{ return x; // 必要的出口 }}int main(){ printf("%d",f(1)); return 0;}

  • 递归是在函数内调用函数本身的一种方式。
  • 函数必须有一个入口以及一个出口。
  • 通过递归可以不断重复同一个过程,在必要的条件下结束并得到结果。

题目9:最大公约数和最小公倍数 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。

123456789101112131415161718192021222324252627282930

#include<stdio.h> // 可以将公用的变量放在函数外作为全局变量// 全局变量可以被从声明位置起以后的所有语句使用int num1, num2;int GCD; // 利用 辗转相除法 求得两个数的最小公约数int gcd(int a, int b){ // 函数参数以在函数内有效 if(a < b){ int temp = a, a = b, b = temp; // 这个局部变量只在该代码块间有效 } if(!(a % b)){ return b; } gcd(b, a % b);} // 最大公约数 * 最小公倍数 = 两数乘积int lcm(){ return num1 * num2 / GCD;}int main(){ scanf("%d%d", &num1, &num2); GCD = gcd(num1, num2); printf("%d %d\n",GCD, lcm()); return 0;}

预处理

  • include 预处理
    • 用来加载头文件。
  • define 预处理
    • 用来将指定字符序列替换成对应的字符序列

12

#define PI 3.1415926 // 常用于定义一个常量

思考题

  1. 进制转换
  2. 阶乘之和 – 输入 n,计算 S = 1! + 2! + … + n! 的末 6 位(不含前导 0)。 – 样例输入:10 – 样例输出:37913
  3. 汽水瓶 – “某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶。 – 样例输入:10 – 样例输出:5
  4. WERTYU – 输入往右一个错位后敲出的字符串(所有字母均大写),输出打字员本来想打出的句子,且输入保证合法。 – 样例输入:O S, GOMR YPFSU/ – 样例输出:I AM FINE TODAY.
  5. 生成元 – 如果 x 加上 x 的各个数字之和得到 y,就说 x 是 y 的生成元。给出 n 求出最小生成元,无解输出 0。 – 样例输入1:216 – 样例输出1:198 – 样例输入2:121 – 样例输出2:0 – 样例输入3:2005 – 样例输出3:1979
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 课前准备
  • C语言
    • 编程规范
    • 基本数据类型
    • 运算符、输入与输出
      • 运算符
        • 输入、输出
        • 选择 | 循环
          • 选择
            • 开关语句
              • 循环
              • 数组
              • 结构体
              • 函数与递归
                • 函数的定义
                  • 递归
                  • 预处理
                  • 思考题
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档