c语言基础(四)

213 阅读1分钟

1. for循环:

for (表达式1; 表达式2 ; 表达式3)	
{
    循环体。
}

int sum = 0;
int i = 0;	

for (; ; )
{
    sum = sum + i;
    i++
}

2. 循环因子:

  • 定义在for之外,for循环结束,也能使用。
  • 定义在for之内,for循环结束,不能使用。

for的3个表达式,均可变换、省略。但,2个分号不能省

for (i = 1, a = 3;i < 10, a < 20; i++, a+=5)
{
    printf("i = %d\n", i);
    printf("a = %d\n", a);
    a += 5;
}

for(;;) == while(1)  无限循环

练习:猜数字游戏:

1. 生成一个随机数。 

    1)添加一个随机数种子。srand(time(NULL));

    2) 添加头文件 <stdlib.h> <time.h>

    3) 生成随机数 int n = rand() % 100;  0-99

2. 循环输入数据猜。

    int num;

    while1// 死循环  for(;;)
    {
        接收用户输入 scanf("%d", &num);

        比较用户的数 和 随机生成数 大小。

        if (n > num)

        else
                break;
    }

3. 跳出循环

    break;

3. break:

  • 作用1: 跳出一重循环。 for、while、do while
  • 作用2: 防止case穿透。 switch

4. 嵌套循环:

// 外层循环执行一次,内层循环执行一周。
for(i = 0; i < 24; i++)
{
    for(j = 0; j< 60; j++)
    {

        for(k = 0; k< 60; i++)
        {			
        }
    }
}

练习1: 模拟电子表打印:

for (i = 0; i < 24; i++)
{
    // 分钟
    for (j = 0; j < 60; j++)
    {
        // 秒
        for (k = 0; k < 60; k++)
        {
            printf("%02d:%02d:%02d\n", i, j, k);
            Sleep(960);	// #include <Windows.h>,此处的Sleep函数的入参的值表示的是ms
            system("cls");  // 清屏
        }
    }
}

练习2: 打印9x9乘法表:

// 外层循环执第i行, 内层执行i列。
for(i=1; i<=9; i++)  	// 行
{
        for(j = 1; j <= i; j++)  //列
        {
                printf("%dx%d=%d\t", j, i, j*i);
        }
        printf("\n");  putchar('\n');
}

思考题:如何逆序打印99乘法表呢?

for (i = 9; i >= 1; i--)		// 行
{
        for(j = 1; j <= i; j++)		// 列
        {
                printf("%dx%d=%d\t", j, i, j*i);

        }
        putchar('\n');
}

5. 跳转语句:

break:【重点】

  • 作用1: 跳出一重循环。 for、while、do while
  • 作用2: 防止case 穿透。 switch

continue:【重点】

  • 作用:结束【本次】循环, continue关键字,之后的循环体,这本次循环中,不执行。

6. goto: 【了解】

  1. 设定一个标签
  2. 使用“goto 标签名” 跳转到标签的位置。(只在函数内部生效)

7. 数组:

相同数据类型的有序连续存储。

int arr[10] = {1, 2, 23, 4, 5, 6 , 10, 7, 8, 9};
//各个元素的内存地址 连续。
//数组名为地址。是数组首元素的地址。 arr == &arr[0];
printf("数组大小:%u\n", sizeof(arr));
printf("数组元素的大小:%u\n", sizeof(arr[0]));
printf("数组元素个数:%d\n", sizeof(arr)/ sizeof(arr[0]));
// 数据的第一个元素下标: 
0
// 数据的最后一个元素下标: 
sizeof(arr)/ sizeof(arr[0]) - 1

8. 数组初始化:

int arr[12] = { 1, 2 ,4, 6, 76, 8, 90 ,4, 3, 6 , 6, 8 }; 【重点】
int arr[10] = { 1, 2 ,4, 6, 76, 8, 9 };  剩余未初始化的元素,默认 0 值。 【重点】
int arr[10] = { 0 }; 初始化一个全为 0 的数组。【重点】
int arr[] = {1, 2, 4, 6, 8}; 	编译器自动求取元素个数  【重点】
int arr[] = {0};  只有一个元素,值为0
int arr[10]; 
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;	其余元素未被初始化,默认值 随机数。

练习1: 数组元素逆序:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

// !!函数中无法获取数组形参的长度,所以形参数组的长度需要从调用方传递进来!!
void reverse(char *arr, int len)
{
    printf("%d\n", len);
    for (int i = 0; i < len/2; i++) {
        char _tmp = arr[i];
        arr[i] = arr[len - i - 1 ];
        arr[len - i - 1] = _tmp;
    }
    for (int i = 0; i < len; i++) {
        printf("%c", arr[i]);
    }
}

练习2: 冒泡排序:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void bubble_sort (int *arr, int len)
{
    for (int i = 0; i<len; i++) {
        for (int j = i + 1; j<len; j++) {
            if(arr[j] < arr[i]){
                int _tmp = arr[j];
                arr[j] = arr[i];
                arr[i] = _tmp;
            }
        }
    }

    for (int i = 0; i<len; i++) {
        printf("%d ", arr[i]);
    }
}

int main(void)
{ 
    int arr[] = {6,3,2,5,9,74,1,5,6,2};
    int len = sizeof arr / sizeof arr[0];
    bubble_sort(arr, len);
    return 0;
}