课堂笔记
学习任务 数组 函数 变量的定义域与储存方式 数组
1. 为什么需要数组
为了解决大量同类数据的储存和使用问题
为了模拟现实世界
2. 数组的分类:
一维数组
二维数组
多维数组
3.怎样定义一维数组
为n个变量连续分配存储空间
所有的变量数据类型必须相同
所有变量所占的字节大小必须相等
4.有关一维数组的操作
初始化
完全初始化
int a[5] = {1,2,3,4,5};
不完全初始化,未被初始化的元素自动为零
int a[5] = {1,2,3};
不初始化,所有元素是垃圾值
int a[5kk,m];
消零
int a[5] ={0};
错误写法:
int a[5];
a[5] = {1,2,3,4,5};//错误
只有在定义数组的同时才可以同时赋值,其他条件下整体赋值都是错误的
其他情况下整体赋值都是错误的
int a[5] ={1,2,3,4,5};
a[5] = 100;//error 因为没有a[5]这个元素
int a[5] ={1,2,3,4,5};
int b[5];
如果要把a数组中的值全部复制给b数组
错误的写法:
b = a;// error
正确的写法:
for (i=0; i<5; ++i)
b[i] = a[i];
赋值
排序
求最大/小值
倒置
查找
插入
删除
5.二维数组
int a[3][4]
总共有12个元素,可以当作3行4列看待
int[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},
};
6.操作
输出二维数组内容:
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("%d", a[i][j]);
printf("\n");
}
对二维数组排序
求每一行的最大值
判断矩形是否对称
7.多维数组
是否存在多维数组
不存在
因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组
比如:int a[3][4]:
读数组是含有3个元素的一维数组
只不过每一个元素都可以再分成4个小元素
int a[3][4][5]:
该数组是含有3个元素的一维数组
只不过每个元素都是4行5列的二元维素
变量的作用域和储存方式 按作用分: 全局变量 在所有函数外部定义的变量 范围:从定义开始到整个程序结束 局部变量 在一个函数内部定义的变量或者函数的形参都统称为局部变量 void f(int i) { int j = 20; } i和j都属于局部变量 范围:只能在本函数中使用 在一个函数内部如果定义的局部变量的名字和全局变量一样时,局部变量会屏蔽 掉全局变量
按变量的储存方式:
静态变量
自动变量
寄存器变量
重点内容
函数
1.为什么需要函数
避免了重复性操作
有利于程序的模块化
2.什么叫函数
逻辑上:能够完成特定功能的独立的代码
物理上:能够接受数据
能够对外界的数据进行接收
能够将数据处理的结果返回
总结:函数是个工具,他是为了解决大量类似问题而设计的
函数可以当作一个黑匣子
3.如何定义函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体实现方法
2.return 表达式;的含义
1>终止被调函数,向主调函数返回表达式的值
2>如果表达式为空,则只终止函数,不向被调函数返回任何值
3>break是用来终止循环和switch的,return是用来终止函数的
3.函数返回值的类型也称之为函数的类型,因为如果函数名前的返回值类型和函
数执行体的return 表达式;中表达式的类型不同的话,则最终函数返回值的
类型以函数名前的返回值类型相同
4.函数的分类
有参函数 无参函数
有返回值函数 无返回值函数
库函数 用户自定义函数
普通函数 主函数(main函数)
一个程序必须有且只能有一主住函数
主函数可以调动普通函数 普通函数不能调动主函数
普通函数可以互相调用
主函数是程序的入口,也是程序的出口
5.注意的问题
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
1.告诉编译器即将可能出现的若干个字母代表的字母是一个函数
2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值
的具体情况
3.函数声明是一个语句,末尾必须加分号
4.对库函数的声明是通过 # include <库函数所在的文件的形参和实
参个数相同,位置一一对应,数据类型必须相互兼容
6.常用的系统函数
函数是C语言的基本单位,类是Java,C#,C++的基本单位
double sqrt(double x)
求x的平方根
int abs(int x)
求x的绝对值
double fable(double x)
求x的绝对值
7.递归
重点程序
1.数组的简单应用
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int i;
for (i=0; i<5; ++i)
printf("%d\n", a[i]);
printf("%d\n", a[100]);
return 0;
}
2.一维数组的使用
# include <stdio.h>
int main(void)
{
int a[5];
int i;
scanf("%d", &a[0]);
printf("%d\n", a[0]);
scanf("%d", &a[3]);
printf("%d\n", a[3]);
for (i=0; i<5; ++i)
printf("%d", a[i]);
return 0;
}
3.把一个数组都倒过来
# include <stdio.h>
int main(void)
{
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;
}
4.二维数组的使用
# include <stdio.h>
int main(void)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int i, j;
for (i=1; i<3; ++i)
{
for (j=0; j<4; ++j)
printf("%d\n", a[i][j]);
}
return 0;
}
5.函数
# include <stdio.h>
# include <math.h>
void max(int i, int j)
{
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2, c = 3, d = 9, e = -5, f = 100;
max(a, b);
max(c, d);
max(e, f);
return 0;
}
6.利用函数判断素数
# include <stdio.h>
# include <math.h>
void max(int i, int j)
{
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2, c = 3, d = 9, e = -5, f = 100;
max(a, b);
max(c, d);
max(e, f);
return 0;
}
7.局部变量和全局变量
# include <stdio.h>
void g()
{
printf("k = %d\n", k);
}
int k = 1000;
void f(void)
{
g();
printf("k = %d\n", k);
}
int main(void)
{
f(88);
return 0;
}
课后作业
1.ASCII码排序
# include <stdio.h>
int main(void)
{
char ch1, ch2, ch3;
scanf("%c%c%c", ch1, ch2, ch3);
if (ch1>ch2>ch3)
printf("%d %d %d\n", ch1, ch2, ch3);
else if (ch1>ch3>ch2)
printf("%d %d %d\n", ch1, ch3, ch2);
else if (ch2>ch1>ch3)
printf("%d %d %d\n", ch2, ch1, ch3);
else if (ch2>ch3>ch1)
printf("%d %d %d\n", ch2, ch3, ch1);
else if (ch3>ch1>ch2)
printf("%d %d %d\n", ch3, ch1, ch2);
else
printf("%d %d %d\n", ch3, ch2, ch1);
return 0;
}
2.计算两点间的距离
#include <stdio.h>
#include <math.h>
int main (void)
{
int x1,x2,y1,y2;
scanf ("%d%d%d%d",&x1,&x2,&y1,&y2);
float S;
S = sqrt ((x1-x2)*(x1-x2)-(y1-y2)*(y1-y2));
printf ("%.2f",S);
}
3.计算球体积
# include <stdio.h>
# define PI 3.141592627
int main(void)
{
float r, V;
scanf("%f",&r);
V = (4.0/3)*PI*r*r*r;
printf("%.3f\n",V);
scanf("%f",&r);
return 0;
}
4.求绝对值
#include <stdio.h>
#include <math.h>
int main (void)
{
float a,b;
int m;
scanf ("%d",&m);
while (m == 1)
{
printf ("请输入要求绝对值的数");
scanf ("%f",&a);
b = fabs (a);
printf ("该数的绝对值是%.2f\n",b);
scanf ("%d",&m);
}
return 0 ;
}
5.成绩转换
# include <stdio.h>
int main(void)
{
int grade;
scanf("%d",&grade);
switch(grade/10)
{
case 10:
case 9:printf("A\n");break;
case 8:printf("B\n");break;
case 7:printf("C\n");break;
case 6:printf("D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E\n");break;
default:printf("Score is error!");
scanf("%d",&grade);
}
return 0;
}
6.第几天?
#include<stdio.h>
int main()
{
int y, m, d, n;
while (~scanf("%d/%d/%d", &y, &m, &d))
{
if (m == 1)
n = d;
else if (m == 2)
n = 31 + d;
else if (m == 3)
n = 31 + 28 + d;
else if (m == 4)
n = 31 + 28 + 31 + d;
else if (m == 5)
n = 31 + 28 + 31 + 30 + d;
else if (m == 6)
n = 31 + 28 + 31 + 30 + 31 + d;
else if (m == 7)
n = 31 + 28 + 31 + 30 + 31 + 30 + d;
else if (m == 8)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + d;
else if (m == 9)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + d;
else if (m == 10)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d;
else if (m == 11)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d;
else if (m == 12)
n = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d;
if ((y%4==0&&y%100!=0||y%400==0)&&m>=3)
n = n + 1;
printf("%d\n", n);
}
return 0;
}
7.求奇数的乘积
#include<stdio.h>
int main()
{
int m,n,i,temp,sum1,sum2;
while(scanf("%d%d",&m,&n))
{sum1=sum2=0;
if(m>n)
{
temp=m;m=n;n=temp;
}
for(i=m;i<=n;i++)
{
if(i%2==0)
sum1+=i*i;
else if(i%2==1)
sum2+=i*i*i;
}
printf("%d %d\n",sum1,sum2);
}
return 0;
}
8.平方和与立方和
#include<stdio.h>
int main()
{
int i,n,sum,p;
while(scanf("%d",&n))
{sum=1;
for(i=0;i<n;i++)
{
scanf("%d",&p);
if(p%2==1)
sum*=p;
}
printf("%d\n",sum);
}
return 0;
}