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

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

前言:

今天是更新刷题篇的第四天,虽然题目不是很难,但是希望我们能够怀着空杯心态来看这篇文章,静下心来,还是能学到很多新的知识,加油!!!

 

1.计算平均成绩

题目链接:计算平均成绩

题目:


题解:本题要注意最后一行是sum/5.0,5必须要学成小数,或者把sum定义为double类型

#include <stdio.h>
int main()
 {
    //输入
    int i=0;
    int num=0;
    int sum=0;
    for(i=0;i<5;i++)
    {
        scanf("%d",&num);
        sum+=num;
    }
    //计算并输出
    printf("%.1lf",sum/5.0);
    return 0; 
}

2.进制A+B

题目链接:进制A+B

题目:

题解:

%x是16进制的数据格式

%o是8进制的数据格式

#include <stdio.h>
int main()
 {
    int a,b=0;
    scanf("%x %o",&a,&b);
    printf("%d\n",a+b);
    return 0;
}

3. 网购

题目链接:网购

题目:


题解:本题我们应该学会不断简化代码,本题就是一次一次简化的结果,这个过程就跟数学中的合并同类项一样

flag表示是否有优惠劵,直接-50*flag这样就十分的简洁

要注意的就是price小于0的情况,就需要直接打印0.00

#include<stdio.h>
int main()
{
  double m,price = 0;//m表示原价
  int month, day, flag = 0;//flag表示是否有优惠价
  //输入
  scanf("%lf %d %d %d", &m, &month, &day, &flag);
  //计算
  if (month == 11 && day == 11)
    price = 0.7 * m - flag * 50;
  else if (month == 12 && day == 12)
    price = 0.8 * m - flag * 50;
  //输出
  if (price <= 0)
    printf("0.00");
  else
    printf("%.2lf", price);
  return 0;
}

4.争夺前五名

题目链接:争夺前五名

题目:

题解:本题要学会冒泡排序


冒泡排序的思想:两两相邻的元素进行比较,并且有可能的话,需要交换(嵌套循环)


首先就是9进行第一趟冒泡排序

9 8 7 6 5 4 3 2 1 0

8 9 7 6 5 4 3 2 1 0

8 7 9 6 5 4 3 2 1 0

...

8 7 6 5 4 3 2 1 0 9   //这就是一趟冒泡排序

接着就是8进行下一趟冒泡排序,一共就有n-1趟,n为数字的个数


然后本题的思路就是先输入成绩,然后从大到小进行冒泡排序,最后打印前五个


#include <stdio.h>
int main()
 {
    //输入
    int n,tmp=0;//n是个数
    int arr[50]={0};//存放成绩
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //冒泡排序
    for(int j=0;j<n-1;j++)//趟数
    {
     //一趟冒泡排序要进行多少对元素的比较
      for(int i=0;i<n-1-j;i++)
      {
        if(arr[i]<arr[i+1])
        {
            tmp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=tmp;
        }
       }
    }
    //输出
    for(int i=0;i<5;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

题解2:使用qsort函数直接进行排序

qsort库函数可以自动排序,但是这个函数要输入4个参数,而且使用前要引头文件#include<stdlib.h>


voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));


qsort(被排序数组的初始位置,要排序的数组的元素个数,一个元素所占字节,比较函数)


重点是最后一个参数,比较函数:


如果要升序(elem1<elem2),则return<0,就要return elem1-elem2


如果要降序(elem1>elem2),则return>0,就要return elem2-elem1


