观课笔记
1.数组
为什么需要数组:为了解决大量同类型数据的存储和使用问题;为了模拟现实世界
数组的分类:
一维数组:
为n个变量连续分配存储空间;
所有的变量数据类型必须相同;
所有变量所占的字节大小必须相等。
例如:int a【5】; 一维数组名不代表数组中的所有的元素,一维数组名代表数组第一个元素的地址。
有关一维数组的操作:
完全初始化: int a【5】 = {1,2,3,4,5,};
不完全初始化:(未被初始化的元素自动为零)int a【5 】 = {1,2,3};
不初始化:所有元素都是垃圾值
清零: int【5】 = {0};
错误的写法:
int a【5】;
a【5】={1,2,3,4,5}; //错误,只有在定义数组的同时才可以整体赋值,其他情况下整体赋值都是错误的
int a【5】={1,2,3,4,5}
a【5】=100; //错误,因为没有a【5】这个元素,最大只有a【4】
int a【5】={1,2,3,4,5};
int b【5】;如果要把a数组中的值全部赋值给b数组
正确的写法:
for (i= 0;i<5;++i)
b【i】=a【i】;
相关代码及运行结果:
#include<stdio.h>
int main()
{
int a[5];
int i;
scanf("%d",&a[0]);
printf("a[0] = %d\n",a[0]);
scanf("%d",&a[3]);
printf("a[3] = %d\n",a[3]);
for (i = 0; i < 5; ++i)
printf("%d",a[i]);
return 0;
}
#include<stdio.h>
int main()
{
int a[7] = {1,2,3,4,5,6,7};
int i,j;
int t;
i = 0;
j = 6;
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;
}
二维数组:
表示:int a【3】【4】
总共是12个元素,可以当做3行4列看待,这里的元素可表示为:
int a【i】【j】;该二维数组右下角位置的元素只能是a【m-1】【n-1】
操作:
输出二维数组内容:
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");
}
相关代码及运行结果:
#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=0;i<3;++i)
{
for(j = 0;j<4;++j)
printf("%d\n",a[i][j]);
printf("\n");
}
return 0;
}
不存在多维数组,因为内存是线性一位的;n维数组可以当做每个元素是n-1维数组的一位数组
比如:int a【3】【4】; 该数组是含有3个元素的一维数组,只不过每个元素都可以再分成4个小元素
int a【3】【4】【5】; 该数组是含有3个元素的一维数组,只不过每个元素都是4行5列的二维数组
函数
1.为什么需要函数:
避免了重复性操作,有利于程序的模块化。
2.什么叫函数:
逻辑上:能够完成特定功能的独立的代码块
物理上:能够接受数据【当然也可以不接受数据】 ,能够对接受的数据进行处理,能够将数据处理的结果返回【当然也可以不返回任何值】
总结:函数是一个工具,它是为了解决大量类似问题而设计的函数可以当做是一个黑匣子
3.如何定义函数:
函数的返回值 函数的名字(函数的形参列表)
{
函数执行体
}
- return 表达式的含义: 终止被调函数,向主函数返回表达式的值;
如果表达式为空,则只终止函数,不向主函数返回任何值;
(break是用来终止虚幻和switch,return是用来终止函数的)
- 函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型和函数执行体重的return表达式中表达式的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准 例子:
int f()
{
return 10.5;
}
//因为函数的返回值类型是int,所以最终f返回的是10而不是10.5
函数的分类: 有参函数和无参函数
有返回值函数和无返回值函数
库函数和用户自定函数
值传递函数和地址传递函数
普通函数和主函数(main函数)
()一个程序必须有且只有一个主函数,主函数可以调用普通函数,普通函数不能调用主函数;普通函数可以相互调用;主函数是程序的入口,也是程序的出口。)
函数前置声明: 告诉编译器即将可能出现的若干个字母代表的是一个函数;告诉编译器即将可能出现的若干个字母所代表的的函数的形参和返回值得具体情况;函数声明是一个语句,末尾必须加分号;对库函数的声明是通过
#include<库函数所在的文件的名字.h>来实现的
常用的系统函数:
double sqrt(double x);
求的是x的平方根
int abs(int x)
求的是x的绝对值
double fas(double x)
求的是x的绝对值
#include<stdio.h>
int main(void)
{
int a,b,c,d,e,f;
a = 1,b = 2,c = 3,d = 9,e =-5,f = 100;
if (a>b)
printf("%d\n",a);
else
printf("%d\n",b);
if(c>d)
printf("%d\n",c);
else
printf("%d\n",d);
if(e>f)
printf("%d\n",e);
else
printf("%d\n",f);
return 0;
}
变量的作用域和存储方式
1.按作用域分:
全局变量:在所有函数外部定义的变量叫全局变量;全局变量使用的范围是从定义位置开始到整个程序结束
局部变量:在一个函数内部定义的变量或者函数的形参都称为局部变量;局部变量使用的范围只能在本函数内部使用
注意问题:在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
2.按变量的存储方式:
静态变量
自动变量
寄存器变量
杭电oj习题集相关代码及运行结果
1.ASCII码排序
#include <stdio.h>
int main()
{
char a,b,c,i;
while(scanf("%c%c%c%*c",&a,&b,&c)!=EOF)
{ if(a>b) i=a,a=b,b=i;
if(a>c) i=a,a=c,c=i;
if(b>c)i =b,b=c,c=i;
printf("%c %c %c\n",a,b,c);
}
return 0;
}
2.计算两点间的距离
#include<stdio.h>
#include<math.h>
int main()
{
float x1,x2,y1,y2,d;
while(scanf("%f %f %f %f",&x1,&y1,&x2,&y2) != EOF)
{
d = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
printf("%.2lf\n",d);
}
return 0;
}
3.计算球的体积
#include<stdio.h>
#define PI 3.1415927
int main()
{
double r ,v;
while(scanf("%lf",&r) != EOF)
{
v = 4.0/3.0*PI*r*r*r;
printf("%.3lf\n",v);
}
return 0;
}
4.求绝对值
#include<stdio.h>
int main()
{
float a,b;
while(scanf("%f",&a) != EOF)
{
if(a<0)
{ b = -a;
printf("%.2f",b);}
else
{ printf("%.2f",a);}
}
return 0;
}
5.成绩转换
#include<stdio.h>
int main()
{
int t;
while(scanf("%d",&t) !=EOF)
{
if((t >= 90)&&(t <=100))
printf("A\n");
else if((t >= 80)&&(t <= 89))
printf("B\n");
else if((t >= 70)&&(t < 79))
printf("C\n");
else if((t >= 60)&&(t <69))
printf("D\n");
else if((t >= 0)&&(t < 59))
printf("E\n");
else
printf("Score is error!\n");
}
return 0;
}
6.第几天
#include<stdio.h>
#include<string.h>
int isRuiNian(int year)
{
if((year%400==0)||(year%4==0&&year%100!=0))
return 1;
return 0;
}
int main()
{
int y[100];
char str[100];
while(gets(str)!=NULL)
{
int i,j,sum=0,temp=0,len;
len=strlen(str);
for(i=0,j=0;i<len;i++)
{
if(str[i]=='/')
{
y[j++]=temp;
temp=0;
}
else
temp=temp*10+str[i]-'0';
}
y[2]=temp;
for(i=1;i<y[1];i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
sum+=31;
else
{
if(i==2)
{
if(isRuiNian(y[0]))
sum+=29;
else
sum+=28;
}
else
sum+=30;
}
}
sum+=y[2];
printf("%d\n",sum);
}
return 0;
}
7.求奇数的乘积
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,sum;
while (scanf("%d",&i)!=EOF)
{
sum = 1;
for (j = 0;j<i;j++)
{
scanf("%d",&k);
if(k%2==1)
{
sum*=k;
}
}
printf("%d\n",sum);
}
return 0;
}
8.平方和与立方和
#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;
}