C语言集训-王孖豪-第四次作业

109 阅读6分钟

课程笔记

数组

为什么需要数组

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

数组的分类

一维数组

怎样定义一维数组

为n个变量连续分配存储空间
所有的变量数据类型必须相同
所有变量所占的字节大小必须相等
一维数组名不代表数组中所有的元素,一维数组名代表数组第一个元素的地址

有关一维数组的操作
初始化

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

int a[5] = {1,2,3,4,5};
int b[5];
如果要把a数组中的值全部赋值给b数组
for(i=0;i<5;++i)
b[i]=a[i];

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

二维数组

a[i][j]表示第i+1行第j+1列的元素
int a[m][n];该二维数组右下角位置只能是a[m-1][n-1]

初始化

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}

操作
输出二维数组的内容

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=o;j<4;++j)
printf("%d",a[i][j]);
printf("\n");
}

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

多维数组

不存在多维数组,因为内存是线性一维的
n维数组可以当作每个元素是n-1维数组的一维数组
比如:
int a[3][4];
该数组是含有3个元素的一维数组
只不过每个元素都可以再分成4个小元素

函数

为什么需要函数

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

什么叫函数

逻辑上:能够完成特定功能的独立的代码块
物理上:能够接收数据[当然也可以不接收数据]
能够对接收的数据进行处理
能够将数据处理的结果返回[当然也可以不返回任何值]
总结:函数是个工具,它是为了解决大量类似问题而设计的
函数也可以当做一个黑匣子

如何定义函数

函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体实现方法
2.return 表达式;的含义:
终止被调函数,向主调函数返回表达式的值
如果表达式为控,则只终止函数,不向被调函数返回任何值
break是用来终止循环和switch的,return是用来终止函数的
3.函数返回值的类型又称函数的类型
因为如果函数名前面返回值的类型和函数执行体中 return 表达式; 中表达式的类型不一致的话,则最终函数返回值的类型是以函数名前的返回值类型为准\

函数的分类

有参函数 和 无参函数
有返回值函数 和 无返回值函数
库函数 和 用户自定函数
值传递函数 和 地址传递函数
普通函数 和 主函数
一个程序必须有且只有一个主函数
主函数可以调用普通函数,普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口

判断是否为素数


bool IsPrime(int val)
{
  int i;

  for(i=2;i<val;++i)
  {
    if(val!= 0)
    break;
  }
  if(i == val)
  return true;
  else
  return false;
}

int main(void){
  int m;

  scanf("%d",&m);
  if(IsPrime(m))
  printf("Yes!\n");
  else
  printf("No!\n");
  return 0;
}

image.png

注意的问题

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

如果函数调用写在了函数定义的前面,则必须加函数前置声明 函数前置声明: 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的绝对值

专题:递归

变量的作用域和存储方式

按作用域

全局变量

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

局部变量

在一个函数内部定义的变量或者函数的形参 都统称为局部变量
局部变量使用范围:只能在本函数内部使用
注意问题: 全局变量和局部变量命名冲突的问题 在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量

按变量的存储方式

静态变量

自动变量

寄存器变量

课后练习

2000

int main(void)
{
  char a,b,c,d;
  scanf("%c %c %c",&a,&b,&c);
  if (a>b){
  d = b;
  b = a;
  a = d;
  }
  if (b>c)
  {
  d = c;
  c = b;
  b = d;
  }
  if (a>b)
  {
  d = b;
  b = a;
  a = d;
  }
  printf ("%c %c %c\n",a,b,c);
  return 0;
}

image.png

2001

#include <math.h>

int main(void)
{
        double d[4];
        while(scanf("%lf %lf %lf %lf",d,d+1,d+2,d+3)==4)
    {
        d[0] = (d [2]-d[0])*(d[2]-d[0])+(d[3]-d[1])*(d[3]-d[1]);
        d[0] = sqrt(d[0]);
        printf ("%.2f\n",d[0]);
    }
return 0;
}

image.png

2002

#define PI 3.1415926
int main(void)
{
    double r, v;
    
    while (scanf("%lf", &r) != EOF)
    {
         v = (4 * PI * r * r * r) / 3;
         printf("%.3lf\n", v);
    }
    return 0;
}

image.png

2003

#include <math.h>
int main()
{
    double t;

    while (scanf("%lf", &t) != EOF)
    {
        if (t > 0)
            printf("%.2lf\n", t);
        else
        {
            t = 0 - t;
            printf("%.2lf\n", t);
        }
    }
    return 0;
}

image.png

2004

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

image.png

2005

int main()
{
 int year, month, day, n;
 while (scanf("%d/%d/%d", &year, &month, &day))
 {
  if (month == 1)
   n = day;
  else if (month == 2)
   n = 31 + day;
  else if (month == 3)
   n = 59 + day;
  else if (month == 4)
   n = 90 + day;
  else if (month == 5)
   n = 120 + day;
  else if (month == 6)
   n = 151 + day;
  else if (month == 7)
   n = 181 + day;
  else if (month == 8)
   n = 212 + day;
  else if (month == 9)
   n = 243 + day;
  else if (month == 10)
   n = 273 + day;
  else if (month == 11)
   n = 304 + day;
  else if (month == 12)
   n = 334 + day;
  if ((year%4==0&&year%100!=0||year%400==0)&&month>=3)
   n = n + 1;
  printf("%d\n", n);
 }
 return 0;
}

image.png

2006

#include <math.h>
int main()
{
    int n, i, num, t;
    while (scanf("%d", &n) != EOF)
    {
        t = 1;
        for (i = 0; i < n; i++)
        {
            scanf("%d", &num);
            if (num % 2 != 0)
            {
                t = t * num;
            }
        }
        printf("%d\n", t);
    }

    return 0;
}

image.png

2007

int main()
{
    int m,n,sum1,sum2,i;
    while (scanf("%d %d",&m,&n)!=EOF)
    {
        sum1 = 0;
        sum2 = 0;
        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;
}

image.png