#include <stdio.h>
#include<stdlib.h>
int cmp_int(const void*e1,const void*e2)//这个函数的写法也要学会
{
    return *(int *)e2-*(int *)e1;
}
int main()
 {
    //输入
    int n,tmp=0;//n是个数
    int arr[50]={0};//存放成绩
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    qsort(arr, n, 4, cmp_int);
    //输出
    for(int i=0;i<5;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

5.竞选社长

题目链接:竞选社长

题目:

题解1:本题思路:gets()直接输入字符数组,然后开始遍历buf数组,统计A和B的个数


本题要学会gets()直接输入字符串


注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留\n


#include <stdio.h>
int main() 
{
    char buf[100]={0};
    //输入
    gets(buf);
    //统计
    int count_a=0;
    int count_b=0;
    int i=0;
    while(buf[i]!='0')
    {
        if(buf[i]=='A')
           count_a++;
        if(buf[i]=='B')
           count_b++;
        i++;
    }
    if(count_a>count_b)
    printf("A");
    else if(count_a==count_b)
    printf("E");
    else
    printf("B");
    return 0;
}


题解2:只用一个变量flag,是A就加1,是B就减1,最后看flag是大于小于还是等于0


#include <stdio.h>
int main() 
{
    char buf[100]={0};
    //输入
    gets(buf);
    //统计
    int flag=0;
    int i=0;
    while(buf[i]!='0')
    {
        if(buf[i]=='A')
           flag++;
        if(buf[i]=='B')
           flag--;
        i++;
    }
    if(flag>0)
    printf("A");
    else if(flag==0)
    printf("E");
    else
    printf("B");
    return 0;
}


题解3:另一种方式输入字符串(ch=getchar())!='0')


#include <stdio.h>
int main()
{
    int flag=0;
    char ch=0;
    while(((ch=getchar())!='0')&&ch!=EOF)
    {
        if(ch=='A')
          flag++;
        else if(ch=='B')
          flag--;
    }
    if(flag>0)
    printf("A");
    else if(flag==0)
    printf("E");
    else
    printf("B");
    return 0;
}

6. 完美成绩

题目链接:完美成绩

题目:

题解:在这里我们看一下多组输入的另一种方法:


while(~scanf("%d",&a))        意思还是等于EOF结束


~是C语言中的一个操作符-按位取反


EOF代表是-1                             (整形在内存中存储的是补码

10000000000000000000000000000001  原码

1111111111111111111111111111111111110 反码

1111111111111111111111111111111111111 补码   这个也就代表着-1(也就是EOF)

那么~EOF也就是00000000000000000000000000000000也就是0,0为假,不进入循环

#include <stdio.h>
int main() 
{
    int n=0;
    while(~scanf("%d",&n))
    //while((scanf("%d",&n))!=EOF)也可以这样写
    {
        if(n>=90)
        printf("Perfect\n");
    }
    return 0;
}

7.最高分数

题目链接:最高分数

题目:

题解1:思路:三个数找出最大的一个只需要比较两次


这里用到了条件操作符exp1?exp2:exp3


解释:满足条件1则输出值为exp2,不满足条件1则输出值为exp3

#include <stdio.h>
int main()
 {
    int n1=0;
    int n2=0;
    int n3=0;
    while(~scanf("%d%d%d",&n1,&n2,&n3));
    {
        int max=n1>n2?n1:n2;
        max=max>n3?max:n3;
        printf("%d",max);
    }
    return 0;
}

题解2:这种做法的思路:输入完比较,首先让第一个数为最大值,然后从第二个数开始进行比较,如果第二个数大,就让第二个数为最大值,以此类推,max与第三个数进行比较

#include <stdio.h>
int main()
 {
    int num[3]={0};
    while(~scanf("%d %d %d",&num[0],&num[1],&num[2]));
    {
        int max=num[0];
        int i=0;
        for(i=1;i<3;i++)
        {
           if(num[i]>max)
           max=num[i];
        }
        printf("%d",max);
    }
    return 0;
}

题解3:直接定义max为INT_MIN,温馨提示:在使用INT_MIN之前要声明:#include<limits.h>

#include<limits.h>
int main()
{
  int max = INT_MIN;
  int num = 0;
  for (int i = 1; i <= 3; i++)
  {
    scanf("%d", &num);
    if (num > max)
      max = num;
  }
  printf("%d", num);
  return 0;
}

8.判断是元音还是辅音

题目链接:判断是元音还是辅音

题目:

题解1:思路:先把元音放入一个字符数组中,然后输入字母,遍历数组看有没有一样的,有就直接输出Vowel并加上break(跳出整个循环),如果i=10(走完整个循环)还是没有,直接输出Consonant

#include <stdio.h>
int main() 
{
   char ch=0;
   char vowel[]="AaEeIiOoUu";
   while((ch=getchar())!=EOF)
   {
    getchar();//处理\n
    int i=0;
    for( i=0;i<10;i++)
    {
    if(vowel[i]==ch)
     { 
        printf("Vowel\n");
        break;
    }
    }
    if(i==10)
      printf("Consonant\n");
   }
    return 0;
}

题解2:这里介绍strchr函数来找字母

strchr函数是用来判断ch是否在字符串中vowel出现

如果出现了,则返回在vowel字符串中的地址

如果没出现,则返回NULL(空指针)

着这个函数要引头文件#include<string.h>

#include <stdio.h>
#include<string.h>
int main() 
{
   char ch=0;
   char vowel[]="AaEeIiOoUu";
   while((ch=getchar())!=EOF)
   {
    getchar();//处理\n
    if(strchr(vowel,ch))
    {
        printf("Vowel\n");
    }
    else
    {
       printf("Consonant\n");
    }
   }
    return 0;
}

题解3:while(scanf(" %c",&ch)!=EOF)这样输入也可以


注意如果在%c前面加上一个空格,会消除掉前面所有的空白字符,然后读取一个字符,这样的好处就是不用再加一句getchar()来吸收\n


或者:while(scanf("%c\n",&ch)!=EOF)加上一个\n


#include <stdio.h>
#include<string.h>
int main() 
{
   char ch=0;
   char vowel[]="AaEeIiOoUu";
   while(scanf(" %c",&ch)!=EOF)
   {
    if(strchr(vowel,ch))
    {
        printf("Vowel\n");
    }
    else
    {
       printf("Consonant\n");
    }
   }
    return 0;
}

9.字母大小写转换

题目链接:字母大小写转换

题目:


题解1:正常版:要知道一个结论就是大写字母和小写字母ASCII值差了32(A的ASCII的值为65,a的ASCII值为72)


#include <stdio.h>
int main() 
{
    char ch='0';
   while((scanf("%c",&ch))!=EOF)
   {
    if(ch>='a'&&ch<='z')
    ch-=32;
    else if(ch>='A'&&ch<='Z')
    ch+=32;
     getchar();
     printf("%c\n",ch);
   }  
    return 0;
}


题解2:这里介绍四个函数


isupper(ch):判断一个字母是不是大写字母

islower(ch):判断一个字母是不是小写字母

toupper(ch):把一个小写字母转换为大写

tolower(ch):把一个大写字母转换为小写

这些函数都要引头文件:#include<ctype.h>

#include <stdio.h>
#include<ctype.h>
int main() 
{
    char ch=0;
    while(~scanf(" %c",&ch))
    {
       if(isupper(ch))
       {
        printf("%c\n",tolower(ch));
       }
       else if(islower(ch))
       {
        printf("%c\n",toupper(ch));
       }
    }
    return 0;
}

10.三角形判断

题目链接:三角形判断

题目:

题解:构成三角形的条件:任意两条边之和大于第三边(所以三种情况都要写)


思路:是三角形进一步判断是什么三角形,不是三角形直接输出不是;如果是三角形,再三条边相等,就是等边三角形(注意==是双目操作符,不能写三个变量相等,而要写为a==b&&b==c)


然后如果不是等边,则可能是两条边相等,这时不用写第三天边不等,因为如果第三天边相等,第一个判断语句就直接输出了,最后就是else普通三角形

#include <stdio.h>
int main() 
{
   int a,b,c=0;
   while(~scanf("%d %d %d",&a,&b,&c))
   {
    if(a+b>c&&a+c>b&&b+c>a)
    {
        if(a==b&&b==c)
        printf("Equilateral triangle!\n");
        else if (a==b||a==c||b==c) 
        printf("Isosceles triangle!\n");
        else
         printf("Ordinary triangle!\n");
    }
    else 
    printf("Not a triangle!\n");
   }
    return 0;
}

总结:

1.%x是16进制的数据格式       %o是8进制的数据格式


2.要学会不断精简自己的代码,而不是写出来了就行了,严格要求自己eg:flag表示是否有优惠劵,直接-50*flag,这样就非常简洁


3.冒泡排序的思想:两两相邻的元素进行比较,并且有可能的话,需要交换(嵌套循环)外层循环代表趟数,内层循环代表一趟冒泡排序中要进行多少元素的比较


4.qsort函数:排序函数


头文件:#include<stdlib.h>


参数:qsort(被排序数组的初始位置,要排序的数组的元素个数,一个元素所占字节,比较函数)


升序:return<0 即return elem1-elem2


降序:return>0即return elem2-elem1


自定义指针函数的写法:


int cmp_int(const void*e1,const void*e2)
{
    return *(int *)e2-*(int *)e1;
}

5.gets()直接输入字符串:缓冲区中不会遗留\n


6.普通变量的多组输入:while(~scanf("%d",&a))

      字符的多组输入:while(~scanf("%c\n",&ch))这样就不要写getchar()来吸收\n


7.条件操作符exp1?exp2:exp3(满足条件1则输出值为exp2,不满足条件1则输出值为exp3)


8.strchr函数是用来判断字符是否在字符串中出现


如果出现了,则返回在字符串中的地址


如果没出现,则返回NULL(空指针)


着这个函数要引头文件#include<string.h>


9.大写字母和小写字母ASCII值差了32(A的ASCII的值为65,a的ASCII值为72


10.判断大小写和转换大小写字母的函数


isupper(ch):判断一个字母是不是大写字母


islower(ch):判断一个字母是不是小写字母


toupper(ch):把一个小写字母转换为大写


tolower(ch):把一个大写字母转换为小写


这些函数都要引头文件:#include<ctype.h>


11.注意==是双目操作符,不能写三个变量相等,而要写为a==b&&b==c


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

 


感觉笔者写的还可以,或者自己有些许收获的时候,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢!


目录
相关文章
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
70 2
|
20天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
73 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
20天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
40 8
|
23天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
57 4
|
2月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
438 12
|
2月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
36 1
|
2月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
17 0
|
2月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
3月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
3月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。