【C语言的完结】:最后的测试题

简介: 【C语言的完结】:最后的测试题

一、对无符号数的理解

#include<stdio.h>
int main() 
{
  unsigned char i = 7;
  int j = 0;
  for (; i > 0; i -= 3) {
    ++j;
  }
  printf("%d\n", j);
  return 0;
}

如上题目,大家伙觉得输出的答案是多少呢?

这道题只要考察的就是我们对C语言无符号数的理解了。那么下面我们一边讲解这道题目,一边来讲一下有关的知识点。


1.1 unsigned char的最小值和最大值


首先,我们审题 i是无符号数即(unsigned char),那么它的范围就是0-255,可能有些初学的小伙伴就会问为什么范围是0-255,这就要关联起char类型的8个比特位,因为unsigned char 无符号也就不需要用最高位来做符号位,那么这时unsigned char 就可以用上8个比特位来进行储存数据,当8个比特位全为0时,为最小即0为最小值,当8个比特位全为1时,为最大值即2^8-1=255。

1.2 无符号数的循环

无符号数和很多数都是一样的道理,在自己的范围内一直循环,当到了最大值在加1就会变成最小值,当自己最小值时在减就会变成最大值。



就以unsigned char做个例子运行给大家看吧。

int main()
{
 
  unsigned char a = 0;
  unsigned char b = 255;
  a = a - 1;
  b = b + 1;
  printf("a=%u",a);
  printf("b=%u",b);
 
     
 
  return 0;
}


看运行结果,确实如我上面所说。


1.3 开始解题

 
int main() 
{
  unsigned char i = 7;
  int j = 0;
  for (; i > 0; i -= 3) {
    ++j;
  }
  printf("%d\n", j);
  return 0;
}


再看一遍题目。


这里我们需要判断for循环的结束条件为 i<=0,但由于此时代的 i 为unsigned char类型,那么只有i==0;时for循环才会结束。这时我们只需要知道i-=3多少次到0,才能得出j的值为多少。


因为i每次循环-=3,那么当for 循环经过3次后,i就变成了254,则254/3=84,余数为2再-=3一次,得到255,255/3=85,所以总的次数为3+84+1+85=173。所以此时 j,++了173次,故打印出来的结果为173.

二、从第一字符串中删除第二个字符串中所有的字符

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如:第一个字符串是"They are students.",第二个字符串是”aeiou"。删除之后的第一个字符串变成"Thy r stdnts."。 保证两个字符串的长度均不超过100。 输入描述:输入两行,每行一个字符串。 输出描述:输出删除后的字符串。

2.1 带空格的字符串的获取

一经审题我们发现,这道题要获取两个字符串,相信有的小伙伴可能回想用scanf来进行获取,但是我们要知道,scanf获取字符串,如果遇到空格是会直接结束读取的,故在这道题上是不能用scanf来进行读取的,这里我们就需要用到gets这个函数,这个函数是专门读取字符串的函数。不需要担心我们上面所说的空格问题。下面给大家演示一下。

2.2 scanf的读取:

int main()
{
 
    char a[20];
    scanf("%s", a);
    printf("scanf: %s\n", a);
 
  
 
    return 0;
}

2.3 gets的读取:

int main()
{
 
    char a[20];
    gets(a);
    printf("gets: %s\n", a);
  
 
    return 0;
}

2.4 开始解题

先给参考答案再解析:

 
#include <stdio.h>
int main() {
    char a[100], b[100];
    int i = 0, j = 0;
    gets(a);
   
    gets(b);
    while (b[j])
    {        for (i = 0; a[i]; i++)
        {
            if (b[j] == a[i])
            {
                a[i] = -1;
            }
        }
        j++;
    }
 
    for (i = 0; a[i]; i++)
    {
        while(a[i]==-1)
        {
            i++;
        }
        if (!a[i])
        {
            break;
        }
            printf("%c", a[i]);
        
    }
    return 0;
}


通过审题我们知道,两个字符串的最大长度不超过100,那么我这里直接创建两个char [100]的数组 然后用gets依次读取字符串,然后在用两个循环,将第一个字符串中再第二个字符串出现的字符全部改为-1(其它整数也行),然后我们再打印的时候直接跳过数组元素为-1的元素即可。可能有小伙伴会疑惑,万一我输入的字符串也有-1呢?其实这是不矛盾的,这里的-1是整形,当我们输入成字符串时就会变成‘-’,‘1’,两个字符放到数组里的。所以这里我们把将第一个字符串中再第二个字符串出现的字符全部改为-1或其它整数是不冲突的。以上就是这道题的解题思路了 。

三、给整数加上”,“

对于一个较大的整数 N(1<=N<=2,000,000,000) 比如 980364535,我们常常需要一位一位数这个数字是几位数,但是如果在这 个数字每三位加一个逗号,它会变得更加易于朗读。 因此,这个数字加上逗号成如下的模样:980,364,535请写一个程序帮她完成这件事情

3.1 直接审题解答

还是老样子先给答案再进行解析:

#include <stdio.h>
int main() {
    int a, b;
    int i = 0,count=0;
    char arr[14] = {0};
    scanf("%d", &a);
    while (a)
    {
        if (count == 3)
        {
            arr[i++] = ',';
            count = 0;
        }
        else
        {
            b = a % 10;
            a /= 10;
            arr[i] = b + '0';
            if (a == 0)
                break;
            i++;
            count++;
        }
    }
 
    for (int j = i; j >= 0; j--)
    {
 
        printf("%c", arr[j]);
   }
    return 0;
}


首先我们知道这里最大的数算上”,“也就13位,但是字符串末尾会有个’\0‘,所以我们创建一个长度为14的数组arr,然后我们采用我们模10,除10的组合技(%10,/10),不断从右到左放到数组里,然后创建一个count来进行计数,每储存3个数就再往后一个元素储存一个”,“,这样等到循环结束我们就可以得到一个数组,但是这个数组的数是倒过来的,我们只需打印的时候,将数组反过来打印即可。


目录
相关文章
|
6月前
|
人工智能 算法 编译器
C语言初阶测评题:测试你的基础知识和编程技能!!
C语言初阶测评题:测试你的基础知识和编程技能!!
101 1
|
人工智能 算法 测试技术
【C语言】初阶完结练习题
C语言初阶知识点已经全部更完,相信大家对C语言初阶已经有了一个整体的概念,但我们只知道一些理论上的知识还是没有用的,所以今天我在网上找了一些题目给大家练习巩固之前学的知识,这样能更好的帮助我们加深对其的理解。
228 0
|
存储 编译器 C语言
初识C语言----完结篇(二)
初识C语言----完结篇(二)
73 0
|
存储 缓存 编译器
初识C语言----完结篇(一)
初识C语言----完结篇(一)
78 0
|
存储 C语言
C语言-重点知识总结-建议收藏(完结)
C语言-重点知识总结-建议收藏(完结)
138 0
|
6月前
|
C语言
C语言:初阶测试错题(查漏补缺)
C语言:初阶测试错题(查漏补缺)
40 0
|
6月前
|
网络协议 Linux C语言
C语言-多播测试代码(IPv4和IPv6)
C语言-多播测试代码(IPv4和IPv6)
111 0
|
人工智能 编译器 C语言
C语言阶段性测试题
C语言阶段性测试题
59 0
|
人工智能 算法 Serverless
力推C语言必会题目终章(完结篇)
力推C语言必会题目终章(完结篇)
49 0