跳至主要內容

02-条件与循环控制

AI悦创原创C教程C教程大约 21 分钟...约 6396 字

1. if 条件判断

条件表达式是用来执行不同的计算,key 根据条件的结果是真还是假走不通的执行逻辑。

1.1 if 语句

if 语句称为条件控制结构,因为它在一个表达式为真时执行语句。由于这个原因,if 也称为决策结构。它的形式为:

if (expression) {
    // code to be executed if the condition is true
    statements
}

表达式 expression,执行语句 statements 可以是单个语句或由大括号 { } 包围的代码块。

例如:

demo1
#include <stdio.h>

int main() {
    int score = 89;

    if (score > 75)
        printf("You passed.\n");
    
    return 0;
}

在上面的代码中,我们检查变量 score 是否大于 75,如果条件为真,则打印一条信息。

填空,如果变量 a 大于 b 则打印 "hello":

int a = 13;
int b = 12;
___(a >___) {
    printf("hello");
}

获取用户输入,判断用户输入的是奇数还是偶数。

1.2 关系运算符

有 6 个关系运算符可以用来形成一个条件表达式(也称为布尔表达式),它返回

  1. <: 小于
  2. <=: 小于或等于
  3. >: 大于
  4. >=: 大于或等于
  5. ==: 等于
  6. !=: 不等于

例如:

#include <stdio.h>

int main() {
    int num = 41;
    num += 1;
    // 判断num 是否等于42
    if (num == 42) {
        printf("You won!");
    }
}

结果为非零值的表达式被认为是真的。

例如:

#include <stdio.h>

int main() {
    int in_stock = 20;
    if (in_stock)
        // in_stock 非0,所以为真
        printf("Order received.\n"); 
}

下面哪些是用于判断相等的关系运算符?

A. !=

B. *

C. +=

D. ==

1.3 if-else 语句

如果你想在条件为真时执行一个代码块,而在条件为假时执行另一个代码块,你可以使用 if-else

if 语句可以包括一个可选的 else 子句,当表达式为假时执行 else 语句。

语法:

if (condition) {
    // code to be executed if the condition is true
} else {
    // code to be executed if the condition is false
}

例如,下面的程序先评估表达式,然后执行 else 子句:

demo1
#include <stdio.h>

int main() {
    int score = 89;
  
    if (score >= 90)
        printf("Top 10%%.\n");
    else
        printf("Less than 90.\n");
    
    return 0;
}

填空,如果变量people 大于10,则打印"More than 10",否则打印"Less than 10":

int people = 12;
___(people ___ 10)
printf("More than 10.\n");
___
printf("Less than 10.\n");

1.4 if-else if-else 语句

当你有多个条件要检查时,可以使用 if-else if-else

当需要在三个或更多条件中做出决定时,可以使用 if-else if 语句。

语法
if (condition1) {
    // code to be executed if condition1 is true
} else if (condition2) {
    // code to be executed if condition2 is true
} else {
    // code to be executed if neither condition is true
}

在编写一个 if-else if 语句时,要仔细考虑其中的逻辑。程序逐个检测每个分支,并执行第一个表达式为真的语句,其余的表达式都不会被测试。

尽管缩进不会影响编译后的代码,但当 else 语句对齐时,if-else if 的逻辑更易阅读理解。

注意

在可能的情况下,if-else if 语句比嵌套的 if 语句要好,这样更加清晰易懂。

填空,如果数字 num 为正数,则打印"positive";如果 num 是负数,则打印 "negative";否则就打印 "zero"。

int num = -14;
if (num > 0)
    printf("positive");
else ___(num < 0)
    printf("negative");
___
    printf("zero");

1.5 嵌套的 if 语句

你可以在另一个 if 语句内部使用 if 语句。

一个 if 语句可以包括另一个 if 语句,形成一个嵌套的条件语句。嵌套的 if 可以形成复杂的条件判断。

语法
if (condition1) {
    // code
    if (condition2) {
        // code
    }
}

适当地缩进嵌套语句将有助于向读者阐明其含义。然而,一定要明白,除非用大括号 { } 来改变关联,否则 else 语句是与最接近的 if 相关的。

