习题练习 C语言(暑期)

news2025/1/18 10:47:54

在这里插入图片描述

编程能力小提升!

  • 前言
  • 一、转义字符
  • 二、重命名与宏定义
  • 三、三目运算符
  • 四、计算日期到天数转换
  • 五、计算字符串长度
  • 六、宏定义应用
  • 七、const常量
  • 八、C语言基础
  • 九、const常量(二)
  • 十、符号运算
  • 十一、记负均正
  • 十二、SWITCH,CASE
  • 十三、错误的集合
  • 十四、密码检查
  • 总结


前言

今天为大家分享我暑假期间所练习的一些小题目!
相信大家看完之后都会有所提升的!
加油!


一、转义字符

以下不正确的定义语句是( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[] = {‘\x10’, ‘\xa’, ‘\8’};
C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’};
D: int y[5+3]={0, 1, 3, 5, 7, 9};

题目解析:
八进制数字是0-7,没有8,故B选项中’\8’是错误的

题目答案:
B

知识点记忆:
\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X
\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0
\ddd 最多只支持三位数字,并且三位数字也不是任意的,一旦大于等于八进制数 '/400 '(十进制256=8进制400)就超过了ascall码的范围,编译器就会报错。另外大于三位,或者遇到非八进制数字时则转换结束,直接取末尾数字。

如果具体不清楚的话,可以看看这位大佬的详细解析:
转义字符


二、重命名与宏定义

test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )

#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;

A: a B: b C: c D: d

题目解析:
因为#define是宏定义,仅仅是直接替换,INT_PTR a, b;
进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。
而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。

#define INT_PTR int*
typedef int* int_ptr;
int* a, b;//但是不会与后面的b结合成为整形指针
int* c, d;//c,d都是重命名之后的类型

所以 a,c,d才是指针类型

题目答案:
ACD


三、三目运算符

若给定条件表达式 (M)?(a++):(a–) ,则其中表达式 M ( )
A: 和(M0)等价
B: 和(M
1)等价
C:和(M!=0)等价
D: 和(M!=1)等价

题目解析:
在此表达式中,若M=0,为假,计算a–; 若M≠0,为真,计算a++;
若要求与M等价,则要满足M取0时为假,取非0数值时为真。
c选项中:假定M取0,则M表示假,当M是0时,表达式M!=0不成立,为假,计算a–;
当M取非0数值时,M为真,表达式M!=0成立,为真,计算a++; 符合题意,选C

题目答案:
C
知识点记忆:
(表达式1)? (表达式2): (表达式3)为三目运算符。
计算规则为:先判断表达式1是否为真,若为真,则计算表达式2,并将表达式2的结果作为整个表达式最终的结果,表达式3不计算;
否则,表达式3的结果为最终结果,表达式2不计算


四、计算日期到天数转换

题目链接:OJ链接
在这里插入图片描述
题目解析:
此题可以先通过输入的年份判断是否为闰年;
再用switch函数依次相加输入月份之前的天数;
最后加上本月已过天数,就是最终的天数;

题目答案:

#include <stdio.h>
int main() {
    int a, b, c;
    while (scanf("%d %d %d", &a, &b, &c) != EOF) { 
        int days=0;//统计天数
        switch(b-1){//相加输入月份之前的天数
            case 11:
                days+=30;
            case 10:
                days+=31;
            case 9:
                days+=30;
            case 8:
                days+=31;
            case 7:
                days+=31;
            case 6:
                days+=30;
            case 5:
                days+=31;
            case 4:
                days+=30;
            case 3:
                days+=31;
            case 2:
                if((a%4==0&&a%100!=0)||a%400==0){
                    days+=29;
                }
                else{
                    days+=28;
                }
            case 1:
                days+=31;
            case 0:
                days+=c;//加上本月已过天数
        }
        printf("%d",days);
    }
return 0;
}

知识点记忆:
闰年判断:
可以被4整除但不能被100整除;
或者可以被400整除;


五、计算字符串长度

以下程序段的输出结果是( )

#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}

A: 12 B: 13 C: 16 D: 以上都不对

题目解析:
\\ 表示字符’‘,\123表示字符’{',\t表示制表符,这些都是一个字符;
所以有效字符串长度为12

题目答案:
A


六、宏定义应用

若有以下程序,则运行后的输出结果是( )

#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}

A: 4 B: 8 C: 9 D: 6

题目解析:
宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8

题目答案:
B


七、const常量

下面3段程序代码的效果一样吗( )

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样

题目解析:
const在的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在的右边,则指针的指向不可变。
简记为"左定值,右定向",(1)和(2)const都在的左边,(3)中const在的右边,所以应该选择B。

题目答案:
B


八、C语言基础

5、对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;charc;},sizeof( X )等于sizeof(s) + sizeof( i ) + sizeof( c )
B: 对于某个double变量a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = “Hello, world!”; 和chara[14]; a = “Hello, world!”;的效果相同
D: 以上说法都不对

