C语言面试题(控制结构)

1、什么是控制结构?在C语言中有哪几种控制结构?

答:控制结构是指用来控制程序执行流程的语句;在C语言中有三种控制结构:顺序结构、选择结构和循环结构。

2、if-else语句的一般形式是什么?如何使用if-else语句实现多分支选择?

答:if-else语句的一般形式是:

if (条件表达式)
    语句1;
else
    语句2;

如果条件表达式为真,执行语句1;否则执行语句2。

可以使用多个if-else语句嵌套实现多分支选择,例如:

if (条件表达式1)
    语句1;
else if (条件表达式2)
    语句2;
else if (条件表达式3)
    语句3;
...
else
    语句n;

3、switch-case语句的一般形式是什么?switch-case语句与if-else语句有什么区别和联系?

答:switch-case语句的一般形式是:

switch (整型表达式)
{
case 常量1:
    语句1;
    break;
case 常量2:
    语句2;
    break;
...
case 常量n:
    语句n;
    break;
default:
    语句d;
}

根据整型表达式的值,匹配相应的常量,执行对应的分支,并跳出switch-case结构。如果没有匹配到任何常量,执行default分支(如果有)。switch-case与if-else的区别和联系如下:

A、switch-case只能用于整型表达式,而if-else可以用于任何类型的表达式。

B、switch-case只能进行相等性判断,而if-else可以进行任何关系判断。

C、switch-case更适合处理多个离散值的情况,而if-else更适合处理连续区间或复杂逻辑的情况。

D、switch-case可以通过break和default来控制分支跳转和缺省处理,而if-else需要通过嵌套和布尔运算符来实现类似功能。

4、什么是循环结构?在C语言中有哪几种循环结构?

答:循环结构是指重复执行一段代码直到满足某个条件为止;在C语言中有三种循环结构:while循环、do-while循环和for循环。

5、while循环的一般形式是什么?while循环的执行过程是怎样的?

答:while循环的一般形式是:

while (条件表达式)
{
    循环体; // 可以包含多条或零条语句
}

while循环的执行过程是:先判断条件表达式是否为真,如果为真,则执行循环体,并返回判断条件表达式;如果为假,则跳出循环。

6、do-while循环的一般形式是什么?do-while循环与while循环有什么区别和联系?

答:do-while循环的一般形式是:

do
{
    循环体; // 可以包含多条或零条语句
} while (条件表达式);

do-while循环与while循环的区别和联系如下:

A、do-while循环先执行一次循环体,再判断条件表达式是否为真;而while循环先判断条件表达式是否为真,再决定是否执行循环体。

B、do-while循环至少会执行一次循环体;而while循环可能一次都不会执行(当第一次就判断为假时)。

7、for循环的一般形式是什么?for循环的执行过程是怎样的?

答:for循环的一般形式是:

for (初始化; 条件; 更新)
{
   循环体; // 可以包含多条或零条语句 
}

for循环的执行过程是:先执行初始化语句,然后判断条件表达式是否为真,如果为真,则执行循环体,并执行更新语句,再返回判断条件表达式;如果为假,则跳出循环。

8、如何使用break和continue语句控制循环的流程?

答:break和continue语句可以用来控制循环的流程,具体如下:

A、break语句可以用来强制结束当前循环,跳出循环结构。

B、continue语句可以用来跳过当前循环的剩余部分,直接进入下一次循环。

9、以下代码段会输出什么结果?

int a = 10;
switch (a)
{
case 10:
    printf("A");
case 11:
    printf("B");
    break;
case 12:
    printf("C");
default:
    printf("D");
}

答:以上代码段会输出ABD;因为switch-case结构中没有break语句,所以匹配到case 10后会继续执行后面的分支,直到遇到break或者结束为止。

10、以下代码段会输出什么结果?

int i = 1;
do
{
    i++;
    if (i % 2 == 0)
        continue;
    printf("%d ", i);
} while (i < 10);