if (profit > 1000) {
  if (clients > 15)
    bonus = 100;
}
else
  bonus = 25;

补全嵌套if语句中缺失的部分,并打印相应的信息。

int x = 37;
if (x > 22) {
    ___ (x > 31) {
        ___ ("x is greater than 22 and 31");
    }
}

1.6 条件表达式「三元操作符」

除了 if-else,C 语言还提供了一个有用的条件操作符,有时也被称为三元操作符。

另一种类似 if-else 语句的语法是在条件表达式中使用 ?: 操作符。

?: 是 C 语言中的三目运算符,可以用来替代 if—else 语句。

?: 的使用方法为:

<表达式1>?<表达式2>:<表达式3>
condition ? value_if_true : value_if_false;

它是对第一个表达式作真/假检测,然后根据结果返回另外两个表达式中的一个。在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式 2 的值;如果为假,则返回表达式 3 的值。

demo1
#include <stdio.h>

int main() {
  int y;
  int x = 3;

  y = (x >= 5) ?  5 : x;

/* 这等价于
  if (x >= 5)
    y = 5;
  else
    y = x;
*/

  return 0;
}

填空,使用 ?: 运算符,如果 x 大于或等于 5,将 8 赋值给 y; 如果 x 小于5,将 x 的值赋值给 y

int x = 12;
int y = (x >= 5) ___ 8 ___ x;

1.7 小试牛刀

1.7.1 Question 1 找出最大值

获取用户输入三个值,并赋值给三个变量,找出三个变量中的最大值并输出。

Answer
#include <stdio.h>

int main() {
    int a, b, c, max;

    // 获取用户输入
    printf("Enter three integers separated by spaces: ");
    scanf("%d %d %d", &a, &b, &c);

    // 初始假设a是最大的
    max = a;

    // 检查b是否比当前的max大
    if (b > max) {
        max = b;
    }

    // 检查c是否比当前的max大
    if (c > max) {
        max = c;
    }

    // 输出最大值
    printf("The largest number is: %d\n", max);

    return 0;
}

1.7.2 Question 2 连续整数序列判断

描述:给定三个整数,编写一个程序来检查它们是否形成一个连续的整数序列。

示例输入:

3 2 4

示例输出

Yes
Answer
#include <stdio.h>

int main() {
    int a, b, c;

    printf("请输入三个数字: ");
    scanf("%d %d %d", &a, &b, &c);

    // 对数字进行排序,使得后续的检查更加简单。
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }
    if (b > c) {
        int temp = b;
        b = c;
        c = temp;
    }
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }

    // 排序后,如果数字是连续的,那么 b 应该是 a + 1,c 应该是 b + 1
    if (b == a + 1 && c == b + 1) {
        printf("是\n");
    } else {
        printf("否\n");
    }

    return 0;
}

1.7.3 Question 3 奇偶性和正负性组合判断

描述:输入两个整数,编写一个程序来判断它们的奇偶性和正负性,并输出以下其中一个结果:

  • Both numbers are positive and even.
  • Both numbers are positive and odd.
  • Both numbers are negative and even.
  • Both numbers are negative and odd.
  • One number is positive and even, while the other is positive and odd.
    ...(其他组合)

示例输入

4 -3

示例输出

One number is positive and even, while the other is negative and odd.
Answer
#include <stdio.h>

int main() {
    int x, y;

    printf("请输入两个数字: ");
    scanf("%d %d", &x, &y);

    // 检查数字的正负性以及奇偶性
    if (x > 0 && y > 0) {
        if (x % 2 == 0 && y % 2 == 0) {
            printf("两个数字都是正的并且是偶数。\n");
        } else if (x % 2 != 0 && y % 2 != 0) {
            printf("两个数字都是正的并且是奇数。\n");
        } else {
            printf("一个数字是正的偶数,另一个是正的奇数。\n");
        }
    } else if (x < 0 && y < 0) {
        if (x % 2 == 0 && y % 2 == 0) {
            printf("两个数字都是负的并且是偶数。\n");
        } else if (x % 2 != 0 && y % 2 != 0) {
            printf("两个数字都是负的并且是奇数。\n");
        } else {
            printf("一个数字是负的偶数,另一个是负的奇数。\n");
        }
    } else {
        if ((x > 0 && x % 2 == 0) || (y > 0 && y % 2 == 0)) {
            printf("一个数字是正的偶数,另一个是负数。\n");
        } else {
            printf("一个数字是正的奇数,另一个是负数。\n");
        }
    }

    return 0;
}