题目解析:
A选项,没有考虑内存对齐。B选项,考察double类型的比较,由于浮点数存在误差不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D

题目答案:
D


九、const常量(二)

请问下列表达式哪些会被编译器禁止【多选】( )

int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;

A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f

题目解析:
如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向常量;
*c 和 *d不能变。
如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量;
e 和f 不能变。

题目答案:
ABCD


十、符号运算

下面代码段的输出是( )

int main()
{
int a=3;
printf("%d\n",(a+=a-=a*a));
return 0;
}

A: -6 B: 12 C: 0 D: -12

题目解析:
a+=a-=aa等价于a=a+(a=a-aa),即先计算a=a-aa,所以此时a的值为3-33=-6,再计算-6+(-6)=-12赋值给a,所以a的值为-12,也就是整个表达式的值,所以应选择D

题目答案:
D

知识点记忆:
在这里插入图片描述在这里插入图片描述在这里插入图片描述


十一、记负均正

题目链接:OJ链接
在这里插入图片描述
在这里插入图片描述
题目解析:
其实这道题不难,记录两个变量用来记录正负整数个数,再用一个变量来计算整数总和,最后再通过计算就可以得到记负均正;
但是这道题目有一个大坑,那就是数据全为0时,0不能作为除数使用,会出现-NAN;
所以要区分情况计算!

题目答案:

#include <stdio.h>
int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) { // 注意 while 处理多个 case
        int count1 = 0, count2 = 0, tmp;
        float sum = 0;
        for (int i = 0; i < n; i++) {
            scanf("%d", &tmp);
            if (tmp < 0) {
                count1++; 
            } else if (tmp > 0) {
                sum += tmp; 
                count2++; 
            }
        }
        if(count2==0){
            printf("%d %.1f",count1,0.0);
        }
        else{
            printf("%d %.1f",count1,sum/count2);
        }
    }
    return 0;
}

十二、SWITCH,CASE

若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是

#include <stdio.h>
int main()
{
char c;
int v0=0,v1=0,v2=0do
{
switch(c=getchar())
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':v1 += 1;
default:v0+= 1;v2+=1;
}
}while(c!='\n');
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
return 0;
}

A: v0=7,v1=4,v2=7 B: v0=8,v1=4,V2=8 C: v0=11,v1=4,v2=11 D:v0=12,v1=4,v2=12

题目解析:
代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止。例如当c为’A’时,从case 'A’进入,先后执行v1+=1;v0+=1;v2+=1;,而当c为’p’时,从default进入,先后执行v0+=1;v2+=1;,容易看出最终v0和v2是相等的;
所以程序中v0、v2计算的是字符串长度;
而v1统计的是aeiouAEIOU字符出现的次数;

题目答案
D


十三、错误的集合

题目链接:OJ链接
在这里插入图片描述

提示:
2 <= nums.length <= 10^4 ;
1 <= nums[i] <= 10^4;

题目解析:
使用标记的方式就可以找出重复的数字,数组中出现过哪个数字就把对应数字作为下标在对应位置1,表示已经标记出现过,如果哪个数据对应位已经置1,则表示就是重复的数字。有了重复的数字,拿 [1, n] 的总和减去去掉重复数据的数组总和就是丢失的数据。 其实使用标记法时出现的数字对应位每次 ++ ,则最后出现0次的就是丢失,出现2次的就是重复的,这样的方式也可以,不过需要多次遍历。

图例解析:
在这里插入图片描述

题目答案:

int* findErrorNums(int* nums, int numsSize, int* returnSize){
    *returnSize = 2;
    //遍历nums数组,将其中数据对应的位置1, 哪一位如果已经重置过则意味着数据重复了
    int *arr = (int *)calloc(numsSize + 1, sizeof(int));//申请numsSize个整形空间,并初始化为0
    int *ret = (int *)calloc(*returnSize, sizeof(int));//申请2个整形空间,并初始化为0
    int cur_sum = 0, old_sum = 0;
    for (int i = 0; i < numsSize; i++) {
    if (arr[nums[i]] == 1) { //这个数字在上边数组的对应位置已经置过1了,则重复
        ret[0] = nums[i];//找到重复的数字
    }
    arr[nums[i]] = 1; //将标记数组的对应数据位置1
    old_sum += i + 1; // 1~n的求和
    cur_sum += nums[i]; //当前数组中的数据求和(多了一个重复的,少了一个丢失的)
    }
    ret[1] = old_sum - (cur_sum - ret[0]);//原始总和,减去去掉重复后的当前总和就是丢失的数字
    free(arr);
    return ret;
}

十四、密码检查

