【手把手带你刷题】-C语言编程入门篇(二)

简介: 【手把手带你刷题】-C语言编程入门篇(二)

前言:

本部分是C语言初阶部分题目,一共130题,由易到难,适于初学者学习,非初学者勿看

题目链接:编程语言初学训练营_在线编程+题解_牛客题霸_牛客网 (nowcoder.com)

 

1.判断字母

题目链接:判断字母

题目:

题解1:这里要注意:

<1>用了ch=getchar时一定要用getchar()来处理\n

<2>ch要定义为int类型,因为getchar的返回值为int类型,而不是char类型

#include <stdio.h>
int main()
{
  int ch = 0;
    //多组输入
  while ((ch = getchar()) != EOF)
  {
    getchar();//处理\n
         //判断并输出
    if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
      printf("YES\n");
      else
       printf("NO\n");
  }
  return 0;
}

题解2:这里用到了isalpha函数,当字符是字母时,它返回非0的值,不是字母时,返回0

#include <stdio.h>
#include<ctype.h>   //isalpha函数的头文件
int main()
{
  int ch = 0;
  while ((ch = getchar()) != EOF)
  {
    getchar();
    if (isalpha(ch))
      printf("YES\n");
      else
       printf("NO\n");
  }
  return 0;
}

2.字符圣诞树

题目链接:字符圣诞树

题目