答:以下代码段会输出3 5 7 9;因为do-while循环中有continue语句,所以当i为偶数时会跳过printf语句,只有当i为奇数时才会输出i的值。

11、如何使用嵌套if-else语句实现以下功能:输入一个成绩,如果大于等于90分,输出“A”;如果大于等于80分且小于90分,输出“B”;如果大于等于60分且小于80分,输出“C”;如果小于60分,输出“D”。

答:使用嵌套if-else语句实现以下功能的一种可能的代码如下:

#include <stdio.h>
int main()
{
    int score;
    printf("请输入一个成绩:");
    scanf("%d", &score);
    if (score >= 90)
        printf("A\n");
    else if (score >= 80)
        printf("B\n");
    else if (score >= 60)
        printf("C\n");
    else 
        printf("D\n");
    return 0;
}

12、如何使用嵌套switch-case语句实现以下功能:输入两个整数a和b以及一个运算符op(+、-、*、/),根据运算符计算a和b的结果并输出。

答:使用嵌套switch-case语句实现代码如下:

#include <stdio.h>
int main()
{
    int a, b, result;
    char op;
    printf("请输入两个整数和一个运算符(+、-、*、/):");
    scanf("%d%d %c", &a, &b, &op);
    switch (op)
    {
        case '+':
            result = a + b;
            break;
        case '-':
            result = a - b;
            break;
        case '*':
            result = a * b;
            break;
        case '/':
            switch (b)
            {
                case 0:
                    printf("除数不能为0!\n");
                    return -1; // 异常退出
                default:
                    result = a / b; // 整除
                    break; 
            }
            break;
        default:
            printf("无效的运算符!\n");
            return -1; // 异常退出
    }
    printf("%d %c %d = %d\n", a, op, b, result);
    return 0;
}

13、如何使用嵌套for循环打印以下图形?

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

答:使用嵌套for循环打印图形代码如下:

#include <stdio.h>
int main()
{
   for (int i = 1; i <= 5; i++) // 外层控制行数
   {
       for (int j = 1; j <= i; j++) // 内层控制每行打印多少个*
       {
           printf("*"); 
       }
       printf("\n"); // 换行
   }
   return 0;
}

14、如何使用嵌套while循环打印以下图形?

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

答:使用嵌套while循环打印以图形代码如下:

#include <stdio.h>
int main()
{
   int i = 5; // 外层控制行数
   while (i > 0) 
   {
       int j = i; // 内层控制每行打印多少个*
       while (j > 0) 
       {
           printf("*"); 
           j--;
       }
       printf("\n"); // 换行
       i--;
   }
   return 0;
}

15、如何使用嵌套do-while循环打印以下图形?

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

答:使用嵌套do-while循环打印图形代码如下:

#include <stdio.h>
int main()
{
   int i = 1; // 外层控制行数
   int flag = 1; // 标志变量,用来判断是增加还是减少*
   do 
   {
       int j = 5 - i; // 内层控制每行打印多少个空格
       do 
       {
           printf(" "); 
           j--;
       } while (j > 0);
       
       j = 2 * i - 1; // 内层控制每行打印多少个*
       do 
       {
           printf("*"); 
           j--;
       } while (j > 0);
       
       printf("\n"); // 换行
       
       if (i == 4) // 当i达到4时,改变标志变量的值,使得i开始减少
           flag = -1;
           
       i += flag; // 根据标志变量更新i的值
       
   } while (i > 0); // 当i为0时,结束循环
   
   return 0;
}

