鹏哥手把手带我刷好题 · 编程练习 · I

简介: 编程练习 · I

大家好,我是安然无虞。

目录

在线OJ

<1>.什么是在线OJ

<2>.为什么训练在线OJ

1.实践出真知

2.我是大V

3.有容乃大

4.缩短二进制

5.反向输出一个四位数

6.大小写转换

补充1:getchar()

补充2:输入缓冲区

7.小飞机

8.十六进制转十进制

9.printf的返回值

10.学生基本信息输入输出

结语:遇见安然遇见你,不负代码不负卿。


【前言】

其实这个在大一下学期的时候就已经刷完了,但是最近看鹏哥讲解的时候发现自己很多答案写的都很繁琐,再加上有段时间没写代码了,所以趁着假期利用几天时间二刷调整一下状态,再将每一道题整理在博客中,可能前面会很简单,后面会慢慢提升难度的哦,废话不多说,直接进入主题。

【声明】

前面题目很简单,非初学者勿看。


在线OJ

<1>.什么是在线OJ

OJ-在线判题系统(英语:online Judge,缩写OJ)是一种在编程竞赛中用来测试竞赛程序的在线系统,也可以用于平时练习。

<2>.为什么训练在线OJ

a.有一些比赛,比如:NOI、NOIP、ACM之类的编程竞赛都是采用在线OJ的方式进行;

b.现在IT大学生就业找工作的笔试环节也采用在线OJ的方式进行(笔试OJ化,这是未来的趋势)


好了,想必大家或多或少都接触过一些,在这里就不过多介绍咯,直接进入题目啦。

1.实践出真知

原题链接:实践出真知_牛客题霸_牛客网

题目描述:

代码执行:

//写主函数
//main函数是程序的入口 - 代码是从main函数的第一行开始执行的!
//一个工程中有且仅有一个main函数
#include<stdio.h>
int main()
{
  printf("Practice makes perfect!\n");
  return 0;
}


2.我是大V

原题链接:我是大V_牛客题霸_牛客网

题目描述:

代码执行:

代码1:

#include<stdio.h>
int main()
{
    printf("v   v\n");//'\n'- 换行
    printf(" v v\n");
    printf("  v\n");
    return 0;
}

代码2:

#include<stdio.h>
int main()
{
    printf("v   v\n v v\n  v\n");//'\n'- 换行
    return 0;
}


3.有容乃大

原题链接:有容乃大_牛客题霸_牛客网

题目描述:

代码执行:

#include<stdio.h>
int main()
{
    printf("The size of short is %d bytes.\n", sizeof(short));
    printf("The size of int is %d bytes.\n", sizeof(int));
    printf("The size of long is %d bytes.\n", sizeof(long));
    printf("The size of long long is %d bytes.\n", sizeof(long long));
    return 0;
}
//sizeof是一个C语言中的操作符,是用来计算变量或者类型所占空间类型大小的,单位是字节
//C语言标准规定:sizeof(long long)>=sizeof(long)>=sizeof(int)

4.缩短二进制

原题链接:缩短二进制_牛客题霸_牛客网

题目描述:

代码执行:

代码1:

#include<stdio.h>
int main()
{
    printf("0%o 0X%X",1234,1234);
    return 0;
}

注意:

printf可以使用使用格式控制串“%o”、“%X”分别输出八进制整数和十六进制整数,并使用修饰符“#”控制前导显示

代码2:

#include<stdio.h>
int main()
{
    printf("%#o %#X",1234,1234);
    return 0;
}


5.反向输出一个四位数

原题链接:反向输出一个四位数_牛客题霸_牛客网

题目描述:

示例:

输入:1234
输出:4321

代码执行:

#include<stdio.h>
int main()
{
  int n = 0;
  //输入
  scanf("%d", &n);//1234
  //输出
    //1234%10=4
    //1234/10=123
    //123%10=3
    //123/10=12
    //12%10=2
    //12/10=1
    //1%10=1
    //1/10=0
    //从上面步骤可知:重复模10除10的操作,所以可以写成循环的形式
  while (n)
  {
    printf("%d", n % 10);
    n /= 10;
  }
  return 0;
}


6.大小写转换

原题链接:大小写转换_牛客题霸_牛客网

在讲解本题之前先补充两个概念:

补充1:getchar()

函数原型:

int getchar(void)

功能:

在标准输入缓冲区中读取一个字符,返回读到的字符的ASCII码值,如果读取失败,则返回EOF(-1)

问:为什么getchar()返回的是字符的ASCII码值?函数返回值为什么要放到一个int类型的变量中呢?不是应该放在一个char类型的变量中吗?

如:

int ch = 0;
ch = getchar();

