C语言学习笔记—P22(<C语言高阶>+题例+图解)

简介: C语言学习笔记(<C语言高阶>+题例+图解)

 前言:

本篇博文学习笔记主要是对一些题目进行学习以及记录。在这些题目求解以及分析的过程中,扩宽了思维,收获良多!

例如:T6、T10、T11的处理方式令人意想不到以及非常巧妙,这也增强了作者对于C语言的学习更加深刻的理解!

T1.写一个函数打印arr数组的内容,不使用数组下标,使用指针。arr是一个整形一维数组。

#include <stdio.h>
方法1:形参为数组
//void print_arr(int arr[], int sz)
//{
//  int i = 0;
//  for (i = 0; i < sz; i++)
//  {
//    printf("%d ", arr[i]);
//  }
//}
方法2:形参为指针
void print_arr(int *p, int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *p++);
  }
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  //arr -- > 表示的是首元素的地址
  //int* 
  print_arr(arr, sz);
  return 0;
}
image.gif

image.gif编辑  T2.字符串逆置:

image.gif编辑

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10000] = { 0 };
  //输入
  gets(arr);
  //逆序
  int len = strlen(arr);
  char* left = arr;
  char* right = arr + len - 1;
  while (left<right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
  //打印
  printf("%s\n", arr);
  return 0;
}
image.gif

 T3.求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字,

例如:2 + 22 + 222 + 2222 + 22222

#include <stdio.h>
int main()
{
  int a = 0;
  int n = 0;
  scanf("%d %d", &n, &a);//
  int sum = 0;
  int ret = 0;
  int i = 0;
  for (i = 0; i < n; i++)
  {
    ret = ret * 10 + a;
    sum += ret;
  }
  printf("%d\n", sum);
  return 0;
}
image.gif

image.gif编辑

T4. 打印水仙花数:

image.gif编辑


求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,

如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。

#include<stdio.h>
#include <math.h>
int main()
{
  int i = 0;
  for (i = 0; i <= 100000; i++)
  {
    //判断i是否为水仙花数
    //i是n位数
    int n = 1;
    int sum = 0;
    int tmp = i;
    while (tmp /= 10)
    {
      n++;
    }
    //求每一位的n次方之和
    tmp = i;
    while (tmp)
    {
      sum += (int)pow(tmp % 10, n);
      tmp /= 10;
    }
    if (sum == i)
    {
      printf("%d ", i);
    }
  }
  return 0;
}
image.gif

T5.打印菱形:

image.gif编辑

