C语言刷题(Day1)

news2024/11/26 10:44:04

前言

  1. 本章我们带来几个经典得C语言练习题。

  2. 不要认为之前学过C语言,刷过这些题就不愿意再做题了。对待技术,我们永远要怀以一种空杯心态。

  3. 温故而知新,可以为师矣。

  4. 老师说,每道题都要尝试用不同得解法,去思考更多的思路,摸索最优解法,久之,技术便得到质的变化。

  5. 参考资料:C 库函数 – islower() | 菜鸟教程 (runoob.com)

题目

在这里插入图片描述

第一题

从键盘上输入一个字符串,将小写字母变成大写字母。

考点:

1 从键盘中输入一个字符串

常用方法
#include <stdio.h>

#define MAX_LENGTH 100

int main() {
    char str[MAX_LENGTH];
    
    printf("请输入一个字符串:");
    scanf("%s", str);
    
    printf("您输入的字符串是:%s\n", str);
    
    return 0;
}
其他方法
#include <stdio.h>

#define MAX_LENGTH 100

int main() {
    char str[MAX_LENGTH];
    
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);
    
    printf("您输入的字符串是:%s\n", str);
    
    return 0;
}
解释:

fgets(str, sizeof(str), stdin) 是一个用于从标准输入(键盘)读取一行字符串的函数调用。

具体含义如下:

  1. str 是一个字符数组,用于存储读取的字符串。
  2. sizeof(str) 是用于获取字符数组 str 的大小,即它可以容纳的最大字符数。
  3. stdin 是一个标准输入流,表示从键盘读取输入。
  4. fgets() 函数会在读取到换行符(包括换行符)或达到指定的最大字符数(sizeof(str)-1)时停止读取。它会将读取到的字符串存储在 str 中,并在字符串末尾添加一个空字符 \0。

2 小写字母转大写字母

常用方法

将小写字母转换为大写字母的经常是通过 ASCII 码进行转换。在 ASCII 码表中,小写字母的值范围是 97 到 122,而对应的大写字母的值范围是 65 到 90。通过将小写字母的 ASCII 值减去 32,可以得到对应的大写字母的 ASCII 值。

例如

#include <stdio.h>

int main() {
    char lowercase = 'a';
    char uppercase = lowercase - 32;
    
    printf("小写字母:%c\n", lowercase);
    printf("对应的大写字母:%c\n", uppercase);
    
    return 0;
}

在这里插入图片描述

其他方法

在C语言中,可以使用标准库函数toupper(int c)将小写字母转换为大写字母,使用islower(int c)检查给定的字符是否为小写字母。确保包含 ctype.h 头文件,它包含了 toupper 和islower函数的声明。

(1)toupper函数:

原型:int toupper(int c);
功能:将给定的字符转换为大写字母形式。
参数:c是一个int类型的整数,通常是一个字符。
返回值:转换后的大写字母,作为一个int类型的整数。

例如

#include <stdio.h>
#include <ctype.h>

int main() {
    char lowercase = 'a';
    char uppercase = toupper(lowercase);
    
    printf("小写字母:%c\n", lowercase);
    printf("对应的大写字母:%c\n", uppercase);
    
    return 0;
}

在这里插入图片描述

(2)islower函数:

原型:int islower(int c);
功能:检查给定的字符是否为小写字母。
参数:c是一个int类型的整数,通常是一个字符。
返回值:如果给定字符为小写字母,则返回非零值(真);否则返回0(假)。

#include <stdio.h>
#include <ctype.h>

int main() {
    char ch = 'a';

    if (islower(ch)) {
        printf("%c 是小写字母\n", ch);
    } else {
        printf("%c 不是小写字母\n", ch);
    }

    return 0;
}

在这里插入图片描述

第一题代码

方法一
#include <stdio.h>
#include <string.h>

int main() {
   char str[100];
   
   printf("请输入一个字符串:");
   fgets(str, sizeof(str), stdin);
   
   int length = strlen(str);

   for (int i = 0; i < length; i++)   //遍历字符数组
   {
       if (str[i] >= 'a' && str[i] <= 'z') 
       {
           str[i] = str[i] - 32;  // 将小写字母转换为大写字母
       }
   }
   
   printf("转换后的字符串为:%s", str);
   
   return 0;
}

在这里插入图片描述

方法二
#include <stdio.h>
#include <ctype.h>

int main() {
    char str[100];
    printf("请输入一个字符串: ");
    fgets(str, sizeof(str), stdin);
    
    int i = 0;
    while (str[i] != '\0') 
    {
        if (islower(str[i]))
        {
            str[i] = toupper(str[i]);
        }
        i++;  //换种方法遍历字符数组
    }
    
    printf("转换后的字符串为: %s\n", str);
    
    return 0;
}

在这里插入图片描述

第二题

从键盘上输入一个字符串,将字符串中的abc删除。

思路

(1)如果这道题的目的是把字符串中的所有a、b、c字符都删除,得到一个新的字符串。

我的思路是只申请一个字符数组,遍历此数组,把除了a、b、c以外的所有字符都留下。具体实现代码如下:

#include <stdio.h>
#include <string.h>

void remove_abc(char *str) 
{
    int len = strlen(str);
    int i, j = 0;

    for (i = 0; i < len; i++)  //遍历字符数组
    {
        if (str[i] != 'a' && str[i] != 'b' && str[i] != 'c')
        {
            str[j++] = str[i];  //str[j++]是先把j原来的值用掉再自加,这里是把留下来的字符又放回原数组,重新对数组赋值了
        }
    }

    str[j] = '\0'; // 在新的字符串末尾加上结束标志符
}

int main()
{
    char str[100];  //申请一个字符数组

    printf("请输入字符串: ");
    scanf("%s", str);

    remove_abc(str);

    printf("删除abc后的字符串为: %s\n", str);

    return 0;
}

在这里插入图片描述

(2)如果这道题的要求是把字符串中的“abc”删除,而不是把单个的a、b、c字符删除,那么这道题可以使用指针处理。

#include <stdio.h>
#include <string.h>

void removeABC(char *str)
{
    int len = strlen(str);
    char *src = str;
    char *dest = str;  //申请的两个指针指向同一地址

    while (*src)
    {
        if (*src == 'a' && *(src+1) == 'b' && *(src+2) == 'c') //判断连续的abc字符串
        {
            src += 3; //从字符a开始将指针后移到3个位置,跨越掉abc这部分
        } 
        else 
        {
            *dest++ = *src++;
        }
    }
    *dest = '\0';
}

int main()
{
    char str[100];

    printf("请输入一个字符串: ");
    scanf("%[^\n]%*c", str);

    removeABC(str);

    printf("删除'abc'后的字符串为: %s\n", str);
    
    return 0;
}

在这里插入图片描述

tips

在这里插入图片描述

第三题

在 C 语言中,int 类型的取值范围通常是 -2147483648 到 2147483647,进行 11 位及以上数字的加法运算,(超过了 int 类型的表示范围)。

(1)我们使用字符数组来表示大数,并实现了自定义的 addStrings 函数来进行字符串形式的大数加法运算。该函数通过逆序遍历两个输入字符串,并模拟手工加法的方式进行计算,将结果存储在 result 字符数组中。

(2)在 main 函数中,我们声明了两个字符数组变量 num1 和 num2,分别存储了两个 11 位数字的字符串表示。然后,我们调用 addStrings 函数将它们相加,并将结果存储在 result 字符数组中。最后,使用 %s 格式化字符串打印出结果。

(3)这个简单的示例只适用于非负整数的加法运算,并且没有处理输入的有效性检查、溢出等情况。在实际应用中,你可能需要根据具体需求进行更完善的实现。

#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 100

void addStrings(char* num1, char* num2, char* result) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int carry = 0;
    int i, j, k;

    // 逆序遍历两个字符串,从个位数开始相加
    for (i = len1 - 1, j = len2 - 1, k = 0; i >= 0 || j >= 0 || carry; i--, j--, k++) {
        int digit1 = (i >= 0) ? num1[i] - '0' : 0;
        int digit2 = (j >= 0) ? num2[j] - '0' : 0;
        int sum = digit1 + digit2 + carry;

        result[k] = sum % 10 + '0';  // 当前位的数字
        carry = sum / 10;  // 进位
    }

    // 反转结果字符串
    int len = k;
    for (i = 0, j = len - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }

    result[len] = '\0';
}