16、写一个程序,输入一个正整数n,判断n是否为素数(只能被1和自身整除的数)。

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    printf("请输入一个正整数:");
    scanf("%d", &n); // 输入n的值
    int flag = 1; // 标志变量,用来表示n是否为素数,初始为1
    if (n == 1) // 如果n为1,特殊处理
        flag = 0;
    else
    {
        for (int i = 2; i <= sqrt(n); i++) // 循环从2到sqrt(n),检查是否有因子
        {
            if (n % i == 0) // 如果有因子,说明不是素数,改变标志变量并跳出循环
            {
                flag = 0;
                break;
            }
        }
    }
    if (flag == 1) // 根据标志变量输出结果
        printf("%d是素数\n", n);
    else
        printf("%d不是素数\n", n);
    return 0;
}

17、写一个程序,输入一个正整数n,输出斐波那契数列(每项为前两项之和)的前n项。

代码如下:

#include <stdio.h>
int main()
{
   int n; 
   printf("请输入一个正整数:");
   scanf("%d", &n); // 输入n的值
   int a = 1; // 存储第一项
   int b = 1; // 存储第二项
   int c; // 存储第三项及以后的项
   for (int i = 1; i <= n; i++) // 循环输出前n项
   {
       if (i == 1 || i == 2) // 如果是第一或第二项,直接输出a或b的值
           printf("%d ", a);
       else 
       {
           c = a + b; // 计算第三及以后的项为前两项之和
           printf("%d ", c); 
           a = b; // 更新a和b的值,使得它们分别指向前两项
           b = c;
       }
   }
   printf("\n"); // 换行
   return 0;
}

18、写一个程序,输入两个正整数m和n(m < n),求出m到n之间所有素数之和。

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int m, n;
    printf("请输入两个正整数(用空格隔开):");
    scanf("%d %d", &m, &n); // 输入m和n的值
    int sum = 0; // 存储素数之和,初始为0
    for (int i = m; i <= n; i++) // 循环从m到n,检查每个数是否为素数
    {
        int flag = 1; // 标志变量,用来表示i是否为素数,初始为1
        if (i == 1) // 如果i为1,特殊处理
            flag = 0;
        else
        {
            for (int j = 2; j <= sqrt(i); j++) // 循环从2到sqrt(i),检查是否有因子
            {
                if (i % j == 0) // 如果有因子,说明不是素数,改变标志变量并跳出循环
                {
                    flag = 0;
                    break;
                }
            }
        }
        if (flag == 1) // 如果i是素数,累加到sum中
            sum += i;
    }
    printf("%d到%d之间所有素数之和为%d\n", m, n, sum); // 输出结果
    return 0;
}

19、写一个程序,输入三个整数a、b、c,按照从小到大的顺序输出它们。

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
    // 输入三个整数a、b、c
    int a, b, c;
    printf("请输入第一个整数: ");
    scanf("%d", &a);
    printf("请输入第二个整数: ");
    scanf("%d", &b);
    printf("请输入第三个整数: ");
    scanf("%d", &c);

    // 比较a和b,如果a大于b,则交换它们的值
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }

    // 比较b和c,如果b大于c,则交换它们的值
    if (b > c) {
        int temp = b;
        b = c;
        c = temp;
    }

    // 再次比较a和b,如果a大于b,则交换它们的值
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }

    // 输出结果
    printf("从小到大的顺序是: %d %d %d\n", a, b, c);
    return 0;
}

20、写一个程序,输入一个字符串s(不含空格),判断s是否为回文串(正反读都相同)。

代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
    // 输入一个字符串s(不含空格)
    char s[100];
    printf("请输入一个字符串: ");
    scanf("%s", s);

    // 获取字符串的长度
    int len = strlen(s);

    // 定义一个标志变量,初始为1
    int flag = 1;

    // 遍历字符串的前半部分,与后半部分对应的字符比较
    for (int i = 0; i < len / 2; i++) {
        // 如果发现不相等的字符,将标志变量设为0,并跳出循环
        if (s[i] != s[len - 1 - i]) {
            flag = 0;
            break;
        }
    }

    // 根据标志变量输出结果
    if (flag == 1) {
        printf("这是一个回文串\n");
    } else {
        printf("这不是一个回文串\n");
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值