C语言基础必刷题

简介: C语言基础必刷题

为了方便大家学习,这里提供了文章电子版方便打印学习!
https://lovexh666.lanzoui.com/icqkNvyqpgh
在这里插入图片描述

教程推荐

1.啊哈C语言

在这里插入图片描述

2.啊哈算法

在这里插入图片描述

3.菜鸟教程

https://www.runoob.com/cprogramming/c-tutorial.html

0.Dev-C++ 安装

https://pc.qq.com/search.html#!keyword=devc%2B%2B
选择 普通下载


点击OK
在这里插入图片描述
点击 I Agree

在这里插入图片描述
点击 Next
在这里插入图片描述
点击 Install 也可以选择Browse安装到其他路劲
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.输出 "Hello, World!"

int main()
{
    // printf() 中字符串需要引号
    printf("Hello, World!");
    return 0;
}

输出结果:
HellWorld!


2.输出整数"

题目:使用 printf() 与 %d 格式化输出整数

#include <stdio.h>
int main()
{
    int number;
 
    // printf() 输出字符串
    printf("输入一个整数: ");  
    
    // scanf() 格式化输入
    scanf("%d", &number);  
    
    // printf() 显示格式化输入
    printf("你输入的整数是: %d", number);
    return 0;
}

输出结果:
输入一个整数: 45
你输入的整数是: 45


3.输出单个字符

题目:使用 printf() 与 %c 格式化输出一个字符

#include <stdio.h>
 
int main() {
   char c;        // 声明 char 变量

   c = 'A';       // 定义 char 变量
   
   printf("c 的值为 %c", c);
   
   return 0;
}

输出结果:
c 的值为 A


4.输出浮点数

题目:使用 printf() 与 %f 输出浮点数

#include <stdio.h>
 
int main() {
   float f;             // 声明浮点数变量
   
   f = 12.001234;       // 定义浮点数变量
   
   printf("f 的值为 %f", f);
   
   return 0;
}

输出结果
f 的值为 12.001234


5. 输出双精度(double)数

题目:使用 printf() 与 %e 输出双精度数

#include <stdio.h>
 
int main() {
   double d;            // 声明双精度变量
   
   d = 12.001234;       // 定义双精度变量
   
   printf("d 的值为 %le", d);
   
   return 0;
}

输出结果:
d 的值为 1.200123e+01


6.两个整数相加

题目:使用 scanf() 来接收输入, printf() 与 %d 格式化输出整数

#include <stdio.h>
int main()
{
    int firstNumber, secondNumber, sumOfTwoNumbers;
    
    printf("输入两个数(以空格分割): ");
 
    // 通过 scanf() 函数接收用户输入的两个整数
    scanf("%d %d", &firstNumber, &secondNumber);
 
    // 两个数字相加
    sumOfTwoNumbers = firstNumber + secondNumber;
 
    // 输出结果
    printf("%d + %d = %d", firstNumber, secondNumber, sumOfTwoNumbers);
 
    return 0;
}

输出结果:
输入两个数(以空格分割): 1 2
1 + 2 = 3


7. 两个浮点数相乘

题目:输入两个浮点数,计算乘积

#include <stdio.h>
int main()
{
    double firstNumber, secondNumber, product;
    printf("输入两个浮点数: ");
 
    // 用户输入两个浮点数
    scanf("%lf %lf", &firstNumber, &secondNumber);  
 
    // 两个浮点数相乘
    product = firstNumber * secondNumber;  
 
    // 输出结果, %.2lf 保留两个小数点
    printf("结果 = %.2lf", product);
    
    return 0;
}

输出结果:
输入两个浮点数: 1.2 2.345
结果 = 2.81


8.字符转 ASCII 码

#include <stdio.h>
int main()
{
    char c;
    printf("输入一个字符: ");
 
    // 读取用户输入
    scanf("%c", &c);  
    
    // %d 显示整数
    // %c 显示对应字符
    printf("%c 的 ASCII 为 %d", c, c);
    return 0;
}


输出结果:
输入一个字符: a
a 的 ASCII 为 97


(1)一次读取长字符,并一个一个显示 ASCII 码

#include <stdio.h>
#define MAX_STRING_LENGTH 65535 // 最大字符串长度
 
int main(){
  char s[MAX_STRING_LENGTH];
  printf("请输入长度小于 %d 的任意字符:",MAX_STRING_LENGTH);
  scanf("%s",s);    // 读取字符串。
  for(int i = 0; s[i]; i++){
    printf("%c的ASCII:%d\t",s[i],s[i]);
  }
}

(2)ASCII 转 字符

#include <stdio.h>
#define MAX_ASCII 127
 
int main()
{
    char num,enter;
    int temp=1;
    for(;temp>0;)
    {
        printf("----------------------------\n");
        printf("|**      开始            **|\n");
        printf("|**ASCII  转  字符  按:1 **|\n");
        printf("|**字符   转  ASCII 按:2 **|\n");
        printf("|**      结束       按:0 **|\n");
        printf("----------------------------\n");
        scanf("%d",&temp);
        if(temp==1)
        {
            printf("请输入数值小于 %d 的任意字符:",MAX_ASCII);
            scanf("%d",&num);
            printf("ASCII为 %d ,对应的字符为 %c \n",num,num);
        }
        if(temp==2)
        {
            printf("输入一个字符: \n");     
            scanf("%c", &enter);      //回车键也算字符,所以这里使用其他变量替之.
            scanf("%c", &num);  
            printf("     %c 的 ASCII 为 %d    \n", num, num);
        }
    }
    return 0;
}

9. 两数相除

题目:使用 scanf() 来接收输入, printf() 与 %d 格式化输出整数

#include <stdio.h>
 
int main(){
 
    int dividend, divisor, quotient, remainder;
 
    printf("输入被除数: ");
    scanf("%d", &dividend);
 
    printf("输入除数: ");
    scanf("%d", &divisor);
 
    // 计算商
    quotient = dividend / divisor;
 
    // 计算余数
    remainder = dividend % divisor;
 
    printf("商 = %d\n", quotient);
    printf("余数 = %d", remainder);
 
    return 0;
}

输出结果:
输入被除数: 5
输入除数: 2
商 = 2
余数 = 1


10.数值比较

(1)比较两个数

以下实例中定义了两个整数变量,并使用 if 来比较两个数值,可以先看下逻辑图:
在这里插入图片描述

#include <stdio.h>
 
int main() {
   int a, b;
 
   a = 11;
   b = 99;
 
   // 也可以通过以下代码实现让用户在终端输入两个数
   // printf("输入第一个值:");
   // scanf("%d", &a);
   // printf("输入第二个值:");
   // scanf("%d", &b);
 
   if(a > b)
      printf("a 大于 b");
   else
      printf("a 小于等于 b");
 
   return 0;
}

输出结果:
a 小于等于 b


(2)比较三个数

以下实例中定义了两个整数变量,并使用 if 来比较三个数值,可以先看下逻辑图:
在这里插入图片描述

#include <stdio.h>
 
int main() {
   int a, b, c;
 
   a = 11;
   b = 22;
   c = 33;
 
   if ( a > b && a > c )
      printf("%d 最大", a);
   else if ( b > a && b > c )
      printf("%d 最大", b);
   else if ( c > a && c > b )
      printf("%d 最大", c);
   else   
      printf("有两个或三个数值相等");
 
   return 0;
}


输出结果:
33 最大


(3)比较两数从键盘输入:

#include <stdio.h>
 
int main()
{
    int a,b;
    printf("请输入俩个整数以空格隔开: \n");
    scanf("%d %d",&a,&b);   // 从键盘输入两个数
    if(a>b){
        printf("%d>%d\n",a,b);
    }
    else
    {
        printf("%d<%d\n",a,b);
    }
}

11.计算字节大小

(1)计算 int, float, double 和 char 字节大小

知识点
`使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小
sizeof 是 C 语言的一种单目操作符,如C语言的其他操作符++、--等,它并不是函数
sizeof 操作符以字节形式给出了其操作数的存储大小`

#include <stdio.h>
 
int main()
{
    int integerType;
    float floatType;
    double doubleType;
    char charType;
 
    // sizeof 操作符用于计算变量的字节大小
    printf("Size of int: %ld bytes\n",sizeof(integerType));
    printf("Size of float: %ld bytes\n",sizeof(floatType));
    printf("Size of double: %ld bytes\n",sizeof(doubleType));
    printf("Size of char: %ld byte\n",sizeof(charType));
 
    return 0;
}

输出结果:
Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of char: 1 byte


(2)计算 long long, long double 字节大小

#include <stdio.h>
int main()
{
    int a;
    long b;
    long long c;
 
    double e;
    long double f;
 
 
    printf("Size of int = %ld bytes \n", sizeof(a));
    printf("Size of long = %ld bytes\n", sizeof(b));
    printf("Size of long long = %ld bytes\n", sizeof(c));
 
    printf("Size of double = %ld bytes\n", sizeof(e));
    printf("Size of long double = %ld bytes\n", sizeof(f));
 
    return 0;
}

输出结果:
Size of int = 4 bytes
Size of long = 8 bytes
Size of long long = 8 bytes
Size of double = 8 bytes
Size of long double = 16 bytes


12.交换两个数的值

(1)使用临时变量

#include <stdio.h>
 
int main()
{
      double firstNumber, secondNumber, temporaryVariable;
 
      printf("输入第一个数字: ");
      scanf("%lf", &firstNumber);
 
      printf("输入第二个数字: ");
      scanf("%lf",&secondNumber);
 
      // 将第一个数的值赋值给 temporaryVariable
      temporaryVariable = firstNumber;
 
      // 第二个数的值赋值给 firstNumber
      firstNumber = secondNumber;
 
      // 将 temporaryVariable 赋值给 secondNumber
      secondNumber = temporaryVariable;
 
      printf("\n交换后, firstNumber = %.2lf\n", firstNumber);
      printf("交换后, secondNumber = %.2lf", secondNumber);
 
      return 0;
}