1.7.4 Question 4 日期有效性检查

描述:输入一个日期(由日、月和年组成),检查其是否是有效的。考虑平年和闰年。请注意,你只需要使用 if 语句,并且不需要使用其他知识点。

示例输入

29 2 2023

示例输出

Invalid date
Answer
#include <stdio.h>

int main() {
    int day, month, year;

    printf("请输入一个日期 (日 月 年): ");
    scanf("%d %d %d", &day, &month, &year);

    int max_day = 31; // 假设默认每个月都有31天

    if (month == 2) {
        // 检查是否为闰年
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            max_day = 29; // 闰年的2月有29天
        } else {
            max_day = 28; // 非闰年的2月有28天
        }
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        max_day = 30; // 有些月份只有30天
    }

    // 判断日期的有效性
    if (day < 1 || day > max_day || month < 1 || month > 12) {
        printf("日期无效\n");
    } else {
        printf("日期有效\n");
    }

    return 0;
}

2. switch 开关语句

2.1 switch语句

开关 switch 语句通过将表达式的结果与常量值进行比较来实现程序控制。

switch 语句通常为 if-else if嵌套 if 语句提供了一个更优雅的解决方案。

基本的 switch 语法为:

switch (expression) {
    case val1:
        statements
        break;
    case val2:
        statements
        break;
    default:
        statements
}

例如,以下程序输出 "Three":

#include <stdio.h>

int main() {
    int num = 3;

    switch (num) {
        case 1:
            printf("One\n");
            break; 
        case 2:
            printf("Two\n");
            break; 
        case 3:
            printf("Three\n");
            break; 
        default:
            printf("Not 1, 2, or 3.\n");
    }
}

注意

为什么需要 break?——如果没有 break,则会在匹配之后执行后续的代码。代码示例如下:

#include <stdio.h>

int main() {
    int num = 3;

    switch (num) {
        case 1:
            printf("One\n");
            break;
        case 3:
            printf("Two\n");
//            break;
        case 22:
            printf("Three\n");
            break;
        default:
            printf("Not 1, 2, or 3.\n");
    }
}

// --- output ---
Two
Three











 











哪个选项是 switch 开关语句的正确语法?

A. switch test;

B. SWITCH test { }

C. switch (test) { }

switch 可以有多个 case

可选的默认 default 在没有其他匹配的情况下被执行。

每个 case 中都需要一个 break 语句,从而执行后跳出 switch 语句。

如果没有 break 语句,程序的执行就会落到下一个 case 语句上。当多个 case 会执行相同逻辑,这一点很有用。考虑下面的 switch 语句:

#include <stdio.h>

int main() {
    int num = 3;

    switch (num) {
        case 1:
        case 2:
        case 3:
            printf("One, Two, or Three.\n");
            break;   
        case 4:
        case 5:
        case 6:
            printf("Four, Five, or Six.\n");
            break;
        default:
            printf("Greater than Six.\n");
    }  
}

以这种方式构建 switch 语句时,必须谨慎行事。之后的修改可能会导致意外的结果。

填空,测试变量 num 的值为3542时,打印不同的文本。

___ (num) {
case 3:
    printf("a prime number");
    break;
___ 5: 
    printf("another prime number");
    ___;
case 42:
    printf("the meaning of life");
    break;
}

3. 逻辑运算符

在 C 语言中,逻辑运算符用于比较两个或多个表达式,它们包括:

  • &&:逻辑与(AND)
  • ||:逻辑或(OR)
  • !:逻辑非(NOT)

逻辑运算符 &&|| 用于形成一个复合布尔表达式,测试多个组合条件。第三个逻辑运算符是 !,用于反转布尔表达式的结果。

3.1 逻辑与 (&&)

此运算符用于验证两个表达式是否都为真。如果都为真,则整个表达式的结果为真。如果其中一个或两者都为假,则整个表达式的结果为假。

逻辑与运算符&&只有在两个表达式都为真时才会返回一个真结果。

