C语言作业-熊家旗-第四次作业

203 阅读6分钟

学习笔记

一、数组

为什么需要数组

为了解决大量同类型数据的存储和使用问题
为了模拟现实世界

数组的分类

一维数组、二维数组、三维数组。

一维数组的使用

1)定义:

为n个数组的存储分配空间
所有的变量类型必须相等
所有变量所占的字节大小必须相等
例:int a[5]

2)关于一维数组的操作

1.初始化(只有在定义数组时才可以整体赋值,其他情况都是错误的)
完全初始化
int a[5] = {1,2,3,4,5};
不完全初始化,未初始化的元素自动为零
int a[5] = {1,2,3}
未初始化,所有元素是垃圾值
int a[5];
清零
int a[5] = {0};

2.赋值
例:将a[5]赋值给b[5]\

int a[5] = {1,2,3,4,5};
int b[5];

for (i = 0; i < 5; i++)
b[i] = a[i];

例子:把一个数组全部倒过来

#include<stdio.h> 
int main()
{
    int a [8] = {1,2,3,4,5,6,7,8};
    int i, j;
    int t;

    i = 0;
    j = 7;
    while (i < j)
    {
        t = a[i];
        a[i] = a[j];
        a[j] = t;
        i++;
        j--;
    }
    for (i= 0; i<=7; i++)
        printf("%d\n", a[i]);

    return 0;
}

QQ截图20211127145919.png

3.排序、求最大/小值、倒置、查找、插入、删除

2)二维数组

int a[3][4]; 总共12个元素,看作三行四列

例:

#include<stdio.h> 
int main()
{
    int a [3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9,10,11,12}
        };    
    int i, j;

    for (i=0; i<3; i++)
    {
        for (j=0; j<4; j++)
            printf("%-5d", a[i][j]);
        printf("\n");
    }

    return 0;
}

QQ截图20211127164853.png 对二维数组排序
求每一行的最大值
判断矩阵是否对称
矩阵的相乘

3)多维数组

不存在多维数组,因为内存是线性一维的;
n维数组可以当作每个元素是n-1维的n维数组。

二、函数

为什么需要函数

避免了重复性操作
有利于程序的模块化

什么是函数

逻辑上:
能够完成特定功能的独立代码块;
物理上:
能够接收数据(也可以不接收);
能够对接收后的数据进行处理;
能够将数据处理结构返回(也可以不反回);
总结:
函数是个工具,它是为了解决大量类似问题而设计的;
函数可以当作一个黑匣子 。

如何定义函数

函数的返回值 函数的名字 (函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个它的功能的具体方法;
2.return表达式:终止被调函数向主调函数返回表达式的值,或
3.返回值的类型也称为函数的类型,以函数前的返回值类型为准

函数的分类

1.有参函数和无参函数
2.有返回值函数和无返回值函数
3.库函数和自定义函数
4.普通函数和主函数(main)
一个函数有且只有一个主函数;
主函数可以调用普通函数但普通函数不能调用主函数;
普通函数可以相互调换;
主函数是程序的入口也是程序的出口。

注意的问题

函数调用与函数定义的顺序

如果函数调用写在了函数定义的前面,则必须加函数前置声明函数前置声明:
1.告诉编译器即将可能出现的若干个字母代表的是一个函数;
2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况;
3.函数声明是一个语句,末尾必须加分号;
4.对库函数的声明是通过 # include<库函数所在的文件的名字.h>来实现的;

形参和实参

个数相同位置一一对应数据类型必须相互兼容

如何在软件开发中合理的设计函数来解决实际问题

一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
函数是c语言的基本单位,类是Java,C#,C+的基本单位

常用的系统函数

double sqrt(double x) -- 用于求x的平方根
int abs(int x) -- 用于求整数x的绝对值
double fabs(double x) -- 用于求浮点数x的绝对值

专题:递归

1.简单说程序调用自身的编程技巧叫递归。递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止。
2.使用递归需要避免出现死循环,为了确保递归正确工作,递归程序应该包含2个属性:

基本情况,基本情况用于保证程序调用及时返回,不在继续递归,保证了程序可终止。
递推关系,可将所有其他情况拆分到基本案例。

变量的作用域与存储方式

1.按作用域分:

全局变量:

在所有函数外部定义的变量叫全局变量
使用范围:从定义位置开始到整个程序结束

局部变量:

例:

    void f(int i)
    {
    int j = 20;
    }

i和j都属于局部变量
使用范围:只能在本函数内部使用

注意的问题:

全局变量和局部变量命名冲突的问题:在一个函数内部如果定义的局部变量的名字和全局变量的名字一样时,局部变量会屏蔽掉全局变量

2.按变量的存储方式:

静态变量
自动变量
寄存器变量

作业

第一题

#include <stdio.h>
int main(void)
{
    char a, b, c, d;
    char t;

    while (scanf("%c%c%c%*c", &a, &b, &c) != EOF)
    {
        if (a < b)
        {
            t = a;
            a = b;
            b = t;
        }
        if (a < c)
        {
            t = a;
            a = c;
            c = t;
        }
        if (b < c)
        {
            t = b;
            b = c;
            c = t;
        }
        printf("%c %c %c\n", a, b, c);
    }
    return 0;
}

QQ截图20211128172256.png

第二题

#include <stdio.h>
#include <math.h>

int main()
{
    double x1, x2, y1, y2;
    double s;

    while (scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2) != EOF)
    {
        s = sqrt((y1 - y2) * (y1 - y2) + (x1 - x2) * (x1 - x2));
        printf("%.2lf\n", s);
    }
    return 0;
}