输出结果:
输入第一个数字: 1
输入第二个数字: 2

交换后, firstNumber = 2.00
交换后, secondNumber = 1.00


(2)不使用临时变量

#include <stdio.h>
 
int main() {
   int a, b;
 
   a = 11;
   b = 99;
 
   printf("交换之前 - \n a = %d, b = %d \n\n", a, b);
 
   a = a + b;  // ( 11 + 99 = 110)  此时 a 的变量为两数之和,b 未改变
   b = a - b;  // ( 110 - 99 = 11)  
   a = a - b;  // ( 110 - 11 = 99)
 
   printf("交换后 - \n a = %d, b = %d \n", a, b);
}

输出结果:
交换之前 -
a = 11, b = 99

交换后 -
a = 99, b = 11


13.判断奇数/偶数

#include <stdio.h>
 
int main()
{
    int number;
 
    printf("请输入一个整数: ");
    scanf("%d", &number);
 
    // 判断这个数除以 2 的余数
    if(number % 2 == 0)
        printf("%d 是偶数。", number);
    else
        printf("%d 是奇数。", number);
 
    return 0;
}

输出结果:
请输入一个整数: 5
5 是奇数。


参考方法:

`奇偶数判断其实有个更简单高效的办法,我们的整数,在计算机中存储的都是二进制
奇数的最后一位必是1,所以我们可以这样写:`

#include <stdio.h>
 
int main()
{
    int number;
 
    printf("请输入一个整数: ");
    scanf("%d", &number);
 
    // 判断这个数最后一位是1这为奇数
    if(number&1)
        printf("%d 是奇数。", number);
    else
        printf("%d 是偶数。", number);
 
    return 0;
}

14.循环区间范围内的奇数/偶数

(1)循环输出指定区间范围的偶数

#include <stdio.h>
 
int main() {
   int i;
 
   for(i = 1; i <= 10; i++) {
      if(i%2 == 0)
         printf(" %2d\n", i);
   }
   return 0;
}

输出结果:
2
4
6
8
10


(2)循环输出指定区间范围的奇数

#include <stdio.h>
 
int main() {
   int i;
 
   for(i = 1; i <= 10; i++) {
      if(i%2 != 0)
         printf("%d\n", i);
   }
   return 0;
}

输出结果:
1
3
5
7
9


(3)使用按位与运算符判断奇偶数

#include <stdio.h>
int main(){
    for (int i=1; i<10; i++)
        // 通过按位与运算符判断奇偶数
        i & 1 ? printf("奇数: %d\n", i) : printf("偶数: %d\n", i);
}

(4)改写为设定区间和除数,返回可以整除的数

#include <stdio.h>
int main()
{
    // 定义自变量和起始数字及除数
    int i, start, end,divisor;
    printf("Please input a starting number:");
    scanf("%d", &start);
    printf("Please input a end number:");
    scanf("%d", &end);
    printf("Please input a integer as the divisor:");
    scanf("%d", &divisor);
    // 返回给定区间能被除数整除的数字
    for (i = start; i <= end; i++)
    {
        if (i % divisor == 0)
            printf("%d\n", i);
    }
    return 0;
}

15.判断元音/辅音

题目:判断输入的字母是元音,还是辅音
`英语有26个字母,元音只包括 a、e、i、o、u 这五个字母,其余的都为辅音
y是半元音、半辅音字母,但在英语中都把他当作辅音`

#include <stdio.h>
 