例如:

demo1
#include <stdio.h>

int main() {
    int n = 42;

    if (n > 0 && n <= 100)
        printf("Range (1 - 100).\n");
}

上面的语句只组合了两个表达式,但逻辑运算符可以用来连接多个表达式。

一个复合布尔表达式从左到右进行评估。当不需要进一步测试来确定结果时,评估就会停止,所以当一个结果影响到后面的结果时,一定要考虑表达式的顺序。

填空,如果n 大于等于0且小于100,则打印"Yes"。

int n = 42;
___(n >= 0 ___ n < 100) {
    printf("Yes");
}

3.2 逻辑或 (||)

此运算符用于验证两个表达式中是否至少有一个为真。如果其中一个为真或两者都为真,则整个表达式的结果为真。如果两者都为假,则整个表达式的结果为假。

当任何一个表达式或两个表达式都为真时,逻辑或运算符||会返回一个真结果。

例如:

demo1
#include <stdio.h>

int main() {
    char n = 'X';

    if (n == 'x' || n == 'X')
        printf("Roman numeral value 10.\n");
}

任何数量的表达式都可以用 &&|| 连接。 例如:

#include <stdio.h>

int main() {
    int n = 42;
    
    if (n == 999 || (n > 0 && n <= 100))
        printf("Input valid.\n");
}

注意

为了清楚起见,使用了括号 () 类似算术表达式,将 n > 0 && n <= 100 标记为一个整体。() 可以改变运算的优先级。

填空,如果字符n等于'x'或'X' 则打印"Roman"。

if (n == 'x' ___ n == 'X') {
    printf("Roman");
}

3.3 逻辑非 (!)

此运算符用于反转表达式的逻辑值。如果表达式为真,则它会返回假,反之亦然。

逻辑非运算符 ! 对结果进行取反。 NOT true 返回 false,而 NOT false 返回 true

例如:

demo1
#include <stdio.h>

int main() {
    char n = 'V';
    
    if (!(n == 'x' || n == 'X'))
        printf("Roman numeral is not 10.\n");
}

注意

在 C 语言中,任何非零值都被认为是0。 因此,逻辑非运算符将真值转换为 0,假值转换为 1

下面代码的输出结果是?

int x = 3;
if(!(x > 2 || y < 0)) {
    printf("true");
} else {
    printf("false");
}

3.4 小示例

为了更好地理解这些逻辑运算符,让我们考虑一个简单的示例:一个程序,当温度在某个范围内并且天气为晴时,建议用户外出散步。

#include <stdio.h>

int main() {
    int temperature = 24;        // 假设温度是24°C
    int isSunny = 1;             // 假设天气是晴朗的(1表示真,0表示假)

    if (temperature >= 20 && temperature <= 30 && isSunny) {
        printf("天气很好,建议您外出散步!\n");
    } else {
        printf("或许您应该留在室内。\n");
    }

    return 0;
}

4. while 循环语句

while 语称为循环结构,因为它在一个表达式为真时重复执行语句,不断循环。它的语法为:

while (表达式) {
    循环体语句
}

表达式评估为,执行体代码可以是单一语句,或者由大括号 { } 括起来的代码块。 例如:

#include <stdio.h>

int main() {
    int count = 1;
  
    while (count < 8) {
        printf("Count = %d\n", count);
        count++;
    }
    
    return 0;
}

上面的代码将输出 count 变量 7 次。

while 循环在每次进入循环之前都要评估条件,所以 while 语句有可能永远不执行,也可能永远执行(死循环)。

注意

一个死循环是一个无限地继续下去的循环,因为循环条件从未评估为假。这可能导致运行时错误。

Test one:

  • 1~100 以内的奇数和;
  • 1~100 以内的偶数和;
答案
for-loop
#include <stdio.h>

int main() {
    int oddSum = 0;  // 奇数和
    int evenSum = 0; // 偶数和

    for (int i = 1; i <= 100; i++) {
        if (i % 2 == 0) {
            evenSum += i;  // 如果是偶数,加到偶数和上
        } else {
            oddSum += i;   // 如果是奇数,加到奇数和上
        }
    }

    printf("1~100之间的奇数和为: %d\n", oddSum);
    printf("1~100之间的偶数和为: %d\n", evenSum);

    return 0;
}