int main() {
    char num1[MAX_DIGITS] = "12345678901";  // 第一个 11 位数字
    char num2[MAX_DIGITS] = "98765432109";  // 第二个 11 位数字
    char result[MAX_DIGITS + 1];  // 结果字符串,预留一位存储结束符 '\0'

    addStrings(num1, num2, result);

    printf("Sum: %s\n", result);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1056384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划算法(2)--最大子段和与最长公共子序列

目录 一、最大子段和 1、什么是最大子段和 2、暴力枚举 3、分治法 4、动态规划 二、最长公共子序列 1、什么是最长公共子序列 2、暴力枚举法 3、动态规划法 4、完整代码 一、最大子段和 1、什么是最大子段和 子段和就是数组中任意连续的一段序列的和&#xff0c;而…

Django之模板

一&#xff09;模板&#xff08;T&#xff09; 什么时候会使用模板呢&#xff1f; 仅对于Django这个框架来说&#xff0c;因为其是默认前后端不分离的框架&#xff08;前后端不分离值开发时前后端的代码在一起&#xff0c;不通过接口的方式连接&#xff0c;通过模板渲染的方式…

七大基于比较的排序算法(JAVA)

目录 冒泡排序 优化&#xff1a; 堆排序 插入排序 希尔排序 归并排序 快速排序 优化 选择排序 排序算法的稳定性&#xff1a; 大小相同的元素在排序前后相对位置相同就称其为稳定的排序。 注&#xff1a;一个本身就是稳定的排序 是可以实现为不稳定的排序的 &#x…

JavaSE学习之--抽象类,接口,内部类

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类&#xff0c;接口&#xff0c;内部类 目录 一.抽象…

【牛客网】OR59 字符串中找出连续最长的数字串

题目 思路 创建两个字符串 temp 和 ret 创建指针i用来遍历字符串通过i遍历字符串,如果遇到数字则将这个数组加到字符串temp中 i,如果遇到字母,则判断temp字符串的长度和ret字符串的长度,如果temp<ret则说明这个字符串不是要的字符串,如果temp>ret则说明此时temp字符串是…

线性表的链式存储结构——链表

一、顺序表优缺点 优点&#xff1a;我们知道顺序表结构简单&#xff0c;便于随机访问表中任一元素&#xff1b; 缺点&#xff1a;顺序存储结构不利于插入和删除&#xff0c;不利于扩充&#xff0c;也容易造成空间浪费。 二、链表的定义 ①&#xff1a;概念&#xff1a; 用一组任…

springmvc-页面跳转表单标签其他标签tomcat控制台中文乱码问题

1. WEB-INF下页面跳转 容器启动后&#xff0c;如何默认显示web-inf目录下的系统首页。 2. ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void 示例…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

[BJDCTF2020]The mystery of ip

打开环境 点击flag&#xff0c;提示ip&#xff0c;这里确实就比较容易联想到x-forwarded-for 点击hint 这个好像没啥用 使用bp抓包 添加请求头 X-Forwarded-For:1 试一下 发现ip可控 后来查了发现 PHP可能存在Twig模版注入漏洞 参考https://www.cnblogs.com/zzjdbk/p/13…

Scala第十七章节

Scala第十七章节 scala总目录 文档资料下载 章节目标 了解集合的相关概念掌握Traversable集合的用法掌握随机学生序列案例 1. 集合 1.1 概述 但凡了解过编程的人都知道程序 算法 数据结构这句话, 它是由著名的瑞士计算机科学家尼古拉斯沃斯提出来的, 而他也是1984年图灵…

ADO连接Access的前期绑定方法实例(下)

【分享成果&#xff0c;随喜正能量】眾生多悲苦&#xff0c;發願‬菩提心。願今天所有聽見我、看見我、憶念我的眾生&#xff0c;因我心而‬生喜悅&#xff01;除消身心的痛苦&#xff01;種下脫解‬的種子&#xff01;願我等‬身心念力所及之處一切眾切‬生因佛得度&#xff0…

【AI视野·今日CV 计算机视觉论文速览 第258期】Mon, 2 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 2 Oct 2023 (showing first 100 of 112 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Multi-task View Synthesis with Neural Radiance Fields Authors Shuhong Zheng, Zh…

Vue的模板语法

Vue的模板语法 Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML&#xff0c;可以被符合规范的浏览器和 HTML 解析器解析。 测试准备 为了方便测试&#xff0c;先将vue-base项…

【AI视野·今日Robot 机器人论文速览 第四十五期】Mon, 2 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 2 Oct 2023 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Learning Decentralized Flocking Controllers with Spatio-Temporal Graph Neural Network Authors Siji Chen, Yanshen Sun, …

守护进程解析

什么是守护进程&#xff1f; - 知乎 什么是守护进程&#xff1a;生存期长的一种进程&#xff0c;没有控制终端。它们常常在系统引导装入时启动&#xff0c;仅在系统关闭时才终止。 进程组 &#xff1a; 每个进程除了有一个进程ID之外&#xff0c;还属于一个进程组进程组是一…

【已解决】opencv 交叉编译 ffmpeg选项始终为NO

一、opencv 交叉编译没有 ffmpeg &#xff0c;会导致视频打不开 在交叉编译时候&#xff0c;发现在 pc 端能用 opencv 打开的视频&#xff0c;但是在 rv1126 上打不开。在网上查了很久&#xff0c;原因可能是 交叉编译过程 ffmpeg 造成的。之前 ffmpeg 是直接用 apt 安装的&am…

LeetCode 周赛上分之旅 #49 再探内向基环树

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

1300*C. Coin Rows(枚举模拟)

解析&#xff1a; 两人都绝对聪明&#xff0c;Alice先走&#xff0c;尽量让Bob所能拿的分数最少&#xff0c;Alice有一次往下走的机会&#xff0c;剩余没走过的点正好分为两断断开的区域&#xff0c;所以Bob的最大分数要么在第一格向下或者在最后一列向下。 遍历区间&#xff0…

笔训day2

选择题 1、输出格式 此题与昨天的题类似&#xff0c;有“-”号时是左对齐&#xff0c;%-m.n m表示宽度&#xff0c;n表示左起取n位数。 2、常量指针和指针常量 //两种都是常量指针 const int *p1; int const *p2; //指针常量 int* const p3 3、字符数组和字符指针 4、函数…

国庆节看这里,有你意想不到的收货!(建议收藏)

计算机视觉研究院专栏 作者&#xff1a;Edison_G “国庆长假&#xff0c;每个人都安耐不住了&#xff0c;但是&#xff0c;在你静心、游玩的时候&#xff0c;还是可以阅读今天的分享&#xff0c;干货满满&#xff01; 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c…