int main()
{
    char c;
    int isLowercaseVowel, isUppercaseVowel;
 
    printf("输入一个字母: ");
    scanf("%c",&c);
 
    // 小写字母元音
    isLowercaseVowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
 
    // 大写字母元音
    isUppercaseVowel = (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');
 
    // if 语句判断
    if (isLowercaseVowel || isUppercaseVowel)
        printf("%c  是元音", c);
    else
        printf("%c 是辅音", c);
    return 0;
}

输出结果:
输入一个字母: G
G 是辅音


(1)从键盘中输入的不是字母

如果从键盘中输入的不是字母,例如,数字,标点符号,都会输出是辅音。所以我对这个做了一个简单的判定

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
 
int main()
{
    char cLetter;
    int iInRange, iCheck, i, iLetter;
    i = 1;
    while (i)
    {
        printf("输入一个字母, 判断元音与辅音. 如果想退出,请输入“0”。\n");
        scanf("%c", &cLetter);
        getchar();
        printf("----------------------------------------------------------------------\n");
        iLetter = (int)cLetter;
        iCheck = isalpha(iLetter);
        if (iCheck)
        {
            iInRange = (cLetter == 'a') || (cLetter == 'e') || (cLetter == 'i') || (cLetter == 'o') || (cLetter == 'u') || (cLetter == 'A') || (cLetter == 'E') || (cLetter == 'I') || (cLetter == 'O') || (cLetter == 'U');
            if (iInRange)
            {
                printf("字母 %c 是元音字母!\n", cLetter);
                printf("----------------------------------------------------------------------\n");
                continue;
            }
            else
            {
                printf("字母 %c 是辅音字母!\n", cLetter);
                printf("----------------------------------------------------------------------\n");
                continue;
            }
        }
        else if (iCheck == 0)
        {
            if (iLetter != 48)
            {
                printf("Error input!\n");
                printf("----------------------------------------------------------------------\n");
                continue;
            }
            else if ((int)cLetter == 48)
            {
                printf("Bye bye~~~!\n");
                printf("----------------------------------------------------------------------\n");
                i = (int)cLetter - 48;
            }
        }
    }
    return 0;
}

(2)参考方法:

#include <stdio.h>
#include <stdlib.h>
 
int main() {
    char c;
    printf("请输入一个字母:");
    scanf("%c",&c);
    if ((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
        if (c=='A'||c=='E'||c=='I'||c =='O'||c=='U'||c=='a'||c=='e'||c=='i'||c =='o'||c=='u')
            printf("%c为元音",c);
        else 
            printf("%c为辅音",c);
    else
        printf("Error input!");
    return 0;
}

(3)多个字符输入错误的问题:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
 
int main()
{
    char cLetter,b,a;
    int iInRange, iCheck, i, iLetter;
    i = 1;
    while (i)
    {
        printf("输入一个字母, 判断元音与辅音. 如果想退出,请输入“0”。\n");
        scanf("%c", &a);
        cLetter=a;
    scanf("%c", &a);
 
        while(a!=10 )
        {  
 
        scanf("%c", &a);
        }
        //getchar();//getchar is must get a key input and CR
        printf("----------------------------------------------------------------------\n");
        iLetter = (int)cLetter;
        iCheck = isalpha(iLetter);
        if (iCheck)
        {
            iInRange = (cLetter == 'a') || (cLetter == 'e') || (cLetter == 'i') || (cLetter == 'o') || (cLetter == 'u') || (cLetter == 'A') || (cLetter == 'E') || (cLetter == 'I') || (cLetter == 'O') || (cLetter == 'U');
            if (iInRange)
            {
                printf("字母 %c 是元音字母!\n", cLetter);
                printf("----------------------------------------------------------------------\n");
                continue;
            }
            else
            {
                printf("字母 %c 是辅音字母!\n", cLetter);
                printf("----------------------------------------------------------------------\n");
                continue;
            }
        }
        else if (iCheck == 0)
        {
            if (iLetter != 48)
            {
                printf("Error input!\n");
                printf("----------------------------------------------------------------------\n");
                continue;
            }
            else if ((int)cLetter == 48)
            {
                printf("Bye bye~~~!\n");
                printf("----------------------------------------------------------------------\n");
                i = (int)cLetter - 48;
            }
        }
    }
    return 0;
}

16. 判断三个数中的最大数

#include <stdio.h>
 
int main()
{
    double n1, n2, n3;
 
    printf("请输入三个数,以空格分隔: ");
    scanf("%lf %lf %lf", &n1, &n2, &n3);
 
    if( n1>=n2 && n1>=n3 )
        printf("%.2f 是最大数。", n1);
 
    if( n2>=n1 && n2>=n3 )
        printf("%.2f 是最大数。", n2);
 
    if( n3>=n1 && n3>=n2 )
        printf("%.2f 是最大数。", n3);
 
    return 0;
}

输出结果:
请输入三个数,以空格分隔: 1 2 3
3.00 是最大数。


(1)参考方法:

#include<stdio.h>
 
int main()
{
    int a,b,c,max;
    printf("请输入三个数,用空格隔开:");
    scanf("%d %d %d",&a,&b,&c);
    if(a>b){
        max=a;
    } else {
        max=b;
    }
    if(max>c){
        printf("最大值是%d",max);
    } else{
        max=c;
        printf("最大值是%d",max);
    }
    return 0;
}

(2)用三元表达式判断:

#include <stdio.h>
 
int main()
{
  int a, b, c, max;
  printf("请输入三个数,用空格分割: ");
  scanf("%d %d %d", &a, &b, &c);
  max =  a > b ? ( a > c ? a : c ) : ( b  > c ? b : c);
  printf("最大值是:%d", max);
  return 0;
}

17.一元二次方程

**题目:求一元二次方程:ax2+bx+c=0 的根。
输入三个实数a,b,c的值,且a不等于0。**

#include <stdio.h>
#include <math.h>
 
int main()
{
        float a,b,c,x1,x2,d;
        printf("输入方程的三个系数:");
        scanf("%f %f %f",&a,&b,&c);
        if(a!=0)
        {
                d=sqrt(b*b-4*a*c);
                x1=(-b+d)/(2*a);
                x2=(-b-d)/(2*a);
                if(x1<x2) 
                    printf("%0.2f %0.2f\n",x2,x1); 
                else
                    printf("%0.2f %0.2f\n",x1,x2);
        }
        return 0;
}

输出结果:
输入方程的三个系数:1 2 1
-1.00 -1.00


输入的三个系数 a、b、c 的判断解的情况

一元二次方程可能有两个实数解,或者一个实数解,或者无实数解

#include <stdio.h>
#include <math.h>
 
int main(void)
{
    double a ,b , c;
    double delat;
    double x1, x2;
    char ch;
    do
    { 
        printf("请输入一元二次方程的三个系数:\n");
        
        printf("请输入系数 a = \t");
        scanf("%lf",&a);
        
        printf("请输入系数 b = \t");
        scanf("%lf",&b);
        
        printf("请输入系数 c = \t");
        scanf("%lf",&c);
        
        delat = b*b-4*a*c;
        
        if(delat>0)
        {
            x1= ( -b+sqrt(delat) )/2;
            x2= ( -b-sqrt(delat) )/2;
            printf("有2个实数解:x1 = %lf  x2 = %lf\n",x1,x2);
        }
        else if(delat==0)
        {
            x1=( -b+sqrt(delat) )/2;
            printf("有2个相等实数解:x1=x2 = %lf\n",x1);
        }
        else
            printf("无实数解\n");
 
        printf("是否继续吗:Y/N\n");
        scanf(" %c",&ch);
    }while(ch=='y'||ch=='Y');
    return 0;
}

18.判断闰年

题目:用户输入年份,判断该年份是否为闰年

#include <stdio.h>
 
int main()
{
    int year;
    printf("输入年份: ");
    scanf("%d",&year);
    // year = 400;
 
    // (四年一闰,百年不闰) || 四百年在闰年
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)    
    {
        printf("y\n");
    }
    else
    {
        printf("n\n");
    }
 
    return 0;
}

输出结果:
输入年份: 1990
1990 不是闰年


19.计算自然数的和

自然数是指表示物体个数的数,即由0开始,0,1,2,3,4,……一个接一个,组成一个无穷的集体,即指非负整数

(1)使用 for

#include <stdio.h>
int main()
{
    int n, i, sum = 0;
    
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    for(i=1; i <= n; ++i)
    {
        sum += i;   // sum = sum+i;
    }
 
    printf("Sum = %d",sum);
 
    return 0;
}

(2) 使用 while

#include <stdio.h>
int main()
{
    int n, i, sum = 0;
    
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    i = 1;
    while ( i <=n )
    {
        sum += i;
        ++i;
    }
 
    printf("Sum = %d",sum);
 
    return 0;
}

(3)使用递归

#include <stdio.h>
int addNumbers(int n);
 
int main()
{
    int num;
    printf("输入一个整数: ");
    scanf("%d", &num);
    printf("Sum = %d",addNumbers(num));
    return 0;
}
 
int addNumbers(int n)
{
    if(n != 0)
        return n + addNumbers(n-1);
    else
        return n;
}

(4)首尾相加

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个自然数:");
    while (scanf("%d", &num) == 1)
    {
        printf("Sum = %d", (num + 1) * num / 2);
        break;
    }
    return 0;
}

20.输出九九乘法口诀表

使用嵌套 for 循环输出九九乘法口诀表

#include<stdio.h> 
 
int main(){  
    //外层循环变量,控制行  
    int i = 0;  
    //内层循环变量,控制列   
    int j = 0;   
    for(i=1;i<=9;i++){  
        for(j=1;j<=i;j++){  
            printf("%dx%d=%d\t",j,i,i*j);  
        }  
        //每行输出完后换行   
        printf("\n");     
    }  
}

输出结果:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81


方法二:递归实现方式

#include <stdio.h>
 
void func(int i, int j)
{
    if(i>j)
        return;
    printf("%dx%d=%d\t", i, j, i*j);
    func(i+1, j);
}
 
void f(int n)
{
    if(n==1)
        printf("1x1=1\n");
    else
    {
        f(n-1);
        func(1, n);
        putchar('\n');
    }
}
 
 
int main()
{
    f(9);
    return 0;
}

21.斐波那契数列

**题目:斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
这个数列从第3项开始,每一项都等于前两项之和**

(1)方法一:输出指定数量的斐波那契数列

#include <stdio.h>
 
int main()
{
    int i, n, t1 = 1, t2 = 1, nextTerm;
 
    printf("输出几项: ");
    scanf("%d", &n);
 
    printf("斐波那契数列: ");
 
    for (i = 1; i <= n; ++i)
    {
        printf("%d, ", t1);
        nextTerm = t1 + t2;
        t1 = t2;
        t2 = nextTerm;
    }
    return 0;
}

输出结果:
输出几项: 10
斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,


(2)方法二:输出指定数字前的斐波那契数列

#include <stdio.h>
 
int main()
{
    int t1 = 1, t2 = 1, nextTerm = 2, n;
 
    printf("输入一个正数: ");
    scanf("%d", &n);
 
    // 显示前两项
    printf("斐波那契数列: %d, %d, ", t1, t2);
 
    nextTerm = t1 + t2;
 
    while(nextTerm <= n)
    {
        printf("%d, ",nextTerm);
        t1 = t2;
        t2 = nextTerm;
        nextTerm = t1 + t2;
    }
    
    return 0;
}

输出结果:
输出几项: 100
斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,


22.求两数的最大公约数

题目:用户输入两个数,求这两个数的最大公约数

(1)方法一:使用 for 和 if

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd;
 
    printf("输入两个正整数,以空格分隔: ");
    scanf("%d %d", &n1, &n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断 i 是否为最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    printf("%d 和 %d 的最大公约数是 %d", n1, n2, gcd);
 
    return 0;
}

输出结果:
输入两个正整数,以空格分隔: 81 153
81 和 153 的最大公约数是 9


(2)方法二:使用 while 和 if(更相减损术)

#include <stdio.h>
int main()
{
    int n1, n2;
    
    printf("输入两个数,以空格分隔: ");
    scanf("%d %d",&n1,&n2);
 
    while(n1!=n2)
    {
        if(n1 > n2)
            n1 -= n2;
        else
            n2 -= n1;
    }
    printf("GCD = %d",n1);
 
    return 0;
}

输出结果:
输入两个数,以空格分隔: 81 153
GCD = 9


(3)方法三:适用正数和负数

#include <stdio.h>
 
int main()
{
    int n1, n2;
 
    printf("输入两个数,以空格分隔: ");
    scanf("%d %d",&n1,&n2);
 
    // 如果输入的是负数,将其转换为正数
    n1 = ( n1 > 0) ? n1 : -n1;
    n2 = ( n2 > 0) ? n2 : -n2;
 
    while(n1!=n2)
    {
        if(n1 > n2)
            n1 -= n2;
        else
            n2 -= n1;
    }
    printf("GCD = %d",n1);
 
    return 0;
}

输出结果:
输入两个数,以空格分隔: 81 -153
GCD = 9


(4)方法四:使用递归

#include <stdio.h>
int hcf(int n1, int n2);
int main()
{
   int n1, n2;
   printf("输入两个正整数: ");
   scanf("%d %d", &n1, &n2);
 
   printf("%d 和 %d 的最大公约数为 %d", n1, n2, hcf(n1,n2));
   return 0;
}
 
int hcf(int n1, int n2)
{
    if (n2 != 0)
       return hcf(n2, n1%n2);
    else 
       return n1;
}

(5)方法五:用辗转相除法

#include <stdio.h>
 
int main()
{
    int a,b;
    int t;
    scanf("%d %d", &a, &b);
    while (b !=0 ){
        t = a%b;
        a = b;
        b = t;
        printf("a=%d b=%d t=%d\n",a , b, t);
    }
    printf("最大公约数是%d\n", a);
    return 0;
}

23.求两数最小公倍数

题目:用户输入两个数,求这两个数的最小公倍数

(1)方法一:使用 while 和 if

#include <stdio.h>
 
int main()
{
    int n1, n2, minMultiple;
    printf("输入两个正整数: ");
    scanf("%d %d", &n1, &n2);
 
    // 判断两数较大的值,并赋值给 minMultiple
    minMultiple = (n1>n2) ? n1 : n2;
 
    // 条件为 true
    while(1)
    {
        if( minMultiple%n1==0 && minMultiple%n2==0 )
        {
            printf("%d 和 %d 的最小公倍数为 %d", n1, n2,minMultiple);
            break;
        }
        ++minMultiple;
    }
    return 0;
}

输出结果:
输入两个正整数: 72 120
72 和 120 的最小公倍数为 360


(2)方法二:通过最大公约数计算

#include <stdio.h>
 
int main()
{
    int n1, n2, i, gcd, lcm;
 
    printf("输入两个正整数: ");
    scanf("%d %d",&n1,&n2);
 
    for(i=1; i <= n1 && i <= n2; ++i)
    {
        // 判断最大公约数
        if(n1%i==0 && n2%i==0)
            gcd = i;
    }
 
    lcm = (n1*n2)/gcd;
    printf("%d 和 %d 的最小公倍数为 %d", n1, n2, lcm);
 
    return 0;
}

输出结果:
输入两个正整数: 72 120
72 和 120 的最小公倍数为 360


24.阶乘

**一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。
n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。**

(1)方法一:

#include <stdio.h>
 
int main()
{
    int n, i;
    unsigned long long factorial = 1;
 
    printf("输入一个整数: ");
    scanf("%d",&n);
 
    // 如果输入是负数,显示错误
    if (n < 0)
        printf("Error! 负数没有阶乘jiechen");
 
    else
    {
        for(i=1; i<=n; ++i)
        {
            factorial *= i;              // factorial = factorial*i;
        }
        printf("%d! = %llu", n, factorial);
    }
 
    return 0;
}

输出结果:
输入一个整数: 10
10! = 3628800


(2)方法二:使用递归

#include <stdio.h>
long int multiplyNumbers(int n);
 
int main()
{
    int n;
    printf("输入一个整数: ");
    scanf("%d", &n);
    printf("%d! = %ld", n, multiplyNumbers(n));
    return 0;
}
long int multiplyNumbers(int n)
{
    if (n >= 1)
        return n*multiplyNumbers(n-1);
    else
        return 1;
}

25. 循环输出26个字母

(1)循环输出 26 个字母

#include <stdio.h>
 
int main()
{
    char c;
 
    for(c = 'A'; c <= 'Z'; ++c)
       printf("%c ", c);
    
    return 0;
}

输出结果:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z


(2)输出大写或小写字母

#include <stdio.h>
 
int main()
{
    char c;
 
    printf("输入 u 显示大写字母,输入 l 显示小写字母: ");
    scanf("%c", &c);
 
    if(c== 'U' || c== 'u')
    {
       for(c = 'A'; c <= 'Z'; ++c)
         printf("%c ", c);
    }
    else if (c == 'L' || c == 'l')
    {
        for(c = 'a'; c <= 'z'; ++c)
         printf("%c ", c);
    }
    else
       printf("Error! 输入非法字符。");
    return 0;
}

输出结果:
输入 u 显示大写字母,输入 l 显示小写字母: l
a b c d e f g h i j k l m n o p q r s t u v w x y z


26.判断数字为几位数

题目:用户输入数字,判断该数字是几位数
记忆:除取前,余取后

#include <stdio.h>
int main()
{
    long long n;
    int count = 0;
 
    printf("输入一个整数: ");
    scanf("%lld", &n);
 
    while(n != 0)
    {
        // n = n/10
        n /= 10;
        ++count;
    }
 
    printf("数字是 %d 位数。", count);
}

输出结果:
输入一个整数: 2345
数字是 4 位数。


27.计算一个数的 n 次方

题目:计算一个数的 n 次方,例如: 23,其中 2 为基数,3 为指数

(1)方法一: 使用 while

#include <stdio.h>
 
int main()
{
    int base, exponent;
 
    long long result = 1;
 
    printf("基数: ");
    scanf("%d", &base);
 
    printf("指数: ");
    scanf("%d", &exponent);
 
    while (exponent != 0)
    {
        result *= base;
        --exponent;
    }
    printf("结果:%lld", result);
 
    return 0;
}

输出结果:
基数: 2
指数: 3
结果:8


(2)方法二:使用 pow() 函数

#include <stdio.h>
#include <math.h>
 
int main()
{
    double base, exponent, result;
 
    printf("基数: ");
    scanf("%lf", &base);
 
    printf("指数: ");
    scanf("%lf", &exponent);
 
    // 计算结果
    result = pow(base, exponent);
 
    printf("%.1lf^%.1lf = %.2lf", base, exponent, result);
 
    return 0;
}

输出结果:
基数: 2
指数: 3
2.0^3.0 = 8.00


(3)方法三:递归

#include <stdio.h>
 
int power(int n1, int n2);
 
int main()
{
    int base, powerRaised, result;
 
    printf("基数: ");
    scanf("%d",&base);
 
    printf("指数(正整数): ");
    scanf("%d",&powerRaised);
 
    result = power(base, powerRaised);
 
    printf("%d^%d = %d", base, powerRaised, result);
    return 0;
}
 
int power(int base, int powerRaised)
{
    if (powerRaised != 0)
        return (base*power(base, powerRaised-1));
    else
        return 1;
}

28.判断回文数

**题目:判断一个数是否为回文数。
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数**

include <stdio.h>
 
int main()
{
    int n, reversedInteger = 0, remainder, originalInteger;
 
    printf("输入一个整数: ");
    scanf("%d", &n);
 
    originalInteger = n;
 
    // 翻转
    while( n!=0 )
    {
        remainder = n%10;
        reversedInteger = reversedInteger*10 + remainder;
        n /= 10;
    }
 
    // 判断
    if (originalInteger == reversedInteger)
        printf("%d 是回文数。", originalInteger);
    else
        printf("%d 不是回文数。", originalInteger);
    
    return 0;
}

输出结果:
输入一个整数: 12321
12321 是回文数


参考方法:

#include <stdio.h>
#include<string.h>
 
int main()
{
    int a=12021;
    char s[10]={'\0'},s1[10]={'\0'};
    sprintf(s,"%d",a); // 将整数转换为字符串
    int n=strlen(s);
    int j=0;
    for(int i=n-1;i>=0;i--)
    {
        s1[j++]=s[i];
    }
    //s[j]='\0';
    printf("%s %s\n",s,s1);
    if(!strcmp(s,s1))
        printf("整数%d是回文串",a);
    else
        printf("整数%d不是回文串",a);
    return 0;
}

29.判断素数

题目:质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数

(1)判断素数

#include <stdio.h>
 
int main()
{
    int n, i, flag = 0;
 
    printf("输入一个正整数: ");
    scanf("%d",&n);
 
    for(i=2; i<=n/2; ++i)
    {
        // 符合该条件不是素数
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }
 
    if (flag==0)
        printf("%d 是素数",n);
    else
        printf("%d 不是素数",n);
    
    return 0;
}

输出结果:
输入一个正整数: 29
29 是素数


(2)判断两个数之间的素数

#include <stdio.h>
 
int main()
{
    int low, high, i, flag;
    printf("输入两个整数: ");
    scanf("%d %d", &low, &high);
 
    printf("%d 与 %d 之间的素数为: ", low, high);
 
    while (low < high)
    {
        flag = 0;
 
        for(i = 2; i <= low/2; ++i)
        {
            if(low % i == 0)
            {
                flag = 1;
                break;
            }
        }
 
        if (flag == 0)
            printf("%d ", low);
 
        ++low;
    }
 
    return 0;
}

输出结果:
输入两个整数: 100 200
100 与 200 之间的素数为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199


(3)使用函数判断两数间的素数

#include <stdio.h>
 
int checkPrimeNumber(int n);
int main()
{
    int n1, n2, i, flag;
 
    printf("输入两个正整数: ");
    scanf("%d %d", &n1, &n2);
    printf("%d 和 %d 间的素数为: ", n1, n2);
 
    for(i=n1+1; i<n2; ++i)
    {
        // 判断是否为素数
        flag = checkPrimeNumber(i);
 
        if(flag == 1)
            printf("%d ",i);
    }
    return 0;
}
 
// 函数定义
int checkPrimeNumber(int n)
{
    int j, flag = 1;
 
    for(j=2; j <= n/2; ++j)
    {
        if (n%j == 0)
        {
            flag =0;
            break;
        }
    }
    return flag;
}

输出结果:
输入两个正整数: 10 30
10 和 30 间的素数为: 11 13 17 19 23 29


(4)用sqrt降低时间复杂度

#include<stdio.h>
#include<math.h>
int issushu(int k);
int main(){
    int n,count=0;
    scanf("%d",&n);
    for(int i=n;i>3;i--)
        if(issushu(i))
            if(issushu(i-2))
                count++;
    printf("%d",count);
    return 0;
}
 
int issushu(int k){
    for(int i=2;i<sqrt(k)+1;i++){
        if(k%i==0)
        return 0;
    }
    return 1;
}

30.判断Armstrong数(阿姆斯壮数)

Armstrong 数,就是n位数的各位数的n次方之和等于该数,如153 = 1^3 + 5^3 + 3^3, 1634 = 1^4 + 6^4 + 3^4 + 4^4

(1)判断一个数是否为Armstrong数

#include <stdio.h>
int main()
{
    int number, originalNumber, remainder, result = 0;
 
    printf("输入三位数: ");
    scanf("%d", &number);
 
    originalNumber = number;
 
    while (originalNumber != 0)
    {
        remainder = originalNumber%10;
        result += remainder*remainder*remainder;
        originalNumber /= 10;
    }
 
    if(result == number)
        printf("%d 是 Armstrong 数",number);
    else
        printf("%d 不是 Armstrong 数",number);
 
    return 0;
}

输出结果:
输入三位数: 371
371 是 Armstrong


(2)两数之间的 Armstrong 数

#include <stdio.h>
#include <math.h>
 
int main()
{
    int low, high, i, temp1, temp2, remainder, n = 0, result = 0;
 
    printf("输入两个整数: ");
    scanf("%d %d", &low, &high);
    printf("%d 和 %d 之间的 Armstrong 数为: ", low, high);
 
    for(i = low + 1; i < high; ++i)
    {
        temp2 = i;
        temp1 = i;
 
        // 计算
        while (temp1 != 0)
        {
            temp1 /= 10;
            ++n;
        }
        
        while (temp2 != 0)
        {
            remainder = temp2 % 10;
            result += pow(remainder, n);
            temp2 /= 10;
        }
 
        if (result == i) {
            printf("%d ", i);
        }
 
        n = 0;
        result = 0;
 
    }
    return 0;
}

输出结果:
输入两个整数: 100 1000
100 和 1000 之间的 Armstrong 数为: 153 370 371 407


(3) 使用函数判断Armstrong 数

#include <stdio.h>
#include <math.h>
 
int checkPrimeNumber(int n);
int checkArmstrongNumber(int n);
 
int main()
{
    int n, flag;
 
    printf("输入正整数: ");
    scanf("%d", &n);
 
    // 检测 Armstrong 数
    flag = checkArmstrongNumber(n);
    if (flag == 1)
        printf("%d 是 Armstrong 数。", n);
    else
        printf("%d 不是 Armstrong 数。",n);
    return 0;
}
  
int checkArmstrongNumber(int number)
{
    int originalNumber, remainder, result = 0, n = 0, flag;
 
    originalNumber = number;
 
    while (originalNumber != 0)
    {
        originalNumber /= 10;
        ++n;
    }
 
    originalNumber = number;
 
    while (originalNumber != 0)
    {
        remainder = originalNumber%10;
        result += pow(remainder, n);
        originalNumber /= 10;
    }
 
    // 判断条件
    if(result == number)
        flag = 1;
    else
        flag = 0;
 
    return flag;
}

输出结果:
输入正整数: 371
371 是 Armstrong 数。


31.求一个整数的所有因数

假如a*b=c(a、b、c都是整数),那么我们称a和b就是c的因数

#include <stdio.h>
 
int main()
{
    int number, i;
 
    printf("输入一个整数: ");
    scanf("%d",&number);
 
    printf("%d 的因数有: ", number);
    for(i=1; i <= number; ++i)
    {
        if (number%i == 0)
        {
            printf("%d ",i);
        }
    }
 
    return 0;
}

输出结果:
输入一个整数: 60
60 的因数有: 1 2 3 4 5 6 10 12 15 20 30 60


寻找两数的所有公因数:

#include <stdio.h>
 
int main()
{
    int num1, num2, i;
    printf("输入两个数,使用空格分隔:");
    scanf("%d %d", &num1, &num2);
    for (i = 1; i <= (num1 > num2 ? num2 : num1) ; ++i)
    {
        if (num1%i == 0 && num2%i == 0)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

32.创建各类三角形图案

(1)创建三角形图案

题目:

#include <stdio.h>
 
int main()
{
    int i, j, rows;
 
    printf("行数: ");
    scanf("%d",&rows);
 
    for(i=1; i<=rows; ++i)
    {
        for(j=1; j<=i; ++j)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

输出结果:

*
* *
* * *
* * * *
* * * * *

(2)金字塔

#include <stdio.h>
int main()
{
    int i, space, rows, k=0;
 
    printf("Enter number of rows: ");
    scanf("%d",&rows);
 
    for(i=1; i<=rows; ++i, k=0)
    {
        for(space=1; space<=rows-i; ++space)
        {
            printf("  ");
        }
 
        while(k != 2*i-1)
        {
            printf("* ");
            ++k;
        }
 
        printf("\n");
    }
    
    return 0;
}

输出结果:

        *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *

(3)倒金字塔

#include<stdio.h>
int main()
{
    int rows, i, j, space;
 
    printf("行数: ");
    scanf("%d",&rows);
 
    for(i=rows; i>=1; --i)
    {
        for(space=0; space < rows-i; ++space)
            printf("  ");
 
        for(j=i; j <= 2*i-1; ++j)
            printf("* ");
 
        for(j=0; j < i-1; ++j)
            printf("* ");
 
        printf("\n");
    }
 
    return 0;
}

输出结果:

* * * * * * * * *
  * * * * * * *
    * * * * *
      * * *
        *

(4)杨辉三角

#include <stdio.h>
int main()
{
    int rows, coef = 1, space, i, j;
 
    printf("行数: ");
    scanf("%d",&rows);
 
    for(i=0; i<rows; i++)
    {
        for(space=1; space <= rows-i; space++)
            printf("  ");
 
        for(j=0; j <= i; j++)
        {
            if (j==0 || i==0)
                coef = 1;
            else
                coef = coef*(i-j+1)/j;
 
            printf("%4d", coef);
        }
        printf("\n");
    }
 
    return 0;
}

输出结果:

           1
         1   1
       1   2   1
     1   3   3    1
   1  4    6   4   1
 1  5   10   10  5   1 

(5)弗洛伊德三角形

#include <stdio.h> 
#define N 10 
int main() 
{  
    int i,j,l; 
    for(i=1,j=1;i<=N;i++) 
    { 
        for(l=1;l<=i;l++,j++) 
            printf("%5d",j); 
        printf("\n"); 
    } 
    return 0; 
}

输出结果:

  1
    2    3
    4    5    6
    7    8    9   10
   11   12   13   14   15
   16   17   18   19   20   21
   22   23   24   25   26   27   28
   29   30   31   32   33   34   35   36
   37   38   39   40   41   42   43   44   45
   46   47   48   49   50   51   52   53   54   55

33.小项目:计算器

(1)实现加减乘除计算

# include <stdio.h>
 
int main() {
 
    char operator;
    double firstNumber,secondNumber;
 
    printf("输入操作符 (+, -, *,): ");
    scanf("%c", &operator);
 
    printf("输入两个数字: ");
    scanf("%lf %lf",&firstNumber, &secondNumber);
 
    switch(operator)
    {
        case '+':
            printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber);
            break;
 
        case '-':
            printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber);
            break;
 
        case '*':
            printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber);
            break;
 
        case '/':
            printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber);
            break;
 
        // operator doesn't match any case constant (+, -, *, /)
        default:
            printf("Error! operator is not correct");
    }
    
    return 0;
}

输出结果:
输入操作符 (+, -, *,): *
输入两个数字: 4 5
4.0 * 5.0 = 20.0


(2)豪华版计算器

#include <stdio.h>
 
int get_option();
void print_result(int num1,int num2,int result,int option);
 
int main(void)
{
    int done = 0;
    int option,num1,num2,result;
    
    while(!done)
    {
        option = get_option();
        if(option == 5)
        {
            done = 1;
        }
        else {
            do {
                printf("\n请输入两个数:");
                scanf("%d %d",&num1,&num2);
                if(option == 4 && num2 == 0)
                {
                    printf("\n对不起,除数不能为零");
                } 
                else {
                    switch(option){
                        case 1:
                            result = num1 + num2;
                            break;
                        case 2:
                            result = num1 - num2;
                            break;
                        case 3:
                            result = num1 * num2;
                            break;
                        case 4:
                            result = num1 / num2;
                    }
                    print_result(num1,num2,result,option);
                }
            }while(option == 4 && num2 == 0);
        }
    }
 
    return 0;
}
 
int get_option()
{
    int option;
    do
    {
        printf("\n ****************");
        printf("\n *    1.加法    *");
        printf("\n *    2.减法    *");
        printf("\n *    3.乘法    *");
        printf("\n *    4.除法    *");
        printf("\n *    0.退出    *");
        printf("\n ****************");
 
        printf("\n请输入您需要的功能:");
        scanf("%d",&option);
 
        if(option <1 || option > 5)
        {
            printf("对不起您输入的数字有误,请重新输入。\n");
        }
    }while(option <1 || option > 5);
 
        return option;
}
 
void print_result(int num1,int num2,int result,int option){
    char operator;
    switch(option){
        case 1:
            operator = '+';
            break;
        case 21:
            operator = '-';
            break;
        case 3:
            operator = '*';
            break;
        case 4:
            operator = '/';
            break;
    }
    printf("\n** %d %c %d = %d **\n",num1,operator,num2,result);
}

34.计算一个数是否可为两个素数之和

#include <stdio.h>
 
int checkPrime(int n);
int main()
{
    int n, i, flag = 0;
 
    printf("输入正整数: ");
    scanf("%d", &n);
 
    for(i = 2; i <= n/2; ++i)
    {
        // 检测判断
        if (checkPrime(i) == 1)
        {
            if (checkPrime(n-i) == 1)
            {
                printf("%d = %d + %d\n", n, i, n - i);
                flag = 1;
            }
 
        }
    }
 
    if (flag == 0)
        printf("%d 不能分解为两个素数。", n);
 
    return 0;
}
 
// 判断素数
int checkPrime(int n)
{
    int i, isPrime = 1;
 
    for(i = 2; i <= n/2; ++i)
    {
        if(n % i == 0)
        {
            isPrime = 0;
            break;
        }  
    }
 
    return isPrime;
}

输出结果:
输入正整数: 34
34 = 3 + 31
34 = 5 + 29
34 = 11 + 23
34 = 17 + 17


35.二进制与十进制相互转换

(1)二进制转换为十进制

#include <stdio.h>
#include <math.h>
 
int convertBinaryToDecimal(long long n);
 
int main()
{
    long long n;
    printf("输入一个二进制数: ");
    scanf("%lld", &n);
    printf("二进制数 %lld 转换为十进制为 %d", n, convertBinaryToDecimal(n));
    return 0;
}
 
int convertBinaryToDecimal(long long n)
{
    int decimalNumber = 0, i = 0, remainder;
    while (n!=0)
    {
        remainder = n%10;
        n /= 10;
        decimalNumber += remainder*pow(2,i);
        ++i;
    }
    return decimalNumber;
}

输出结果:
输入一个二进制数: 110110111
二进制数 110110111 转换为十进制为 439


(2)十进制转换为二进制

#include <stdio.h>
#include <math.h>
 
long long convertDecimalToBinary(int n);
 
int main()
{
    int n;
    printf("输入一个十进制数: ");
    scanf("%d", &n);
    printf("十进制数 %d 转换为二进制位 %lld", n, convertDecimalToBinary(n));
    return 0;
}
 
long long convertDecimalToBinary(int n)
{
    long long binaryNumber = 0;
    int remainder, i = 1, step = 1;
 
    while (n!=0)
    {
        remainder = n%2;
        printf("Step %d: %d/2, 余数 = %d, 商 = %d\n", step++, n, remainder, n/2);
        n /= 2;
        binaryNumber += remainder*i;
        i *= 10;
    }
    return binaryNumber;
}

输出结果:
输入一个十进制数: 100
Step 1: 100/2, 余数 = 0, 商 = 50
Step 2: 50/2, 余数 = 0, 商 = 25
Step 3: 25/2, 余数 = 1, 商 = 12
Step 4: 12/2, 余数 = 0, 商 = 6
Step 5: 6/2, 余数 = 0, 商 = 3
Step 6: 3/2, 余数 = 1, 商 = 1
Step 7: 1/2, 余数 = 1, 商 = 0
十进制数 100 转换为二进制位 1100100


36.字符串翻转

(1)字符串翻转(递归法)

#include <stdio.h>
void reverseSentence();
 
int main()
{
    printf("输入一个字符串: ");
    reverseSentence();
 
    return 0;
}
 
void reverseSentence()
{
    char c;
    scanf("%c", &c);
 
    if( c != '\n')
    {
        reverseSentence();
        printf("%c",c);
    }
}

输出结果:
输入一个字符串: xiaohang
gnahoaix


(2)参考方法1:

#include <stdio.h>
#include <string.h>
 
char* reverseStr(char* str);
 
int main()
{
    char str[30];
    printf("输入一个字符串: ");
    scanf("%s", str);
    printf("翻转之前的字符串为:%s\n",str);
    printf("翻转之后的字符串为:%s",reverseStr(str));
    return 0;
}
 
char* reverseStr(char* str)
{
    int i=0;
    int j=strlen(str)-1;
    char temp;
    while (i<j)
    {
        temp=*(str+i);
        *(str+i)=*(str+j);
        *(str+j)=temp;
        i++;
        j--;
    }
    return str;
}

(3)参考方法2:

#include <stdio.h>
#include <string.h>
 
void reverseStr(char* str);
 
int main()
{
    char str[30];
    printf("输入一个字符串: ");
    scanf("%s", str);
    printf("翻转之后的字符串为:");
    reverseStr(str);
    return 0;
}
 
void reverseStr(char* str)
{
     if(*str=='\0') return;
     reverseStr(str+1);
     printf("%c",*str);
}

37.计算数组元素平均值

使用 for 循环迭代出输出元素,并将各个元素相加算出总和,再除于元素个数

(1)实例 1

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int sum, loop;
   float avg;
 
   sum = avg = 0;
   
   for(loop = 0; loop < 10; loop++) {
      sum = sum + array[loop];
   }
   
   avg = (float)sum / loop;
   
   printf("平均值为 %.2f", avg);   
   
   return 0;
}

