【手把手带你刷题】-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


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

 


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


目录
相关文章
|
5天前
|
网络协议 程序员 编译器
C语言:编程世界的基础与魅力
C语言:编程世界的基础与魅力
|
6天前
|
编译器 C语言 C++
C语言,C++编程软件比较(推荐的编程软件)
C语言,C++编程软件比较(推荐的编程软件)
|
8天前
|
存储 自然语言处理 编译器
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(3)
|
6天前
|
编译器 C语言
函数深入解析(C语言基础入门)
函数深入解析(C语言基础入门)
|
6天前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
8天前
|
C语言
C 语言解 常见编程题(下)
C 语言解 常见编程题
42 0
|
8天前
|
C语言
C 语言解 常见编程题(上)
C 语言解 常见编程题
42 0
|
8天前
|
算法 C语言 芯片
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
振南技术干货集:振南当年入门C语言和单片机的那些事儿(1)
|
20天前
|
存储 Java C语言
从C语言的面向过程编程过渡理解面向对象编程风格
从C语言的面向过程编程过渡理解面向对象编程风格
9 0
|
20天前
|
存储 编译器 程序员
c语言入门篇
c语言入门篇
26 0