【蓝桥杯系列】第一节 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;}

几个常用的字符型常量

65

运算符、输入与输出

运算符

两侧操作数做加法运算

题目 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;}

大于

逻辑运算符

作用

&&

逻辑与

||

逻辑或

!

逻辑非

在 C 语言中,非 0 即真。

位运算符

作用

&

按位与

|

按位或

^

按位异或

~

按位非

<<

左移

>>

右移

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

输入、输出

  • 格式输入输出函数

123

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

整型变量
  • 单字符输入输出函数

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

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2017-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

Python生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅...

20020
来自专栏尾尾部落

[剑指offer] 链表中倒数第k个结点 [剑指offer] 链表中倒数第k个结点

经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个...

11020
来自专栏游戏开发那些事

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

  自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书...

12030
来自专栏武培轩的专栏

排序算法-插入排序

算法简介 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应...

28640
来自专栏老九学堂

嘀 , 嘀嘀 ... 常用排序算法再总结

  这篇文章中再和小伙伴们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时间复杂度可以达到O(n)。

13830
来自专栏老司机的技术博客

宝宝都能学会的python编程教程6:列表(list)

上期编程题的答案如上图。 列表(list) list是一种有序的集合,可以随时添加和删除其中的元素。 当索引超出了范围时,Python会报一个IndexErr...

37160
来自专栏从流域到海域

《笨办法学Python》 第19课手记

《笨办法学Python》 第19课手记 本节课讲函数和变量(变量和函数的关系是变量作为做函数的参数,定义时是形参,使用时是实参),内容比较简单。 源代码如下: ...

260100
来自专栏赵俊的Java专栏

最长上升连续子序列

19040
来自专栏我就是马云飞

【数据结构】七大排序算法

排序的相关概念 排序的分类 根据在排序过程中带排序的记录是否全部被放置在内存中,排序分为: 内排序 外排序 1.内排序 内排序是在排序整个过程中,带排序的所有...

214100
来自专栏QQ音乐前端团队专栏

理解浮点数

相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题。

76840

扫码关注云+社区

领取腾讯云代金券