输出结果:
平均值为 4.50


(2)用 scanf 的特性来控制循环:

#include <stdio.h>
 
int main(void)
{
    float x;
    printf("请输入数字:(输入q退出)");
    int i=0;
    float status;
    float sum=0;
    float avg=0;
    status=scanf("%f", &x);
    while ( status==1 ) {
        sum+=x;
        printf("请输入数字:(输入q退出)");
        status=scanf("%f", &x);
        i++;
    }
    avg=sum/(i);
    printf("%.2f",avg);
    return 0;
}

38.输出数组

使用 for 循环输出数组:

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int loop;
 
   for(loop = 0; loop < 10; loop++)
      printf("%d ", array[loop]);
      
   return 0;
}

输出结果:
1 2 3 4 5 6 7 8 9 0


39.查找数组中最大的元素值

打擂台法

#include <stdio.h>
 
int main() {
   int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int loop, largest;
 
   largest = array[0];
   
   for(loop = 1; loop < 10; loop++) {
      if( largest < array[loop] ) 
         largest = array[loop];
   }
   
   printf("最大元素为 %d", largest);   
   
   return 0;
}

输出结果:
最大元素为 9


40. 数组拆分与合并

(1)将一个数组拆分为一个为奇数数组,一个为偶数数组:

#include <stdio.h>
 