QQ截图20211128172442.png

第三题

#include <stdio.h>
#define PI 3.1415927
int main(void)
{
    double v, r;
    while (scanf("%lf", &r) != EOF)
    {
        v = 4.0/3.0 * r * r * r * PI;
        printf("%.3lf\n", v);
    }
}

QQ截图20211128175246.png

第四题

#include <stdio.h>
int main(void)
{
    double i;
    while (scanf("%lf", &i))
    {
        if (i >= 0)
        printf("%.2lf\n", i);
        else
        i = 0 - i;
        printf("%.2lf\n", i);
    }

    return 0;
}

QQ截图20211128180410.png

第五题

#include <stdio.h>

int main()
{
    int score;
    while (scanf("%d", &score) == 1)
    {
        if (score <= 100 && score >= 90)
           printf("A\n", score);
        else if (score <= 89 && score >= 80)
           printf("B\n", score);
        else if (score <= 79 && score >= 70)
           printf("C\n", score);
        else if (score <= 69 && score >= 60)
           printf("D\n", score);
        else if (score <= 59 && score >= 0)
           printf("E\n", score);
        else
           printf("Score is erorr!\n");                   
    }

    return 0;
}

QQ截图20211128215204.png

第六题

#include <stdio.h>
int main()
{
    int a, b, c;
    int d[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    while (scanf("%d/%d/%d", &a, &b, &c) != EOF)
    {
        int num = 0;
        for (int i = 0; i < b - 1; i++)
            num += d[i];
        if (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0))
        {
            if (b > 2)
                num += c + 1;
            else
                num += c;
        }
        else
            num += c;
        printf("%d\n", num);
    }
    return 0;
}

QQ截图20211128231325.png

第七题

#include <stdio.h>
#define maxn 100000
int main()
{
    int n, x;
    int i = 0;
    int num[maxn];
    while (scanf("%d", &n) != EOF)
    {
        int ans = 1;
        while (n--)
        {
            scanf("%d", &x);
            if (x % 2 == 1)
                ans *= x;
        }
        printf("%d\n", ans);
    }

    return 0;
}

QQ截图20211128232136.png

第八题

#include <stdio.h>

int main(void)
{
    int m, n, t;

    while (scanf("%d %d", &m, &n) != EOF)
    {
        int sum1 = 0, sum2 = 0;  //sum的值每次都应该初始化
        if (m > n)
        {
            t = m;
            m = n;
            n = t;
        }
        for (int i = m; i <= n; i++)
        {
            if (i % 2 == 0)
                sum1 += i * i;
            else
                sum2 += i * i * i;
        }
        printf("%d %d\n", sum1, sum2);
    }

    return 0;
}

QQ截图20211128233012.png

QQ截图20211128235046.png