答:

  • getchar()返回了字符的ASCII码值,ASCII码值是整数,存放在整型变量中没有任何问题;
  • 这一点也是最重要的一点,getchar()读取失败的时候返回EOF,EOF本质是-1(#define EOF -1),是一个整型值,在一个char类型中,是存储不下的;
  • 再结合getchat()函数的原型,getchar()的返回类型被定义为int, 那么返回数据应该被存放在int变量中

getchar(): 获取/输入一个字符;

putchar(): 输出一个字符

注意哦,这两个函数一次只能操作一个字符,没有scanf(),printf()功能齐全

补充2:输入缓冲区

引入:

#include<stdio.h>
int main()
{
  char input[20] = { 0 };
  printf("请输入密码:>");
  scanf("%s", input);//输入abcdef最后加上一个\n
  printf("请确认密码:(Y / N):>");
  int ch = getchar();
  if (ch == 'Y')
  {
    printf("确认成功\n");
  }
  else
  {
    printf("确认失败\n");
  }
  return 0;
}

此时输入缓冲区中放的是abcdef\n,scanf()函数将abcdef读走了,留下了一个\n,所以\n直接被getchar()读取,所以此时ch里面放的是\n,后面不会等到我们确认密码就直接输出确认失败了。


存在的问题:本题输入abcdef,然后按回车键,还没有等到我们输入字符(Y/ N)就直接输出“确认失败”了,那怎么改才能成为我们想要的呢?


在scanf()下面加上一条语句:getchar();目的只有一个,拿走回车键('\n')

存在的问题:这样改只能保证输入“abcdef”时可以正常执行,但如果输入的是"abcdef hehe"时又会直接输出“确认失败”了,不信你看...

我丢,这什么鬼,怎么又错了!?

注意:

scanf("%s", ...); //scanf()读取字符串的时候遇到空格时就停下来不再读取了

分析上段代码:

#include<stdio.h>
int main()
{
  char input[20] = { 0 };
  printf("请输入密码:>");
  scanf("%s", input);//scanf()只读取了"abcdef"
  getchar();//getchar()读取了一个空格,所以这里就有问题了,这里的getchar()只能拿走一个字符,我们想要的是它能将缓冲区
  //里剩下字符全部拿走,直至拿走'\n'
  printf("请确认密码:(Y / N):>");
  int ch = getchar();
  if (ch == 'Y')
  {
    printf("确认成功\n");
  }
  else
  {
    printf("确认失败\n");
  }
  return 0;
}

是呀,这里的getchar()只能拿走一个字符,我们想要的是它能将缓冲区里剩下的全部拿走,直至拿走'\n',该怎么改?

#include<stdio.h>
int main()
{
  char input[20] = { 0 };
  printf("请输入密码:>");
  scanf("%s", input);//scanf()只读取了"abcdef"
    //清理缓冲区
  int tmp = 0;
  while ((tmp = getchar()) != '\n')
  {
    ;//空语句,什么事都不干,拿字符就行了
  }
  printf("请确认密码:(Y / N):>");
  int ch = getchar();
  if (ch == 'Y')
  {
    printf("确认成功\n");
  }
  else
  {
    printf("确认失败\n");
  }
  return 0;
}

这样就可以了,注意实现上面清理缓冲区的功能哦。 好,那么现在开始讲解本题。

题目描述:

示例:

输入:
    A
    B
输出:
    a
    b

代码执行:

#include<stdio.h>
int main()
{
    //EOF - end of file - 文件结束标志 - 通常是放在文件的末尾
    int ch = 0;
    while((ch=getchar())!=EOF)
    {
        printf("%c\n", ch+32);//小写字母的ASCII值比大写字母的大32
        getchar();//读取输入缓冲区中的\n
    }
    return 0;
}


7.小飞机

原题链接:小飞机_牛客题霸_牛客网

题目描述:

代码执行:

//本题考查的是printf()
#include<stdio.h>
int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}


8.十六进制转十进制

原题链接:十六进制转十进制_牛客题霸_牛客网

题目描述:

注意:

printf可以使用使用格式控制串“%md”输出域宽为m的十进制整数。


代码执行:

#include<stdio.h>
int main()
{
    printf("%15d\n",0XABCDEF);
    return 0;
}

9.printf的返回值

原题链接:printf的返回值_牛客题霸_牛客网

函数原型:

int printf( const char *format [, argument]... );

返回值:

引入一道笔试题:

#include<stdio.h>
int main()
{
  printf("%d", printf("%d", printf("%d", 43)));
  return 0;
}

屏幕上打印的是:4321

为什么呢?

因为printf()函数的返回值是打印在屏幕上字符的个数。