int main() {
   int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   int even[10], odd[10];
   int loop, e, d;
   
   e = d = 0;
   
   for(loop = 0; loop < 10; loop++) {
      if(array[loop]%2 == 0) {
         even[e] = array[loop];
         e++;
      }else {
         odd[d] = array[loop];
         d++;
      }
   }
      
   printf(" 原始数组 -> ");
   
   for(loop = 0; loop < 10; loop++)
      printf(" %d", array[loop]);
       
   printf("\n 偶数 -> ");
   for(loop = 0; loop < e; loop++)
      printf(" %d", even[loop]);   
 
   printf("\n 奇数 -> ");
   for(loop = 0; loop < d; loop++)
      printf(" %d", odd[loop]);   
   
   return 0;
}

输出结果:
原始数组 -> 0 1 2 3 4 5 6 7 8 9
偶数 -> 0 2 4 6 8
奇数 -> 1 3 5 7 9


(2)将奇数数组与偶数数组合并为一个数组:

#include <stdio.h>
 
int main() {
   int array[10];
   int even[5] = {0, 2, 4, 6, 8};
   int odd[5]  = {1, 3, 5, 7, 9};
   
   int loop, index, e_len, o_len;
   
   e_len = o_len = 5;
   
   index = 0;
 
   for(loop = 0; loop < e_len; loop++) {
      array[index] = even[loop];
      index++;
   }
 
   for(loop = 0; loop < o_len; loop++) {
      array[index] = odd[loop];
      index++;
   }
 
   printf("\n偶数 -> ");
   
   for(loop = 0; loop < e_len; loop++)
      printf(" %d", even[loop]);
   printf("\n奇数  -> ");
   
   for(loop = 0; loop < o_len; loop++)
      printf(" %d", odd[loop]);
 
   printf("\n合并后 -> ");
   
   for(loop = 0; loop < 10; loop++)
      printf(" %d", array[loop]);
   
   return 0;
}