填空,循环打印"hello" 5次:

int n = 0;
___ (n < 5) {
    printf("hello\n");
    ___ ++;
}

5. do-while 循环语句

do-while 进入循环时不做检查,先在循环中执行一次之后再来检查循环的条件是否满足,若满足则进行下一次的循环,否则退出循环。

它的语法为:

do {
    statements
} while (expression);

表达式评估为真或假,语句可以是单个语句或由大括号 { } 包围的代码块。 例如:

#include <stdio.h>

int main() {
    int count = 1;
  
    do {
        printf("Count = %d\n", count);
        count++;
    } while (count < 8);
    
    return 0;
} 

注意 while 语句后面的分号 ;do-while 循环总是至少执行一次,即使表达式的评估结果为假。

注意

do-whilewhile 的区别:

两者循环有类似的地方,区别在于进行检查循环条件的位置不同,do-while 无论条件是否满足都会先执行一次再进行判断,而 while 是先进行条件判断,再进行循环

下面代码,会打印多少次 count 变量?

int count = 1;
do {
    printf("%d\n", count);
    count++;
} while (count < 8);

A. 8

B. 7

C. 9

6. do...while 和 while 的抉择

在 C 语言中,whiledo-while 循环是常用的控制结构,它们之间的主要区别是判断条件的位置和执行顺序。根据实际需要选择合适的循环结构是很重要的。

  1. while 循环:首先判断条件,如果条件满足,则执行循环体,否则退出循环。
while (条件) {
    // 循环体
}
  1. do-while 循环:首先执行一次循环体,然后判断条件,如果条件满足,再次执行循环体,否则退出循环。
do {
    // 循环体
} while (条件);

选择依据

  1. 当你需要确保循环体至少执行一次时,应该选择 do-while 循环。
  2. 当你希望在进入循环之前先判断条件是否满足时,应该选择 while 循环。

举例

  1. 例子1:从用户输入中读取数字,直到用户输入一个正数。

使用 do-while 循环是更好的选择,因为我们至少希望用户输入一次。

#include <stdio.h>

int main() {
    int num;
    do {
        printf("请输入一个正数:");
        scanf("%d", &num);
    } while (num <= 0);

    printf("你输入的正数是:%d\n", num);
    return 0;
}
  1. 例子2:打印小于 5 的所有正整数。

在这里,使用 while 循环更为适合,因为我们需要先检查数字是否小于5。

#include <stdio.h>

int main() {
    int i = 1;
    while (i < 5) {
        printf("%d\n", i);
        i++;
    }
    return 0;
}

总之,选择 while 还是 do-while 主要基于实际需求。希望你能根据上面的例子明白它们的区别和使用场景。

7. break 和 continue语句

switch 语句中已经看到了 break 的用法。它对于立即退出一个循环也很有用。

例如,下面的程序使用 break 来退出一个 while 循环。

#include <stdio.h>

int main() {
    int num = 5;
  
    while (num > 0) {
        if (num == 3) {
            break;
        }
        printf("%d\n", num);
        num--;
    } 
    
    return 0;
} 

这个程序打印:

5
4

然后退出循环。

当你想保留在循环中,但跳到下一个迭代时,你可以使用 continue 语句。 例如:

#include <stdio.h>

int main() {
    int num = 5;
  
    while (num > 0) {
      num--;
      if (num == 3) {
        continue;
      }
      
      printf("%d\n", num);
    } 
}

程序输出:

4
2
1
0

你可以看到,数值 3 被跳过。

在上面的代码中,如果 numcontinue 语句之后才递减,就会产生一个无限的循环。

注意

尽管 breakcontinue 声明很方便,但也很容易导致程序执行的逻辑有问题。

填空,当num变为2时,退出循环:

int num = 5;
  
while (num > 0) {
    ___ (num == ___ )
        ___;
    printf("%d\n", num);
    num--;
}

8. break 与 continue 的抉择

在 C 语言中,breakcontinue 都是循环控制语句,但它们的用途和效果是不同的。

  1. break 语句:用于立即退出循环,跳过循环后的其余部分,并执行循环后的下一个语句。

  2. continue 语句:用于立即跳过当前迭代的其余部分,并执行下一个循环迭代。