好,现在进入题目。

题目描述:

代码执行:

代码1:

#include<stdio.h>
int main()
{
    int ret=printf("Hello world!");
    putchar('\n');
    printf("%d",ret);
    return 0;
}

其实一行就解决了:

代码2:

#include<stdio.h>
int main()
{
    printf("\n%d\n", printf("Hello world!"));
    return 0;
}


10.学生基本信息输入输出

原题链接:学生基本信息输入输出_牛客题霸_牛客网

题目描述:

示例:

输入:17140216;80.845,90.55,100.00
输出:The each subject score of No. 17140216 is 80.85, 90.55, 100.00.

注意:小数在内存中可能不能精确保存,float和double精度不一样,一旦四舍五入,得到的结果可能就有差异。

代码执行:

#include<stdio.h>   
int main()
{
    int id = 0;//学号
    float c_score = 0.0;
    float math_score = 0.0;
    float eng_score = 0.0;
    //输入
    scanf("%d;%f,%f,%f", &id,&c_score,&math_score,&eng_score);
    //输出
    printf("The each subject score of No. %d is %.2f, %.2f, %.2f.", id,c_score,math_score,eng_score);
    return 0;
}


结语:遇见安然遇见你,不负代码不负卿。

    求求了,来个三连吧。


相关文章
|
7月前
|
测试技术
牛客刷题·组队竞赛·进制转换·连续最大和
牛客刷题·组队竞赛·进制转换·连续最大和
45 0
|
网络协议 持续交付
【软考备战·希赛网每日一练】2023年4月14日
具有 最优子结构 特点的问题可以使用 动态规划法 进行求解。 计算m数组中每项的值,需要三层for循环(循环变量依次为i,j,k),所以 时间复杂度为O(n3)。 需要 二维数组m 来进行记录数据,所以 空间复杂度为O(n2)。 最后一空直接计算每个选项的相乘次数,相乘次数最少得即为答案。
63 0
|
算法 网络协议 网络安全
【软考备战·希赛网每日一练】2023年5月5日
防火墙通常分为内网、外网和DMZ三个区域,按照受保护程度,从低到高正确的排列次序为 外网、DMZ和内网(DMZ又称“隔离区”、“非军事化区”)。
72 0
|
网络协议 测试技术 索引
【软考备战·希赛网每日一练】2023年5月12日
TCPState 是一个抽象类,来表示TCP连接的状态,声明了不同操作状态的公共接口,其子类实现与特定状态相关的行为。当一个 TCPConnection 对象收到其它对象的请求时,它根据自身的当前状态做出不同的反应。
65 0
|
设计模式 算法 数据库
【软考备战·希赛网每日一练】2023年4月21日
具有3个节点的二叉树有 5 种形态。 在发布-订阅(Publish-Subscribe)消息模式中,订阅者订阅一个主题后,当该主题有新消息到达时,所有订阅者都会收到通知。观察者(Observer) 设计模式最适合这一模式。 在面向对象软件开发过程中,采用设计模式 以复用成功的设计。
52 0
|
存储 算法
【软考备战·希赛网每日一练】2023年4月25日
关于委托开发:有合同约定,著作权归委托方;而在合同中未约定著作权归属,归创作方。 I/O设备管理软件 层次,从上到下依次为:用户层软件(用户进程)、设备独立性软件(与设备无关的系统软件)、设备驱动程序、硬件。
53 0
|
编译器 测试技术 uml
【软考备战·希赛网每日一练】2023年4月20日
复习 主存编址的计算。求 可寻址范围 就是求 存储单元的个数,注意看清题目,按字编址还是按字节编址,注意单位换算。 部署图 一般描述的是代码或系统在实施中的物理节点分布,组件之间的依赖关系类似于包依赖。
54 0
|
存储 设计模式
【软考备战·希赛网每日一练】2023年5月11日
通过元素在存储空间中的相对位置来表示数据元素之间的逻辑关系,是 顺序存储 的特点。 复习 风险管理 相关知识。
54 0
|
安全 算法 网络安全
【软考备战·希赛网每日一练】2023年4月24日
DPI表示每英寸像素点的个数。 300DPI表示每英寸有300个像素点,3×4英寸的图像,像素点数为3×300×4×300=900×1200。
57 0
|
开发框架 .NET
【软考备战·希赛网每日一练】2023年5月10日
中断方式 中CPU需要在得到通知后,保存现场,然后再转入I/O中断服务程序的执行,完成与I/O系统的数据交换,然后再返回被打断的程序继续执行。其过程中需要执行若干条指令才能处理一次中断时间,这种方式无法满足高速的批量数据传送要求。
71 0