输出结果:
偶数 -> 0 2 4 6 8
奇数 -> 1 3 5 7 9
合并后 -> 0 2 4 6 8 1 3 5 7 9


41.数组拷贝

思考:值传递与地址传递的区别?

#include <stdio.h>
 
int main() {
   int original[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int copied[10];
   int loop;
   
   for(loop = 0; loop < 10; loop++) {
      copied[loop] = original[loop];
   }
   printf("元素数组 -> 拷贝后的数组 \n");
   
   for(loop = 0; loop < 10; loop++) {
      printf("   %2d        %2d\n", original[loop], copied[loop]);
   }
 
   
   return 0;
}

输出结果:

元素数组 -> 拷贝后的数组 
    1         1
    2         2
    3         3
    4         4
    5         5
    6         6
    7         7
    8         8
    9         9
    0         0

思考:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int *arrayPointer = (int*)calloc(sizeof(array) / sizeof(array[0]), sizeof(int)), i;//令指针指向一块新内存区,该内存区大小刚好可以容纳旧数组所有元素
    for ( i = 0; i < sizeof(array)/sizeof(array[0]); i++)
        *arrayPointer++ = array[i];
 
    *arrayPointer = '\0';//为新数组手动添上结束标记
    arrayPointer -= sizeof(array) / sizeof(array[0]);//指针归首位
    printf("元素数组 -> 拷贝后的数组 \n");
    for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
        printf("%5d%13d\n",array[i],arrayPointer[i]);
    return 0;
}

42.计算标准偏差

#include <stdio.h>
#include <math.h>
 
float calculateSD(float data[]);
 
int main()
{
    int i;
    float data[10];
 
    printf("输入10个元素: ");
    for(i=0; i < 10; ++i)
        scanf("%f", &data[i]);
 
    printf("\n标准偏差 = %.6f", calculateSD(data));
 
    return 0;
}
 
float calculateSD(float data[])
{
    float sum = 0.0, mean, standardDeviation = 0.0;
 
    int i;
 
    for(i=0; i<10; ++i)
    {
        sum += data[i];
    }
 
    mean = sum/10;
 
    for(i=0; i<10; ++i)
        standardDeviation += pow(data[i] - mean, 2);
 
    return sqrt(standardDeviation/10);
}

输出结果:

输入10个元素: 1
2
3
4
5
6
7
8
9
10
 
标准偏差 = 2.872281

43.两个矩阵相加

(1)使用多维数组将两个矩阵相加

#include <stdio.h>
 
int main(){
    int r, c, a[100][100], b[100][100], sum[100][100], i, j;
 
    printf("输入行数 ( 1 ~ 100): ");
    scanf("%d", &r);
    printf("输入列数 ( 1 ~ 100): ");
    scanf("%d", &c);
 
    printf("\n输入第一维数组的元素:\n");
 
    for(i=0; i<r; ++i)
        for(j=0; j<c; ++j)
        {
            printf("输入元素 a%d%d: ",i+1,j+1);
            scanf("%d",&a[i][j]);
        }
 
    printf("输入第二维数组的元素:\n");
    for(i=0; i<r; ++i)
        for(j=0; j<c; ++j)
        {
            printf("输入元素 a%d%d: ",i+1, j+1);
            scanf("%d", &b[i][j]);
        }
 
    // 相加
 
    for(i=0;i<r;++i)
        for(j=0;j<c;++j)
        {
            sum[i][j]=a[i][j]+b[i][j];
        }
 
    // 显示结果
    printf("\n二维数组相加结果: \n\n");
 
    for(i=0;i<r;++i)
        for(j=0;j<c;++j)
        {
 
            printf("%d   ",sum[i][j]);
 
            if(j==c-1)
            {
                printf("\n\n");
            }
        }
    
    return 0;
}

输出结果:

输入行数 ( 1 ~ 100): 2
输入列数 ( 1 ~ 100): 3
 
输入第一维数组的元素:
输入元素 a11: 2
输入元素 a12: 3
输入元素 a13: 4
输入元素 a21: 5
输入元素 a22: 2
输入元素 a23: 3
输入第二维数组的元素:
输入元素 a11: -4
输入元素 a12: 5
输入元素 a13: 3
输入元素 a21: 5
输入元素 a22: 6
输入元素 a23: 3
 
二维数组相加结果: 
 
-2   8   7   
 
10   8   6  

(2)矩阵相乘

#include <stdio.h>
 
// 求 m*k 型矩阵 A 左乘 k*n 型矩阵 B 后的 m*n 型矩阵 C
 
int main()
{
    struct Matrixs
    {
        int elements[100][100];
        int row;
        int col;
    }matrixA, matrixB, matrixC;
 
    int m, k, n;
    printf("请输入矩阵A行数和列数:");
    scanf("%d %d", &matrixA.row, &matrixA.col);
    matrixB.row = matrixA.col;//矩阵A的列数等于矩阵B的行数
    printf("请输入矩阵B列数:");
    scanf("%d", &matrixB.col);
    printf("\n输入矩阵A:\n");
    for (m = 0; m < matrixA.row; ++m)
    for (k = 0; k < matrixA.col; ++k)
    {
        printf("请输入元素A(%d,%d):", m+1, k+1);
        scanf("%d", &matrixA.elements[m][k]);
    }
 
    printf("\n输入矩阵B:\n");
    for (k = 0; k < matrixA.col; ++k)
        for (n = 0; n < matrixB.col; ++n)
        {
            printf("请输入元素B(%d,%d):", k+1, n+1);
            scanf("%d", &matrixB.elements[k][n]);
        }
    for (m = 0; m < matrixA.row; ++m)
        for (n = 0; n < matrixB.col; ++n)
            for (k = 0; k < matrixA.col; ++k)
            {
            if (k == 0) matrixC.elements[m][n] = 0;//为新矩阵C每个元素初始化
                matrixC.elements[m][n] += matrixA.elements[m][k] * matrixB.elements[k][n];
            }
            printf("\n\n矩阵A为:\n\n");
    for (m = 0; m < matrixA.row; ++m)
    {
        printf("  |");
        for (k = 0; k < matrixA.col; ++k)
        {
            printf(" %-5d", matrixA.elements[m][k]);
        }
        printf("\b\b\b|\n");
    }
    printf("\n\n矩阵B为:\n\n");
    for (k = 0; k < matrixB.row; ++k)
    {
        printf("  |");
        for (n = 0; n < matrixB.col; ++n)
        {
            printf(" %-6d", matrixB.elements[k][n]);
        }
        printf("\b\b|\n");
    }
 
    printf("\n矩阵A左乘矩阵B为:\n\n");
    for (m = 0; m < matrixA.row; ++m)
    {
        printf("  |");
        for (n = 0; n < matrixB.col; ++n)
        {
            printf(" %-6d",matrixC.elements[m][n]);
        }
        printf("\b\b|\n");
    }
    printf("\n");
    return 0;
}