打印菱形
#include<stdio.h>
int main()
{
  int line = 0;
  scanf("%d", &line);
  //上
  int i = 0;
  for (i = 0; i < line; i++)
  {
    //打印一行
    //打印空格
    int j = 0;
    for (j=0; j<line-1-i; j++)
    {
      printf(" ");
    }
    //打印*
    for (j = 0; j < 2*i+1; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  //下
  for (i = 0; i < line-1; i++)
  {
    //打印一行
    //打印空格
    int j = 0;
    for (j = 0; j <=i; j++)
    {
      printf(" ");
    }
    //打印*
    for (j = 0; j < 2*(line - 1-i)-1; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  return 0;
}
image.gif

 T6.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。

image.gif编辑

方法一:
#include<stdio.h>
int main()
{
  int money = 0;
  int total = 0;//总共的瓶数
  int empty = 0;//空瓶数
  scanf("%d", &money);//20
  if (money <= 0)
    total = 0;
  else
    total = money * 2 - 1;
  printf("%d\n", total);
  return 0;
}
方法2:
int main()
{
  int money = 0;
  int total = 0;//总共的瓶数
  int empty = 0;//空瓶数
  scanf("%d", &money);//20
  total += money;
  empty += money;
  //置换
  while (empty >= 2)
  {
  total += empty / 2;
  empty = empty / 2 + empty % 2;
  }
  printf("%d\n", total);
  return 0;
}
image.gif

面试技巧:

若在面试时,可在面试官询问时,提出自己的一些想法用于活跃氛围(分场合)比如此题的扩展,可以提出像商店老板接一个空瓶,然后再归还!

T7.输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

image.gif编辑

image.gif编辑

image.gif编辑image.gif编辑

#include <stdio.h>
void print(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
void move(int arr[], int sz)
{
  int* left = arr;
  int* right = arr + sz - 1;
  while (left<right)
  {
    //从左向右找一个偶数,停下来
    while ((left<right) && (*left)%2==1)
    {
      left++;
    }
    //从右向左找一个奇数,停下来
    while ((left < right) && (*right) % 2 == 0)
    {
      right--;
    }
    //奇数和偶数交换
    if (left<right)
    {
      int tmp = *left;
      *left = *right;
      *right = tmp;
    }
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
  //int arr[] = { 1,3,5,7,9 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  print(arr, sz);
  move(arr, sz);
  print(arr, sz);
  return 0;
}
image.gif

T8.image.gif编辑

image.gif编辑

打印此结果的原因是因为char只占用一个字节,且a,b,c均为无符号char型,在截断之后进行运算,再按照%d格式打印,会发生整型提升,但第一种形式的打印是运算后直接打印,第二形式的打印是存放在c中(先截断再整型提升导致原有数据丢失),因此打印结果不一样!

int main()
{
  unsigned char a = 200;
  unsigned char b = 100;
  unsigned char c = 0;
  c = a + b;
  printf("%d %d", a + b, c);
  return 0;
}
image.gif

CPU为了保证其计算精度,一般按照整型或者缺省整型的方式进行计算!因此不是先以原有类型进行计算再按照打印格式进行整型提升或者截断 !

T9.杨辉三角:

形式1:

        1

      1  1

    1  2  1

   1  3  3  1

 1  4  6  4  1

形式2:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

image.gif编辑

int main()
{
  int arr[10][10] = { 0 };
  int i = 0;
  int j = 0;
  for (i = 0; i < 10; i++)
  {
    for (j = 0; j <= i; j++)
    {
      if (j == 0)
        arr[i][j] = 1;
      if (i == j)
        arr[i][j] = 1;
      if (i >= 2 && j >= 1)
        arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}
image.gif

T10.猜凶手

题目内容:

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

image.gif编辑

int main()
{
  int killer = 0;
  for (killer = 'a'; killer <= 'd'; killer++)
  {   
    //1/0          1/0              1/0           1/0
    if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
    {
      printf("%c\n", killer);
    }
  }
  return 0;
}
image.gif

T11. 跳水问题:

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

image.gif编辑

image.gif编辑

int main()
{
  int a = 0;
  int b = 0;
  int c = 0;
  int d = 0;
  int e = 0;
  for (a = 1; a <= 5; a++)
  {
    for (b = 1; b <= 5; b++)
    {
      for (c = 1; c <= 5; c++)
      {
        for (d = 1; d <= 5; d++)
        {
          for (e = 1; e <= 5; e++)
          {
            if (((b == 2) + (a == 3) == 1)
              && ((b == 2) + (e == 4) == 1)
              && ((c == 1) + (d == 2) == 1)
              && ((c == 5) + (d == 3) == 1)
              && ((e == 4) + (a == 1) == 1)
              )
            {
              if (a * b * c * d * e == 120)
                printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
            }
          }
        }
      }
    }
  }
  return 0;
}
image.gif

后记:

此时,时间是2022年1月1日02:00:14,啊……怎么说呢?2021年就这样成为了回不去的“昨天”,很多东西还没来得及……       是啊!没来得及……

从昨天上午考完试就一个人在自习室待到现在,一个人的自习室虽说有些孤独,但我可以放开的码字而不用担心打扰到别人。(C生万物!努力“打怪升级”中…… )

哈哈哈,没成想,就这样“跨年”了……

——————————————————

新年寄语:

祝福各位万事胜意!                                        2021——>2022

————————————————————

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                     ——By 作者:新晓·故知

相关文章
|
6月前
|
Linux C语言 开发者
Linux系统下C语言的高阶编程
Linux系统下C语言的高阶编程
44 0
|
6月前
|
C语言
C语言学习笔记-数组
C语言学习笔记-数组
|
1月前
|
C语言
C语言学习笔记-知识点总结上
C语言学习笔记-知识点总结上
75 1
|
5月前
|
C语言
C语言学习笔记之初识字符串
C语言学习笔记之初识字符串
42 5
|
5月前
|
文件存储 C语言
|
5月前
|
存储 机器学习/深度学习 编译器
C语言代码学习笔记
<编程精粹:编写高质量C语言代码> 读书笔记
|
4月前
|
C语言
|
4月前
|
C语言
|
4月前
|
C语言
C语言学习笔记-W3
w3 条件,循环和数组
32 0
|
5月前
|
IDE 开发工具 C语言
C primer plus 学习笔记 第2章 C语言概述
C primer plus 学习笔记 第2章 C语言概述