数组:
为什么需要数组?
-
为了解决大量同类型数据的存储和使用问题。
-
为了模拟现实世界。
数组的分类:
1.一维数组
怎样定义一维数组
-
为n个变量连续分配存储空间
-
所有的变量数据类型必须相同
-
所有变量所占的字节大小必须相等
有关一维数组的操作
初始化:
-
完全初始化: int a[5] = {1,2,3,4,5};
-
不完全初始化,未被初始化的元素自动为零
- 不初始化,所有元素是垃圾值
- 清零
int a[5] = {0};
错误写法:
(1)
int a[5];
a[5] = {1,2,3,4,5};//错误
只有在定义数组的同时才可以整体赋值, 其他情况下整体赋值都是错误的
(2)
int a[5] = {1,2,3,4,5};
a[5] = 100;//e没有a[5]这个元素.
- 赋值
- 排序
- 求最大/最小值
- 倒置
- 查找
- 插入
2.二维数组 int a[3][4];
总共是12个元素:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[i][j]表示第i+1行i+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}
};
左对齐:%-d,-后面的数字(一般不使用printf来对齐)
3.多维数组
是否存在多维数组:
不存在。因为内存是线性一维的,n维数组可以当作每个元素是n-1维数组一维数组。
函数【重点】
1).为什么需要函数
例子:筛选素数代码:
#include <stdio.h>
#include <stdbool.h>
bool IsPrime(int val)
{
int i;
for (i=2; i<val; ++i)
{
if (val%i == 0)
break;
}
if (i == val)
return true;
else
return false;
}
int main()
{
int m;
int i;
scanf("%d",&m);
if (IsPrime(m))
printf("Yes!\n");
else
printf("No\n");
return 0;
}
2).什么叫函数
-
逻辑上:能够为完成特定功能的独立代码块
-
物理上:能够接收数据[当然也可以不接收]
-
能够对接受的数据进行处理
-
能够将数据处理的结构返回[当然也可以不返回任何值]
总结:函数是一个工具,它是为了解决大量类似的问题而设计的,函数可以当作一个黑匣子。
3).如何定义函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
<1> 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
<2> return表达式;的含义:
终止被调函数,向主调函数返回表达式的值
如果表达式为空,则只终止函数,不向被调函数返回任何值
break是用终止循环和switch的,return是用来终止函数的
<3>函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型和函数执行体中return表达式;中表达式的类型不同的或,则最终返回值的类型以函数名前的返回值类型为准。
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.局部变量(在一个函数内部定义的变量或者函数的形参都通称为局部变量)
void f(int i)
{
int j= 20;
}//i和j都属于局部变量
使用范围:只能在本函数内部使用
-
注意的问题:
-
全局变量和局部变量命名冲突的问题
-
在一个函数内部如果定义的局部变量名字和群居变量名一样时,局部变量会屏蔽掉全局变量。
-
按变量的存储方式
1.静态变量 2.自动变量 3.寄存器变量
习题集:
这次作业一直在修改,因为不知道题目是什么意思,一开始一直没有EOF,直接多用了两个循环,然后一直错。可惜的是代码没有保存下来。我习题集的笔记是最后才做的,然后有六道题是11/27号写的,以为直接贴代码到这里就行,不知道还要运行通过,还是和同学交流后才知道(我之前一直以为我做完了六题,今天可以早点结束)。解题思路的话我觉得就后面三题多思考了一下。前面几题的运行主要是格式和数据类型的问题,都是比较简单的题,不必想的过于复杂。
1.ASCII码排序:
逐次比较大小,将更小的数据排列到更前面,按顺序输出。
#include <stdio.h>
int main(void)
{
char a,b,c,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;
}
2.计算两点之间的距离
套公式。
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1,x2,y1,y2;
double distance;
while( scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF )
{
distance=sqrt ( pow( x1-x2, 2) + pow( y1-y2, 2) ) ;
printf("%.2lf\n",distance);
}
return 0;
}
3.计算球体积
套公式。
#include <stdio.h>
#include <math.h>
#define PI 3.1415927
int main(void)
{
double V,R;
while(scanf("%lf",&R)!=EOF)
{
V= (4.0/3)* PI* pow(R,3);
printf("%.3f\n",V);
}
return 0;
}
4.求绝对值:
一开始我想用函数,但只要求绝对值就不必那么复杂,因为正数的绝对值为其本身,负数的绝对值为其相反数。
#include <stdio.h>
int main(void)
{
double x,y;
while(scanf("%lf",&x)!=EOF)
{
y=x;
if (x<0)
{
y=-x;
}
printf ("%.2f\n",y);
}
return 0;
}
5.成绩转换
这个比较简单能用if轻松解决。
#include<stdio.h>
int main()
{
int a ;
while( scanf("%d",&a)!=EOF)
{
if(a<=100&&a>=90)
{
printf("A\n");
}
else if(a<=89&&a>=80)
{
printf("B\n");
}
else if(a<=79&&a>=70)
{
printf("C\n");
}
else if(a<=69&&a>=60)
{
printf("D\n");
}
else if(a<=59&&a>=0)
{
printf("E\n");
}
else
{
printf("Score is error!\n");
}
}
return 0;
}
6.第几天?
因为求一年中的第几天,所以首先想到的是这年是不是闰年。
但先判断是否为闰年就显得过于繁琐,因为只有2月的时候不同,所以只需要在2月时判断即可。
一开始我想到的是if...else...但这样还是很繁琐。这时我就在想不用break的case就能一直向下运行,于是就写出这样的代码了。
#include<stdio.h>
int main(void)
{
int year,month,day;
int sum=0;
while (scanf("%d/%d/%d",&year,&month,&day)!=EOF)
{
sum =0;
switch(month)
{
case 12:day+= 30;
case 11:day+= 31;
case 10:day+= 30;
case 9:day += 31;
case 8:day += 31;
case 7:day += 30;
case 6:day += 31;
case 5:day += 30;
case 4:day += 31;
case 3:
if( year%100!=0 && year%4 ==0 || year%400 == 0)//判断闰年
{ day += 29; }
else
{ day += 28; }
case 2:day += 31;
case 1:day += 0; break;
}
sum =day;
printf("%d\n",sum);
}
}
7.求奇数成积
#include <stdio.h>
int main(void)
{
int i,j,a;
int sum=1;
while(scanf("%d ",&i)!=EOF)
{
sum=1;
for(j=0;j<i;j++)
{
scanf("%d",&a);
if(a%2 == 1)
{
sum=sum*a;
}
}
printf("%d\n",sum);
}
return 0;
}
8.平方和与立方和
这道题我做了好久一直没想明白题目的意思。 把题目误解为输入两个数再输出他们中奇数立方和与偶数平方和。(深受第7题影响)
然后突然就理解了输入两个数的意思是输入头尾,那就很快就写出来了。同时因为之前我的误解,我加上了判断两数大小的部分(不知道标答要不要加)。
#include<stdio.h>
void main()
{
long i;
long x,y;
long m,n,p;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m > n)
{
p = m;
m = n;
n = p;
}
x=y=0;
for(i = m; i <= n; i++)
{
if(i%2 ==0)
x+=i*i;
else
y+=i*i*i;
}
printf("%d %d\n",x,y);
}
}