44.矩阵转置

#include <stdio.h>
 
int main()
{
    int a[10][10], transpose[10][10], r, c, i, j;
    printf("输入矩阵的行与列: ");
    scanf("%d %d", &r, &c);
 
    // 存储矩阵的元素
    printf("\n输入矩阵元素:\n");
    for(i=0; i<r; ++i)
        for(j=0; j<c; ++j)
        {
            printf("输入元素 a%d%d: ",i+1, j+1);
            scanf("%d", &a[i][j]);
        }
 
    // 显示矩阵 a[][] */
    printf("\n输入矩阵: \n");
    for(i=0; i<r; ++i)
        for(j=0; j<c; ++j)
        {
            printf("%d  ", a[i][j]);
            if (j == c-1)
                printf("\n\n");
        }
 
    // 转换
    for(i=0; i<r; ++i)
        for(j=0; j<c; ++j)
        {
            transpose[j][i] = a[i][j];
        }
 
    // 显示转换后的矩阵 a
    printf("\n转换后矩阵:\n");
    for(i=0; i<c; ++i)
        for(j=0; j<r; ++j)
        {
            printf("%d  ",transpose[i][j]);
            if(j==r-1)
                printf("\n\n");
        }
 
    return 0;
}

输出结果:

输入矩阵的行与列: 2 3
 
输入矩阵元素:
输入元素 a11: 2
输入元素 a12: 3
输入元素 a13: 4
输入元素 a21: 5
输入元素 a22: 6
输入元素 a23: 4
 
输入矩阵: 
2  3  4  
 
5  6  4  
 
 
转换后矩阵:
2  5  
 
3  6  
 
4  4  

45.删除字符串中的特殊字符

(1)删除字符串中的除字母外的字符

#include<stdio.h>
 