题目链接:OJ链接
在这里插入图片描述
题目解析:
这道题只需要将字符串从头到尾的每种字符(大写字符,小写字符,数字,其他字符)分别统计出来后。然后逐个判断是否符合条件即可。而条件的判断包含有:
. 长度不小于8
. 不能以数字开头
. 只能包含字母和数字
. 大小写和字符必须具备两种以上

题目答案:

#include <stdio.h>
int main() {
    int n;
    while (scanf("%d", &n)=EOF) { 
        for(int i=0;i<n;i++){
            char arr[101]={0};
            scanf("%s",arr);//捕捉输入的密码
            if(strlen(arr)<8){//密码长度小于8
                printf("NO\n");
                continue;
            }
            if(arr[0]>='0'&&arr[0]<='9'){//密码以数字开头
                printf("NO\n");
                continue;
            }
            int upper = 0, lower = 0, digit = 0, other = 0;
            char*p=arr;
            while(*p!='\0'){//统计各种字符个数
                if(*p>='a'&&*p<='z')lower++;
                else if(*p>='A'&&*p<='Z')upper++;
                else if(*p>='0'&&*p<='9')digit++;
                else other++;
                p++;
            }
            if(other>0){{ // 有其他字符(注意:密码只能由数字和字母组成)
                printf("NO\n");
                continue;
            }
            if((upper>0)+(lower>0)+(digit>0)<2){//大写,小写,数字,必须具有两种以上,而比较运算真则1,假则0
                printf("NO\n");
                continue;
            }   
            printf("YES\n");
        }
    }
    return 0;
}

总结

这次的分享就到这里啦!
内容还真的是很不少呢!
希望大家真的能从本文中有所收获!

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

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

相关文章

元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

今天在写ts文件的过程中&#xff0c;我遍历了一个对象&#xff0c;然后取值的时候发现爆红,如下图&#x1f447; 经过我一通排查&#xff08;原因我对ts也不是很熟练&#xff09;&#xff0c;了解到大致意思是说key的值类型不是string类型&#xff0c;在javascript中是默认给你…

金融行业步入大模型时代,AI重塑生态与价值

中国人工智能事业尽管起步较晚&#xff0c;但呈现出飞速发展的势头&#xff0c;自2014年起至今&#xff0c;经历了从创业高潮到应用部署再到技术瓶颈的全面生命周期&#xff0c;而今正迈入大规模商业变现的崭新阶段。围绕生成式AI浪潮下&#xff0c;谁能率先落地的AIGC应用&…

若依前端Vue3模板——自定义主题+炫彩主题

文章目录 若依框架新增自定义主题风格实现结果实现步骤默认主题的设置布局设置图标文件布局组件 准备CSS变量对状态管理库中的主题名称进行匹配logo图标组件左侧导航栏菜单组件顶部导航栏组件 炫彩主题实现结果实现步骤布局设置布局组件 其他展示内容的路由出口布局设置-开启to…

计算机网络aaaaaaa

差错检测 在一段时间内&#xff0c;传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate) 11111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111…

HPC是如何助力AI推理加速的?

高性能计算&#xff08;High-Performance Computing&#xff0c;HPC&#xff09;通过提供强大的计算能力、存储资源和网络互联&#xff0c;可以显著地辅助人工智能&#xff08;AI&#xff09;应用更快地进行训练和推断。那么&#xff0c;HPC是如何助力AI推理加速的&#xff1f;…

电脑识别不了固态硬盘怎么办?

在使用固态硬盘时&#xff0c;可能会出现电脑无法识别的情况&#xff0c;这时我们就无法使用固态硬盘中的数据。那么&#xff0c;电脑识别不了固态硬盘怎么办&#xff1f; 为什么电脑识别不了固态硬盘&#xff1f; 一般来说&#xff0c;电脑识别不了固态硬盘是因为以下3个原因…

PO设计模式是selenium自动化测试中最佳的设计模式之一

Page Object Model&#xff1a;PO设计模式是selenium自动化测试中最佳的设计模式之一&#xff0c;主要体现在对界面交互细节的封装&#xff0c;也就是在实际测试中只关注业务流程就OK了传统的设计中&#xff0c;在新增测试用例之后&#xff0c;代码会有以下几个问题&#xff1a…

汽车3D HMI图形引擎选型指南【2023】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 2002年&#xff0c;电影《少数派报告》让观众深入了解未来。 除了情节的核心道德困境之外&#xff0c;大多数人都对它的技术着迷。 我们看到了自动驾驶汽车、个性化广告和用户可以无缝交互的 3D 计算机界面。 令人惊讶的是…

Live800:在线沟通有这些新趋势

近年来&#xff0c;随着互联网技术的快速发展&#xff0c;越来越多的企业开始采用在线客服系统&#xff0c;以解决与客户沟通的问题。这项技术的出现&#xff0c;不仅改变了企业与客户之间沟通的方式&#xff0c;也为未来在线沟通提供了新的方向。 在线客服系统的特点主要有以下…

产品发布 | 成集云-积分商城系统

应用背景 近年来&#xff0c;随着互联网和移动支付的普及&#xff0c;消费者的消费行为逐渐从线下转移到线上。在互联网和移动支付的竞争中&#xff0c;如何吸引和留住用户是各个平台面临的重要问题。 积分商城的起源可以追溯到用户积累一定积分后&#xff0c;使用积分换购商品…

(笔记三)opencv图像基础操作

强调&#xff1a;本文只为学习记录做笔记 详细可参考opencv官网 &#xff1a;https://docs.opencv.org/4.1.1/d0/d86/tutorial_py_image_arithmetics.html &#xff08;1&#xff09;将cv2的BGR模式改为RGB模式 #!/usr/bin/env python # -*- coding:utf-8 -*- ""&q…

Bently 146031-01瞬态数据接口模块

数据采集&#xff1a; 该模块用于采集旋转机械&#xff08;如涡轮机、发电机、压缩机等&#xff09;的振动、温度、压力、电流等数据。这些数据有助于监测设备的性能和状态。 瞬态数据&#xff1a; 该模块专门用于瞬态数据采集&#xff0c;这意味着它能够捕获和存储瞬时事件和…

【漏洞复现】万户协同办公平台未授权访问漏洞

漏洞描述 万户ezOFFICE协同管理平台涵盖门户自定义平台、信息知识平台管理、系统管理平台功能&#xff0c;它以工作流引擎为底层服务&#xff0c;以通讯沟通平台为交流手段&#xff0c;以门户自定义平台为信息推送显示平台&#xff0c;为用户提供集成的协同工作环境。该平台存…

汽车自适应巡航系统车距控制策略研究

1 引言 自适应巡航控制( Adaptive Cruise Control&#xff0c;ACC) 是汽车驾驶辅助系统的重要组成部分&#xff0c;其作用是根据车距传感器探测到本车( ACC 车辆) 与主目标车辆( 前车) 之间的相对位置和相对速度信息&#xff0c;自动调节ACC 车辆的节气门开度或部分制动力矩( 即…

水利部信息中心:数字孪生流域14家先行先试取得成效

&#xff08;1&#xff09;长江委 对汉江中下游一维水动力学模型进行升级改造&#xff0c;在确保模型计算精度的同时进一步提升模型的计算速度和稳定性&#xff0c;已更新集成至数字孪生汉江系统&#xff0c;更好支持防洪调度策略推荐等业务功能&#xff0c;具有较好推广性。 …

JAVA基础-JDBC

本博客记录JAVA基础JDBC部分的学习内容 JDBC基本概念 JDBC : JAVA链接数据库&#xff0c;是JAVA链接数据库的技术的统称&#xff0c;包含如下两部分&#xff1a; 1. JAVA提供的JDBC规范&#xff08;即各种数据库接口&#xff09;存储在java.sql 和 javax.sql中的api 2. 各个数…

非计算机专业的大学生能否学好编程?答案可能会让你惊喜

你是不是经常听到这样的说法&#xff1a;编程只适合计算机专业的学生&#xff0c;非计算机专业的学生学不好编程&#xff0c;或者学了也没用&#xff1f;如果你是非计算机专业的学生&#xff0c;而且对编程感兴趣&#xff0c;那么我要告诉你一个好消息&#xff1a;这些说法都是…

关系数据库如何使用AutoSklearn一键构建预测模型并进行结果可视化

AutoSklearn 是一个自动化机器学习工具,可以根据提供的数据集自动构建和优化机器学习模型。要使用 AutoSklearn 来构建预测模型并实现自动化预测,可以按照以下步骤进行操作: 安装 AutoSklearn:shellpip install automl 导入所需的库和模块:准备数据表:将关系数据表转换…

基于飞桨图学习框架的空间异配性感知图神经网络

本期文章将为大家分享飞桨社区开发者肖淙曦、周景博发表于数据挖掘顶会KDD2023的论文《Spatial Heterophily Aware Graph Neural Networks》。 肖淙曦 肖淙曦&#xff0c;百度研究院商业智能实验室研究实习生&#xff0c;中国科学技术大学在读博士生&#xff0c;主要从事时空…

非科班菜鸡算法学习记录 | 代码随想录算法训练营第49天||121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 知识点&#xff1a;动规 状态&#xff1a;看思路ok 思路&#xff1a; 维护一个二维dp&#xff0c;dp【i】【0】表示第i1天不持有股票时候的情况&#xff1a; 有两种情况&#xff0c;昨天就不持有股票所以直接等于昨天&#xff0c;或者是今天卖出了…