c课堂笔记 day-3
作业讲解:阶乘:5!=5x4x3x2x1
#include<stdio.h>
int main()
{
//阶乘:5!=5*4*3*2*1
//0!=1!=1;这是规定
int num=0,sum=1;
printf("input num:");
scanf("%d",&num);
int i;
for(i=1;i<=num;i++)
{
sum*=i;
}
printf("%d %d\n",num,sum);
}
作业讲解: 注意这题的区别 程序1、2中有注意点
$
$$
$$$
$$$$
$$$$$
(1) #include<stdio.h>
int main()
{
int row=0;
int col=0;
int num;
printf("input num:");
scanf("%d",&num);
for(;row<=num;row++)
{ //注意省略和不省略col=1;的结果
for(;col<=row;col++)
printf("$");
printf("\n");
}
return 0;
}
(2) #include<stdio.h>
int main()
{
int row=0;
int col=0;
int num;
printf("input num:");
scanf("%d",&num);
for(row=0;row<=num;row++)
{
//注意省略和不省略col=1;的结果
for(col=0;col<=row;col++)
printf("$");
printf("\n");
}
return 0;
}
for(表达式1;表达式2;表达式3)
执行顺序:
A.表达式1
B.表达式2,若表达式2成立,则执行(C);不成立,执行(E)
c.执行循环体即{}里的内容;
D.表达式3,执行(B)
E.结束循环
作业字母金字塔:
讲解: A
BBB
CCCCC
#######include<stdio.h>
int main()
{
char ch='a';
char chb=65;
int num=97;
//字符变量的十进制ascii码值问题
printf("char: ch='%c' ; ch=%d\n",ch,ch);
printf("char: chb='%c' ; chb=%d\n",chb,chb);
printf("int : num=%d ; num='%c'\n",num,num);
}
\
#######include<stdio.h>
int main()
{
int row=0;
int col=0;
char ch='A';
for(row=1;row<=26;row++)
{
for(col=0;col<26-row;col++)
printf(" ");
for(col=1;col<=2*row-1;col++)
printf("%c",ch);
ch++;
printf("\n");
}
return 0;
}
时钟问题:
原版
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j,b;
for(b=0;b<24;b++)
{
for(j=0;j<60;j++)
{
for(i=0;i<60;i++)
{
system("clear");
printf("时钟:%d:%d:%d\n",b,j,i);
sleep(1);
}
system("clear");
printf("时钟:%d:%d:%d\n",b,j,i);
sleep(1);
}
system("clear");
printf("时钟:%d:%d:%d\n",b,j,i);
sleep(1);
}
}
改进版
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j,b;
printf("输入时间:");
scanf("%d %d %d",&b,&j,&i);
for(;;)
{
for(;b<=24;b++)
{
for(;j<3;j++)
{
for(;i<3;i++)
{
system("clear");
printf("时钟:%02d:%02d:%02d\n",b,j,i);
sleep(1);
}
i=0;
system("clear");
printf("时钟:%02d:%02d:%02d\n",b,j,i);
//%02d:代表输出的宽度
sleep(1);
}
j=0;
system("clear");
printf("时钟:%02d:%02d:%02d\n",b,j,i);
sleep(1);
}
b=0;
}
}
百钱买百鸡问题:
#include<stdio.h>
int main()
{
int i,j,k;
for(i=1;i<=20;i++)
for(j=1;j<=33;j++)
for(k=1;k<=100;k++)
if(i+j+k==100&&i*5+j*3+k*1/3==100&&k%3==0)
{
printf("%d %d %d\n",i,j,k);
}
}
一.数组: 如果要定义太多的数字,如果一个一个去定义那时没有必要的
所以数组的意义就在这里
(1) 数组的定义:
DataType ArrayName[size];
DataType:数据类型,int,float,double,char,等等
ArrayName:数组名
size: 数组的大小或数组下标,必须是常量表达式
[ ]: 下标运算符 从0下标开始到size-1
例:
定义一个数组大小为5,其中每个元素都是int类型
int arr[5];
arr:数组名
5 :数组大小即数组元素的个数
int :数组元素的类型
(2) 数组的初始化
int arr[3]={1,2,3}; 完全初始化
int arr1[3]={1,3}; 缺省初始化 其他默认为0
int arr2[3]={1};
int arr3[3]={[2]=3}; 不建议 这么写 有些c标准支持这种写法 这是给某个元素赋初值
int arr4[]={1,2,3,4};
int arr5[]={}; // error
int arr[5];
arr[5]={1,2,3,4,5}; //这样的赋值方式 error
注:数组若要初始化,必须在定义的同时初始化,
不能先定义,后初始化;
//以下方法不可以,编译器会报错:
/*
int n = 6;
int arr[n];
int m;
scanf("%d",&m);
int buf[m];
*/
简单介绍宏定义
#######define M 5 后面不能跟分号!!!
意思是:用M代替5;
(3) 数组元素的访问
使用下标形式:从0下标开始到size-1
int arr[5];
arr[1]:访问第二个元素
arr[4]:访问第五个元素
#include<stdio.h>
int main()
{
//数组元素初始化
int arr[5]={1,2,3,4,5};
//访问数组第三个元素下标从0开始为2
printf("%d\n",arr[2]);
//数组元素之前的值
printf("before:%d\n",arr[3]);
//数组元素的操作
arr[3]*=5;
printf("after:%d\n",arr[3]);
}
#include<stdio.h>
int main()
{
//数组元素未初始化输出的随机值 情况
int arr[5];
printf("arr[0] = %d\n",arr[0]);
printf("arr[1] = %d\n",arr[1]);
printf("arr[2] = %d\n",arr[2]);
printf("arr[3] = %d\n",arr[3]);
printf("arr[4] = %d\n",arr[4]);
}
(4) 遍历数组:逐个访问
#include<stdio.h>
int main()
{
int arr[5]={1,2,3};
int i;
for(i=0;i<5;i++)
//第一个%d:对应数组的下标
//第二个%d:对应数组元素的值
printf("arr[%d] = %d\n",i,arr[i]);
return 0;
}
(5) 数组的存储
数组也是一种数据结构,数组中的元素顺序存储
数组中每个元素的类型都相同;
#include<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
int i = 0;
for(i=0;i<5;++i)
{
//地址占位符:%p或者%x,(正规用法是%p)
//这里的&是取地址符
printf("&arr[%d] = %p\n",i,&arr[i]);
}
}
结果:
&arr[0] = 0x7ffcd4f0c670
&arr[1] = 0x7ffcd4f0c674
&arr[2] = 0x7ffcd4f0c678
&arr[3] = 0x7ffcd4f0c67c
&arr[4] = 0x7ffcd4f0c680
#include<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
int i = 0;
for(i=0;i<5;++i)
{
//地址占位符:%p或者%x,(正规用法是%p)
printf("&arr[%d] = %p\n",i,&arr[i]);
}
printf("sizeof(arr)=%ld\n",sizeof(arr));=20
内存中的所占的字节
}
(6) 数组地址问题
int arr[5]:
arr:0x000000 数组名,也代表数组元素的首地址,即第一个元素的地址
&arr[0]:0x000000 数组元素的首地址,即第一个元素的地址
&arr:0x000000 数组的首地址
arr+1:0x000004
&arr[0]+1:0x000004
&arr+1:0x000014 偏移量为sizeof(arr)
arr+1和&arr[0]+1:表达的意思一样,
地址偏移sizeof(arr[0])个字节
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
//数组元素的地址问题
// printf("arr[0] = %d\n",arr[0]);
//printf("arr[1] = %d\n",arr[1]);
printf("arr = %p\n",arr);
printf("arr+0=%p\n",arr+0);
printf("arr+1=%p\n",arr+1);
printf("arr+2=%p\n",arr+2);
printf("arr+3=%p\n",arr+3);
printf("arr+4=%p\n",arr+4);
}
结果:
arr = 0x7ffe0fce0e60// 这里首地址一样
arr+0=0x7ffe0fce0e60//
arr+1=0x7ffe0fce0e64
arr+2=0x7ffe0fce0e68
arr+3=0x7ffe0fce0e6c
arr+4=0x7ffe0fce0e70
(7) 数组元素的赋值
**熟练数组元素的赋值和遍历输出
#include<stdio.h>
int main()
{
int arr[5];
int i = 0;
//给数组元素赋值
printf("input 5 num:\n");
for(i=0;i<5;i++)
{
//arr[i]=2*i;
scanf("%d",&arr[i]); //注意格式
}
//遍历输出
for(i=0;i<5;i++)
printf("arr[%d]=%d\n",i,arr[i]);
}
求数组和与平均值:
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int i=0;
int sum=0;
float aegv=0;
for(i=0;i<5;i++)
{
sum+=arr[i];
}
aegv=(float)sum/5;
printf("和:%5d 平均值:%f\n",sum,aegv);
(8)字符串数组
初始化定义
char arr[10]={"hello"};
char arr[10]={'h','e','l','l','o'};
输出占位符为%s
#include<stdio.h>
int main()
{
char arr[16]={"hEllo world"};
//将小写字母转成大写字母;大写字母转成小写字母
int i,ch;
for(i=0;i<16;i++)
{
if(arr[i]>='a'&& arr[i]<='z')
arr[i]-=32;
else if(arr[i]>='A'&& arr[i]<='Z')
arr[i]+=32;
}
printf("%s\n",arr);
}
二、二维数组(基于矩阵)
DataType ArrayName[行下标][列下标];
初始化:int arr[3][3]={1,2,3,4,5,6,7,8,9};
int arr[ ][3]={1,2,3,4,5,6,7,8,9};
行下标是可以省略的 但列下标不能省
一列可以是多个数 所以不能反过来
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
这种表示可以视为三个一维数组
在内存中是一行一行的存
三、注释
(1) //.........;
单行注释,可以独占一行,也可以跟在执行语句之后
但"//"之后的内容,不能编译执行
规定:
注释内容放在被注释的上一行
或者行末(如 上图程序注释部分所示)
(2) /*...........*/:
多行注释 注释大段代码也就是注释代码块