int main()
{
    char line[150];
    int i, j;
    printf("输入一个字符串: ");
    fgets(line, (sizeof line / sizeof line[0]), stdin);
 
    for(i = 0; line[i] != '\0'; ++i)
    {
        while (!( (line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') || line[i] == '\0') )
        {
            for(j = i; line[j] != '\0'; ++j)
            {
                line[j] = line[j+1];
            }
            line[j] = '\0';
        }
    }
    printf("输出: ");
    puts(line);
    return 0;
}

输出结果:
输入一个字符串: love666xh
输出: lovexh


(2)参考方法:

#include <stdio.h>
#include <string.h>
 
int main()
{
  char line[100];
  int i,j,len;
  printf("输入一个字符串: ");
  scanf("%s",line);
  len = strlen(line);
  for(i=0;i<len+1;i++)
  {
    if((line[i]>='a'&&line[i]<='z') || (line[i]>='A'&&line[i]<='Z'))
      continue;
    for(j=i;j<len;j++)
    {
      line[j] = line[j+1];
    }
    len--;
    i--;
  }
  //line[len]='\0';
  printf("%s\n",line);
  return 0;
}

46.连接字符串

(1)使用 strcat() 连接两个字符串

#include <stdio.h>
int main()
{
    char s1[100], s2[100], i, j;
 
    printf("输入第一个字符串: ");
    scanf("%s", s1);
 
    printf("输入第二个字符串: ");
    scanf("%s", s2);
 
    // 计算字符串 s1 长度
    for(i = 0; s1[i] != '\0'; ++i);
 
    for(j = 0; s2[j] != '\0'; ++j, ++i)
    {
        s1[i] = s2[j];
    }
 
    s1[i] = '\0';
    printf("连接后: %s", s1);
 
    return 0;
}

输出结果:
输入第一个字符串: xiao
输入第二个字符串: hang
连接后: xiaohang


(2)参考方法:

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[100], s2[100];
    
    printf("输入第一个字符串: ");
    scanf("%s", s1);
 
    printf("输入第二个字符串: ");
    scanf("%s", s2);
 
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    //printf("%d %d", len1, len2);
    for (int i = 0; i <= len2; i++)
    {
        s1[i + len1] = s2[i];
    }
 
    printf("%s\n", s1);
    // system("pause");
    return 0;
}

(3)指针方法:

#include <stdio.h>
 
int main()
{
    char str1[100], str2[100], *p = str1,n = 0;
    printf("请输入第一个字符串:");
    scanf("%s", str1);
    printf("请输入第二个字符串:");
    scanf("%s", str2);
    while (*p++ != '\0');/*移动指针到str1尾*/
    --p;//回退一个单元,以便覆盖str1末的'\0p;//回退一个单元,以便覆盖str1末的'\0'
    while (str2[n] != '\0')
    {
        *p++ = str2[n];//将str2接到str1末
        ++n;
    };
    *p = '\0';//拼接完成,手动为str1末添上结束标记
    printf("结果为:\n%s\n\n",str1);
    return 0;
}

47. 计算字符串长度

(1)使用 strlen()

#include <stdio.h>
#include <string.h>
 
int main()
{
    char s[1000];
    int len;
 
    printf("输入字符串: ");
    scanf("%s", s);
    len = strlen(s);
 
    printf("字符串长度: %d", len);
    return 0;
}

输出结果:
输入字符串: xiaohang
字符串长度: 8


(2)不使用 strlen()

#include <stdio.h>
 
int main()
{
    char s[1000], i;
 
    printf("输入字符串: ");
    scanf("%s", s);
 
    for(i = 0; s[i] != '\0'; ++i);
 
    printf("字符串长度: %d", i);
    return 0;
}

48.查找字符在字符串中出现的次数

查找字符在字符串中的起始位置(索引值从 0 开始)

#include <stdio.h>
 
int main()
{
   char str[1000], ch;
   int i, frequency = 0;
 
   printf("输入字符串: ");
   fgets(str, (sizeof str / sizeof str[0]), stdin);
 
   printf("输入要查找的字符: ");
   scanf("%c",&ch);
 
   for(i = 0; str[i] != '\0'; ++i)
   {
       if(ch == str[i])
           ++frequency;
   }
 
   printf("字符 %c 在字符串中出现的次数为 %d", ch, frequency);
 
   return 0;
}

输出结果:
输入字符串: xiaohang
输入要查找的字符: a
字符 a 在字符串中出现的次数为 2


49.字符串中各种字符计算

题目:计算字符串中的元音、辅音、数字、空白符

#include <stdio.h>
 
int main()
{
    char line[150];
    int i, vowels, consonants, digits, spaces;
 
    vowels =  consonants = digits = spaces = 0;
 
    printf("输入一个字符串: ");
    scanf("%[^\n]", line);
 
    for(i=0; line[i]!='\0'; ++i)
    {
        if(line[i]=='a' || line[i]=='e' || line[i]=='i' ||
           line[i]=='o' || line[i]=='u' || line[i]=='A' ||
           line[i]=='E' || line[i]=='I' || line[i]=='O' ||
           line[i]=='U')
        {
            ++vowels;
        }
        else if((line[i]>='a'&& line[i]<='z') || (line[i]>='A'&& line[i]<='Z'))
        {
            ++consonants;
        }
        else if(line[i]>='0' && line[i]<='9')
        {
            ++digits;
        }
        else if (line[i]==' ')
        {
            ++spaces;
        }
    }
 
    printf("元音: %d",vowels);
    printf("\n辅音: %d",consonants);
    printf("\n数字: %d",digits);
    printf("\n空白符: %d", spaces);
 
    return 0;
}

输出结果:
输入一个字符串: xiaohang
元音: 4
辅音: 4
数字: 0
空白符: 0


50.字符串复制

(1)使用 strcpy()

#include <stdio.h>
#include <string.h>
 
int main()
{
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is apple");
   strcpy(dest, src);
 
   printf("最终的目标字符串: %s\n", dest);
   
   return(0);
}

输出结果:
最终的目标字符串: This is apple


(2) 不使用 strcpy()

#include <stdio.h>
 
int main()
{
    char s1[100], s2[100], i;
 
    printf("字符串 s1: ");
    scanf("%s",s1);
 
    for(i = 0; s1[i] != '\0'; ++i)
    {
        s2[i] = s1[i];
    }
 
    s2[i] = '\0';
    printf("字符串 s2: %s", s2);
 
    return 0;
}

51.字符串排序

按字典顺序排序

#include<stdio.h>
#include <string.h>
 
int main()
{
    int i, j;
    char str[10][50], temp[50];
 
    printf("输入10个单词:\n");
 
    for(i=0; i<10; ++i) {
        scanf("%s[^\n]",str[i]);
    }
 
 
    for(i=0; i<9; ++i) {
        for(j=i+1; j<10 ; ++j)
        {
            if(strcmp(str[i], str[j])>0)
            {
                strcpy(temp, str[i]);
                strcpy(str[i], str[j]);
                strcpy(str[j], temp);
            }
        }
    }
 
    printf("\n排序后: \n");
    for(i=0; i<10; ++i)
    {
        puts(str[i]);
    }
 
    return 0;
}

输出结果:

输入10个单词:
C
C++
Java
PHP
Python
Perl
Ruby
R
JavaScript
PHP
 
排序后: 
C
C++
Java
JavaScript
PHP
PHP
Perl
Python
R
Ruby

52.使用结构体(struct)

#include <stdio.h>
struct student
{
    char name[50];
    int roll;
    float marks;
} s;
 
int main()
{
    printf("输入信息:\n");
 
    printf("名字: ");
    scanf("%s", s.name);
 
    printf("编号: ");
    scanf("%d", &s.roll);
 
    printf("成绩: ");
    scanf("%f", &s.marks);
 
 
    printf("显示信息:\n");
 
    printf("名字: ");
    puts(s.name);
 
    printf("编号: %d\n",s.roll);
 
    printf("成绩: %.1f\n", s.marks);
 
    return 0;
}

输出结果:

输入信息:
名字: 文艺倾年
编号: 1
成绩: 99
显示信息:
名字: 文艺倾年
编号: 1
成绩: 99.0

53.复数相加

**使用结构体(struct)将两个复数相加。
我们把形如 a+bi(a,b均为实数)的数称为复数,其中 a 称为实部,b 称为虚部,i 称为虚数单位。**

#include <stdio.h>
 
typedef struct complex
{
    float real;
    float imag;
} complex;
complex add(complex n1,complex n2);
 
int main()
{
    complex n1, n2, temp;
 
    printf("第一个复数 \n");
    printf("输入实部和虚部:\n");
    scanf("%f %f", &n1.real, &n1.imag);
 
    printf("\n第二个复数 \n");
    printf("输入实部和虚部:\n");
    scanf("%f %f", &n2.real, &n2.imag);
 
    temp = add(n1, n2);
    printf("Sum = %.1f + %.1fi", temp.real, temp.imag);
 
    return 0;
}
 
complex add(complex n1, complex n2)
{
      complex temp;
 
      temp.real = n1.real + n2.real;
      temp.imag = n1.imag + n2.imag;
 
      return(temp);
}

输出结果:

第一个复数 
输入实部和虚部:
2.3 4.5
 
第二个复数 
输入实部和虚部:
3.4 5
Sum = 5.7 + 9.5i

54.计算两个时间段的差值

#include <stdio.h>
 
struct TIME
{
  int seconds;
  int minutes;
  int hours;
};
void differenceBetweenTimePeriod(struct TIME t1, struct TIME t2, struct TIME *diff);
 
int main()
{
    struct TIME startTime, stopTime, diff;
 
    printf("输入开始时间: \n");
    printf("输入小时、分钟、秒:");
    scanf("%d %d %d", &startTime.hours, &startTime.minutes, &startTime.seconds);
 
    printf("输入停止时间: \n");
    printf("输入小时、分钟、秒: ");
    scanf("%d %d %d", &stopTime.hours, &stopTime.minutes, &stopTime.seconds);
 
    // 计算差值
    differenceBetweenTimePeriod(startTime, stopTime, &diff);
 
    printf("\n差值: %d:%d:%d - ", startTime.hours, startTime.minutes, startTime.seconds);
    printf("%d:%d:%d ", stopTime.hours, stopTime.minutes, stopTime.seconds);
    printf("= %d:%d:%d\n", diff.hours, diff.minutes, diff.seconds);
 
    return 0;
}
 
void differenceBetweenTimePeriod(struct TIME start, struct TIME stop, struct TIME *diff)
{
    if(stop.seconds > start.seconds){
        --start.minutes;
        start.seconds += 60;
    }
 
    diff->seconds = start.seconds - stop.seconds;
    if(stop.minutes > start.minutes){
        --start.hours;
        start.minutes += 60;
    }
 
    diff->minutes = start.minutes - stop.minutes;
    diff->hours = start.hours - stop.hours;
}

输出结果:

输入开始时间: 
输入小时、分钟、秒:12 34 55
输入停止时间: 
输入小时、分钟、秒: 8 12 5
 
差值: 12:34:55 - 8:12:5 = 4:22:50

55.学习static定义静态变量的用法

#include<stdio.h>
int main()
{
    void fun();
    for(int i=0;i<3;i++)
        fun();
    return 0;
}
void fun()
{
    int i=0;
    static int static_i=0;
    printf("i=%d\n",i);
    printf("static_i=%d\n",static_i);
    i++;
    static_i++;
}

输出结果:

i=0
static_i=0
i=0
static_i=1
i=0
static_i=2

56.学习使用auto定义变量的用法

#include <stdio.h>
int main()
{
    int i,num;
    num=2;
    for(i=0;i<3;i++)
    {
        printf("num 变量为 %d \n",num);
        num++;
        {
            auto int num=1;
            printf("内置模块 num 变量为 %d \n",num);
            num++;
        }
    }
    return 0;
}

输出结果:

num 变量为 2
内置模块 num 变量为 1
num 变量为 3
内置模块 num 变量为 1
num 变量为 4
内置模块 num 变量为 1

57.学习使用static的另一用法

#include <stdio.h>
int main()
{
    int i,num;
    num=2;
    for(i=0;i<3;i++)
    {
        printf("num 变量为 %d \n",num);
        num++;
        {
            static int num=1;
            printf("内置模块 num 变量为 %d\n",num);
            num++;
        }
    }
    return 0;
}

输出结果:

num 变量为 2
内置模块 num 变量为 1
num 变量为 3
内置模块 num 变量为 2
num 变量为 4
内置模块 num 变量为 3

58.学习使用external的用法

#include <stdio.h>
int a,b,c;
void add()
{
    int a;
    a=3;
    c=a+b;
}
int main()
{
    a=b=4;
    add();
    printf("c 的值为 %d\n",c);
    return 0;
}

输出结果:

c 的值为 7

59.学习使用register定义变量的方法

#include <stdio.h>
int main()
{
    register int i;
    int tmp=0;
    for(i=1;i<=100;i++)
        tmp+=i;
    printf("总和为 %d\n",tmp);
    return 0;
}

输出结果:

总和为 5050

60.宏#define命令练习

#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
int main()
{
    int num;
    int again=1;
    printf("如果值小于 50 程序将终止。\n");
    while(again)
    {
        printf("\n请输入数字:");
        scanf("%d",&num);
        printf("该数字的平方为 %d \n",SQ(num));
        if(num>=50)
            again=TRUE;
        else
            again=FALSE;
    }
    return 0;
}

输出结果:

如果值小于 50 程序将终止。
请输入数字:100
该数字的平方为 10000
请输入数字:5
该数字的平方为 25

61.宏#define命令练习2

#include<stdio.h>
#define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里
int main()
{
    int x=10;
    int y=20;
    printf("x=%d; y=%d\n",x,y);
    exchange(x,y);
    printf("x=%d; y=%d\n",x,y);
    return 0;
}

输出结果:

x=10; y=20
x=20; y=10

62.宏#define命令练习3

#define LAG >
#define SMA <
#define EQ ==
#include <stdio.h>
int main()
{
    int i,j;
    printf("请输入两个数字:\n");
    scanf("%d %d",&i,&j);
    if(i LAG j)
        printf("%d 大于 %d \n",i,j);
    else if(i EQ j)
        printf("%d 等于 %d \n",i,j);
    else if(i SMA j)
        printf("%d 小于 %d \n",i,j);
    else
        printf("没有值。\n");
    return 0;
}

输出结果:

请输入两个数字:
1 2
1 小于 2

63.学习使用按位与 &

程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 (全真才真)
#include <stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a&3;
    printf("a & b(decimal) 为 %d \n",b);
    b&=7;
    printf("a & b(decimal) 为 %d \n",b);
    return 0;
}

输出结果:

a & b(decimal) 为 3
a & b(decimal) 为 3

64.学习使用按位或 |

程序分析:0|0=0; 0|1=1; 1|0=1; 1|1=1 (有真则真)
#include<stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a|3;
    printf("b 的值为 %d \n",b);
    b|=7;
    printf("b 的值为 %d \n",b);
    return 0;
}

输出结果:

b 的值为 63
b 的值为 63

65.学习使用按位异或 ^

程序分析:0^0=0; 0^1=1; 1^0=1; 1^1=0 (不同为真)
#include <stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a^3;
    printf("b 的值为 %d \n",b);
    b^=7;
    printf("b 的值为 %d \n",b);
    return 0;
}

输出结果:

b 的值为 60
b 的值为 59

66.学习使用按位取反~

程序分析:~0=1; ~1=0;
#include <stdio.h>
int main()
{
    int a,b;
    a=234;
    b=~a;
    printf("a 的按位取反值为(十进制) %d \n",b);
    a=~a;
    printf("a 的按位取反值为(十六进制) %x \n",a);
    return 0;
}

输出结果:

请输入整数:
a 的按位取反值为(十进制) -235
a 的按位取反值为(十六进制) ffffff15

相关文章
|
6月前
|
C语言
【C语言必刷题】4. 打印100~200之间的素数
【C语言必刷题】4. 打印100~200之间的素数
|
6月前
|
C语言
【C语言必刷题】6. 水仙花数
【C语言必刷题】6. 水仙花数
|
6月前
|
C语言
【C语言必刷题】7. 百钱百鸡
【C语言必刷题】7. 百钱百鸡
|
6月前
|
C语言
【C语言必刷题】5.判断闰年
【C语言必刷题】5.判断闰年
|
6月前
|
算法 C语言
【C语言必刷题】3.二分查找
【C语言必刷题】3.二分查找
|
6月前
|
C语言
【C语言必刷题】2. 9*9乘法表
【C语言必刷题】2. 9*9乘法表
|
6月前
|
C语言
【C语言必刷题】1.打印1~100之间的奇数
【C语言必刷题】1.打印1~100之间的奇数
|
C语言
C语言之——入门必刷题(3)
C语言之——入门必刷题(3)
91 1
|
C语言
C语言之——入门必刷题(2)(下)
C语言之——入门必刷题(2)
313 0
|
C语言
C语言之——入门必刷题(2)(上)
C语言之——入门必刷题(2)
104 0