C语言初阶练习3.0

简介: 目录1. 实现一个函数来交换两个整数的内容。2. 编写代码,演示多个字符从两端移动,向中间汇聚。3. 编写代码实现,模拟用户登录情景,并且只能登录三次。4. 字符串逆序5. 计算一个数的每位之和(递归实现)6. 递归实现n的k次方

1. 实现一个函数来交换两个整数的内容。

法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* a, int* b)
{
  int z = 0;
  z = *a;
  *a = *b;
  *b = z;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d %d", &a, &b);
  printf("交换前:a=%d b=%d\n", a, b);
  swap(&a, &b);
  printf("交换后:a=%d b=%d\n", a, b);
  return 0;
}

image.png法二:临时变量法,效率高

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  scanf("%d %d", &a, &b);
  int c = 0;
  printf("交换前a=%d b=%d\n", a, b);
  c = a;
  a = b;
  b = c;
  printf("交换后a=%d b=%d\n", a, b);
  return 0;
}

法三:(此法存在溢出的问题)

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a + b;
  b = a - b;
  a = a - b;
  printf("a=%d b=%d", a, b);
  return 0;
}

法四:异或操作符 (仅限于整数)

//3^3=0
//0^5=5
#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a ^ b;
  b = a^ b;  //即为  a ^ b ^ b = a ^ 0 = a
  a = a ^ b; //即为  a ^ a ^ b = 0 ^ b = b
  printf("a=%d b=%d", a, b); 
}

2. 编写代码,演示多个字符从两端移动,向中间汇聚。

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
  char arr1[] = "hello bit!!!!!!";
  char arr2[] = "###############";
  //            "h#############!";
  int left = 0;
  int right = strlen(arr1) - 1;
  while (left <= right)
  {
    arr2[left] = arr1[left];
    arr2[right] = arr1[right];
    printf("%s\n", arr2);
    Sleep(1000);//睡眠函数,单位是毫秒
    //system("cls");//执行系统命令
    left++;
    right--;
  }
  return 0;
}

此种情况屏蔽了system("cls")执行系统命令这个语句,展示如下:image.png 若不屏蔽,则字符会一个一个向中间汇聚且在一行实现。

image.png

…………

image.png

3. 编写代码实现,模拟用户登录情景,并且只能登录三次。

#include<stdio.h>
#include<string.h>
int main()
{
  int i = 0;
  char password[20] = "";
  //假设密码是字符串“123456”
  for (i = 0; i < 3; i++)
  {
    printf("请输入密码:>");
    scanf("%s", password);//password不取地址的原因是password是数组名,数组名本来就是地址
    if (strcmp(password, "123456") == 0)//比较两个字符串是否相等不能用等号==,而应该使用strcmp这个函数
    {
      printf("登陆成功\n");
      break;
    }
    else
    {
      printf("密码错误\n");
    }
  }
  if (i == 3)
  {
    printf("三次密码均错误退出程序");
  }
  return 0;
}

image.png4. 字符串逆序

编写一个函数 reverse_string(char * string)(递归实现)

  实现:将参数字符串中的字符反向排列,不是逆序打印。

  要求:不能使用C函数库中的字符串操作函数。


思路:

逆置字符串,循环的方式实现非常简单

 1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置

 2. 交换两个指针位置上的字符

 3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束


法一:参数是数组

#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
  int count = 0;
  while (*s != '\0')
  {
    count++;
    s++;
  }
  return count;
}
void reverse_string(char arr[])
{
  int left = 0;
  int right = my_strlen(arr)-1;
  //交换
  while (left<right)
  {
    char tmp = arr[left];
    arr[left] = arr[right];
    arr[right] = tmp;
    left++;
    right--;
  }
}
int main()
{
  char arr[] = "abcdefg";
  reverse_string(arr);
  printf("%s\n", arr);//gfedcba
  return 0;
}

image.png 法二:参数是指针

#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
  int count = 0;
  while (*s != '\0')
  {
    count++;
    s++;
  }
  return count;
}
void reverse_string(char* str)
{
  char* left = str;
  char* right = str + my_strlen(str) - 1;
  while (left<right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
int main()
{
  char arr[] = "abcdefg";
  reverse_string(arr);
  printf("%s\n", arr);//gfedcba
  return 0;
}

法三:递归法

#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
  int count = 0;
  while (*s != '\0')
  {
    count++;
    s++;
  }
  return count;
}
void reverse_string(char* arr)
{
  int len = my_strlen(arr);
  char tmp = *arr;
  *arr = *(arr + len - 1);
  *(arr + len - 1) = '\0';
  if(my_strlen(arr+1)>1)
    reverse_string(arr+1);
  *(arr + len - 1) = tmp;
}
int main()
{
  char arr[] = "abcdefg";
  reverse_string(arr);
  printf("%s\n", arr);//gfedcba
  return 0;
}

5. 计算一个数的每位之和(递归实现)

#include<stdio.h>
int ret = 1;
int DigitSum(int n)
{
    if (n > 9)
    {
        int m = n % 10;
        ret = m + DigitSum(n / 10);
    }
    return ret;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int add = DigitSum(n);
    printf("%d", ret);
    return 0;
}

image.png

6. 递归实现n的k次方

#include<stdio.h>
double pow(int n, int k)
{
    if (k == 0)
    {
        return 1;
    }
    else if (k > 0)
    {
        return n * pow(n, k - 1);
    }
    else
    {
        return 1.0 / pow(n, -k);
    }
}
int main()
{
    int n = 0;
    int k = 0;
    scanf("%d %d", &n, &k);
    double ret = pow(n, k);
    printf("%lf\n", ret);
}

image.png

相关文章
|
2月前
|
C语言
C语言练习5
C语言练习5。
13 2
|
3天前
|
算法 C语言
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-2
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
3天前
|
算法 编译器 API
C语言易混淆、简单算法、结构体题目练习、常见关键字总结-1
C语言易混淆、简单算法、结构体题目练习、常见关键字总结
|
16天前
|
C语言
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
|
16天前
|
C语言
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
|
19天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
19天前
|
C语言
换硬币问题(C语言代码练习)
换硬币问题(C语言代码练习)
|
1月前
|
机器学习/深度学习 人工智能 算法
二级C语言选择题练习附答案
二级C语言选择题练习附答案
|
2月前
|
编译器 C语言
拒绝摆烂!C语言练习打卡第七天
拒绝摆烂!C语言练习打卡第七天
|
2月前
|
C语言
拒绝摆烂!C语言练习打卡第六天
拒绝摆烂!C语言练习打卡第六天