题解:本题主要考查循环嵌套,外层循环控制行数,内层循环控制字符和空格的打印,最后找到内层循环变量和外层循环变量的关系,即可得出答案(注意外层循环每进行一次,就要一次换行

问题:为啥int j=0不写在代码最前面

答:C语言规定:变量定义在当前代码块的最前面,j这个变量的作用域就是第二个大括号内,所以直接定义在第二个大括号的前面就行,如果写在第二个大括号的外面,j每一次循环都会累加起来,定义在第二个大括号内部可以让j每一次循环都回到0

#include <stdio.h>
int main()
 {
    //输入一个字符
    char ch=0;
    ch=getchar();
    //输出圣诞树
    int i=0;
    //每循环一次,打印一行
    //每一行有2部分组成,空格和字符
    for(i=0;i<5;i++)
    {
       int j=0;
       //空格
       for(j=0;j<4-i;j++)
        {
              printf(" ");     //4 3 2 1 0 
        }
        //字符
        for(j=0;j<=i;j++)
        {
             printf("%c ",ch);  //1 2 3 4 5 
        }
        printf("\n");
    }
    return 0;
}

3.ASCII码

题目链接:ASCII码

题目:

题解1:本题要学会如何计算数组元素的个数sz=sizeof(arr)/sizeof(arr[0]) (用整个数组的大小除以数组第一个元素的大小)

#include <stdio.h>
int main()
 {
    //这里定义要用char类型,因为打印的是字符
    char arr[] = { 73,32,99,97,110,32,100,111,32,105,116,33 };
    //arr是数组,数组是用下标来访问的
    int i=0;
    //计算数组元素的个数
    int sz=sizeof(arr)/sizeof(arr[0]);
    for ( i = 0; i < sz; i++)
    {
        printf("%c", arr[i]);
    }
    return 0;
}

题解2:直接当作字符串打印,但是要注意的是必须在数组的最后加上0,或者’\0',不然后面会乱码,就会出现以下结果(字符串的结束标志:\0)

int main()
{
  char ch[] = { 73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116 , 33 ,'\0'};
  printf("%s", ch);
  return 0;
}

4.出生日期输入输出

题目链接:出生日期输入输出

题目:

题解:本题要学会如何按格式输入%md就是m域宽输入数据%0md就是m域宽输出数据,前面自动补0(如果数据没达到域宽长度)

#include <stdio.h>
int main() //简化版
{
  int year=0;
  int month=0;//变量尽量初始化
  int date = 0;
  //按格式输入
  scanf("%4d%2d%2d", &year, &month, &date);
  //输出
  printf("year=%4d\n", year);
  printf("month=%02d\n", month);
  printf("date=%02d\n", date);
  return 0;
}

5.2的n次方计算

题目链接:2的n次方计算

题目:

题解:本题要学会移位操作符的使用(移位移的是二进制位,如1的二进制为01,1<<1【整体向左移一位,然后右边自动补0】二进制就是10,十进制也就是2)

结论:左移1位相当于*2,右移一位相当于/2

还有就是整形如何多组输入:while((scanf("%d,&a"))!=EOF)

scanf的返回值就是输入变量的个数,也是整形

#include <stdio.h>
int main()
{
  int n = 0;
  while((scanf("%d", &n))!=EOF)
  {
      printf("%d\n",1<<n);
  }
  return 0;
}

6.按照格式输入并交换输出

题目链接:按照格式输入并交换输出

题目:

题解1:思路:类比要把一瓶酱油和一瓶醋交换一个瓶子,首先需要第三个瓶子,把酱油放进第三个瓶子,接着醋倒入第二个瓶子,然后把酱油倒入第一个瓶子,这样完成了交换

#include <stdio.h>
int main()
 {
    int a,b,flag=0;
    scanf("a=%d,b=%d",&a,&b);
    //交换
    flag=a;
    a=b;
    b=flag;
    //输出
    printf("a=%d,b=%d\n",a,b);
    return 0;
}

补充一道笔试题:如果不创建第三个变量如何实现两个数的交换?

题解2加减法:这种方法有个缺点,如果a,b太大会溢出

#include <stdio.h>
int main()
 {
    int a,b,flag=0;
    scanf("a=%d,b=%d",&a,&b);
    //交换
     a=a+b;
     b=a-b;
     a=a-b;
    //输出
    printf("a=%d,b=%d\n",a,b);
    return 0;
}

题解3异或法:推荐用这种方法

^异或操作符:操作数必须是整形(int),作用的是二进制位,相同位置上相同为0,相异为1

如:3的二进制位为011,5的二进制位为101,那么3和5异或的结果为110,对应十进制为6,那么3和5异或的结果就是6

#include <stdio.h>
int main()
 {
    int a,b,flag=0;
    scanf("a=%d,b=%d",&a,&b);
    //交换
    a=a^b;
    b=a^b;
    a=a^b;
    //输出
    printf("a=%d,b=%d\n",a,b);
    return 0;
}

7.字符转ASCII码

题目链接:字符转ASCII码

题目:

题解:这题比较简单,但是大家可以记住a的ASCII值为97,A的为65

#include <stdio.h>
int main() 
{
  char ch = 0;
  scanf("%c", &ch);
  //也可以这样写
  //ch=getchar();
  printf("%d", ch);
    return 0;
}

8.计算表达式的值

题目链接:计算表达式的值

题目:

题解:这题非常简单,但是要注意C语言中的乘号是*

#include<stdio.h>
int  main()
{
    int a=40;
    int c=212;
    printf("%d\n",(-8+22)*a-10+c/2);
    return 0;
}

9. 计算带余除法

题目链接:计算带余除法

题目:

题解:这题知道/,%操作符即可做出

#include <stdio.h>
int main() 
{
    int a=0;
    int b=0;
    scanf("%d %d",&a,&b);
    // / 除法操作符,得到的是商
    // % 取余(取模)操作符,得到的是余数
    printf("%d %d",a/b,a%b);
    return 0;
}

10.计算体重指数

题目链接:计算体重指数

题目:

题解:本题注意两个点:<1>身高的单位为cm

<2>high不能直接除以100,这样得到的整数,而不是小数,这样就会和正确结果差很大

#include <stdio.h>
int main() 
{
    //输入
    int weight = 0;
    int high = 0;
    double BMI = 0;
    scanf("%d %d", &weight, &high);
    //计算BMI
    BMI = (weight / ((high / 100.0) * (high / 100.0)));
    //输出
    printf("%.2lf\n", BMI);
}

结语:彼方尚有荣光在,少年不惧岁月长

求求了,来个三连吧。

 

目录
相关文章
|
1月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
52 2
|
1月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
224 12
|
1月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
30 1
|
2月前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
15 0
|
1月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
2月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
2月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
2月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。