举例

  1. 例子1:找出 0 到 10 之间的第一个能被 3 和 5 同时整除的数字。

使用 break 使循环在找到符合条件的数字后立即停止。

#include <stdio.h>

int main() {
    int i;
    for (i = 0; i <= 10; i++) {
        if (i % 3 == 0 && i % 5 == 0) {
            printf("第一个能被3和5同时整除的数字是:%d\n", i);
            break;
        }
    }
    return 0;
}
  1. 例子2:打印 0 到 10 之间的数字,但跳过所有能被 3 整除的数字。

使用 continue 在当前迭代遇到能被 3 整除的数字时跳过。

#include <stdio.h>

int main() {
    int i;
    for (i = 0; i <= 10; i++) {
        if (i % 3 == 0) {
            continue;
        }
        printf("%d\n", i);
    }
    return 0;
}

使用依据

  • 当你需要中断循环并跳出循环时(如搜索问题),使用 break
  • 当你只想跳过循环的当前迭代并继续下一次迭代时,使用 continue

9. for 循环

for 语句是一个循环结构,它执行固定次数的循环。语法如下:

for (initvalue; condition; increment) {
    statements;
}
  • initvalue:一个设置为初始值的计数器。这一部分的 for 循环只执行一次。
  • condition:一个布尔表达式,在每次循环前将计数器与一个值进行比较,当返回假时停止循环。
  • increment: 将计数器增加(或减少)一个设定值。

例如,下面的程序打印 0 到 9:

#include <stdio.h>

int main() {
    int i;
    int max = 10;
  
    for (i = 0; i < max; i++) {
        printf("%d\n", i);
    }
}

填空,循环打印数字 05:

int x;
int end = 5;
___(x = 0; x <= end; x++) {
    ___("%d\n", ___);
}

for 循环可以包含多个表达式,每个部分用逗号 , 分隔。 例如:

for (x = 0, y = num; x < y; i++, y--) { 
  statements; 
}

另外,你可以跳过 initvalueconditionincrement

例如:

#include <stdio.h>

int main() {
    int i=0;
    int max = 10;
  
    for (;i < max; i++) {
        printf("%d\n", i);
    }
}

循环也可以是嵌套的

当以这种方式编写程序时,有一个外循环和一个内循环。对于外循环的每一次迭代,内循环都会重复其整个周期。

在下面的例子中,嵌套的 for 循环被用来输出一个乘法表:

1.0
#include <stdio.h>

int main() {
    int i, j;
    int table = 10;
    int max = 12;
  
    for (i = 1; i <= table; i++) {
        for (j=0; j <= max; j++) {
            printf("%d x %d = %d\n", i, j, i*j);
        }
        printf("\n"); /* 打印换行 */
    }
    
    return 0;
}

注意

内循环中的 break 退出内循环,继续执行外循环。continue 语句的作用与此类似。

下面代码,执行多少次循环?

for (int i = 0; i < 5; i++) { }

小测验

  1. 填空,输入数字存储在变量 age 中。 如果 age 大于 21 岁,则输出 "允许喝酒"。如果 age 小于 10 岁,则输出"学习数学"。
Question
int age;
scanf("%d", & ___ );
___(age > 21) {
    printf("允许喝酒");
} 
else if (___ < 10) {
    printf("学习数学");
}
  1. 填空,使用 do-while 循环结果,打印数字 0 到 5.
Question
int c = 0;
___{
    printf("%d", c);
    ___++;
} while (c <=  5)___
  1. 填空,使用 for 循环,打印"pythontip" 3 次。
Question
___(int i = 0; i ___3; ++i) {
    printf("pythontip");
}
  1. 填空,使用 switch 语句,打印数字对应的英文:
Question
___ (num) {
    case 1:
        printf("one");
        break;
    ___ 2:
        printf("two");
        ___;
    case 3:
    	printf("three");
        break;
}
  1. 填空,如果 age 大于 17 且小于等于 99,则输出"I can drive":
Question
int age = 25;
___ (age > 17 ___ age < 99){
    printf("I can drive");
}
公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web、Sql」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度