嵌入式学习DAY5 -- C语言(输入输出占位符,循环,以及重点讲解一维数组)

嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY5

man手册:
共9章:
关心前三章即可:
第一章:shell命令
第二章:系统调用函数
第三章:库函数

逗号运算符:
格式:
表达式1,表达式2,表达式3.。。。。。,表达式N
运算法则:从左至右,依次执行每一个表达式,并且将最后一个表达式的结果作为整个逗号表达式结果

#include <stdio.h>

int main()
{
	int a = 2,b = 4,c = 1;
	int d = (a++,--b,++c);
	printf("b = %d\n",++b);
	a--;
	printf("a = %d\tb = %d\tc = %d\n",a,b,c);
	return 0;
}


输入输出函数:
输入:从键盘拷贝数据到内存中去
输出:从内存中拷贝数据至显示终端

标准输入输出:对于数据类型没有限制

输出: printf
格式: printf(“格式控制串”,输出表):

对于格式控制串的说明:
占位符:
%o —>打印八进制数据
%x —>打印十六进制数据(打印出的十六进制是小写字母)
%X —>会以大写的方式打印十六进制
%#o----> 打印时自动在八进制前面添加前导符0 —》(意味着#是一个前导符)
%#x / %#X
%d —>int
%hd —>short
%ld —>long (long int)
%lld —>long long (long long int)
%c ---->char
%f —>float
%lf —>double
%p —>打印地址
%s —> 打印字符串
%e —>以指数形式打印
%g ----> 会自动选择以最短的方式去打印数据
%Md ---->注意:M是域宽,代表所需要打印的数据所占的长度
%M.Nf —>M代表域宽(包含小数点在内),N代表小数点后的位数

int main()
{
	int aa = 100000;
	long num = 8;
	short num2 = 90;
	char ch = 'L';
	char str[20] = {"wangjia"};
	float s = 8.25;
	printf("aa = %-3d",aa);
	printf("%ld\n",num);
	printf("%hd\n",num2);
	printf("%c\n",ch);
	printf("%s\n",str);
	printf("%e\n",s);
	printf("%g\n",s);//以最短的方式打印该数据
	printf("----------------------\n");
	printf("%#o\n",aa);
	printf("%#x\n",aa);
	printf("------------------\n");
	printf("%8.4f\n",s);
	printf("%2.1f\n",s);
	return 0;
}


输入:scanf
格式:scanf(“格式控制串”,地址表);

*:
(1)乘号
(2)抑制符 —》抑制一个字符或者一个整形数不被读取
(3)标志(指针)
(4)取值运算符

#include <stdio.h>

int main()
{
	char num1,num2;
	//int num1,num2;
	printf("请输入:\n");
	scanf("%c",&num1);
	char ch = getchar();
	putchar(ch);
	scanf("%c",&num2);
	printf("num1 = %c\tnum2 = %c\n",num1,num2);
	putchar(97);
	putchar('\n');
	return ;
}

获得一个字符:
getchar();
功能:从键盘获得一个字符,至于用不用该字符取决于自己(如果用的话,直接将其赋值给字符变量即可)
不用则相当于吃掉一个字符;
—》可以用来作为吸收垃圾字符
输出一个字符:
putchar();
功能:输出一个字符
参数:可以为变量或者ASCII值或者为字符常量


循环:
while循环格式:
while(表达式)
{
循环体;
条件更新;
}


do…while循环格式:
do
{
循环体;
条件更新;
}while(表达式);

练习
求1-100之内所有偶数的和并进行输出

#include <stdio.h>


int main()
{
	//求1-100之内所有偶数的和并进行输出
	//定义一个循环变量
	int i = 1;
	int sum = 0;
	/*
	while(i<=100)
	{
		//判断当前数字是否为偶数
		if(0 == i%2)
		{
			sum+=i;//sum = sum+i;
		}
		i++;
	}
	*/

	do
	{
		if(0 == i%2)
		{
			sum += i;
		}
		i++;
	}while(i<=100);

	printf("sum = %d\n",sum);
	return 0;
}

总结:
do while 和while的区别:

do…while至少被执行1次
while至少被执行0次


break和continue:
break:结束本次循环
continue:结束本层循环,立即进入下一层循环

#include <stdio.h>

int main()
{
	int i;
	for(i=0;i<10;i++)
	{
		printf("ahahhahaha\n");
		if(5 == i)
		{
			break;//可以尝试在这里把break换成continue看一下区别,加深记忆!
		}
		static int a = 10;
		++a;
		printf("i = %d\ta = %d\n",i,a);
	}
	return 0;
}

练习:
用while循环实现一个简易计算器

#include <stdio.h>


//菜单函数
void menu()
{
	printf("+ -------- 加法\n");
	printf("- -------- 减法\n");
	printf("* -------- 乘法\n");
	printf("/ -------- 除法\n");
}
int main()
{
	//实现一个简易计算器
	int argc1,argc2;
	while(1)
	{
		menu();
		printf("请输入需要计算的两个数字:\n");
		scanf("%d%d",&argc1,&argc2);
		printf("请输入需要进行的操作数:\n");
		char op;
		getchar();//吸收一个垃圾字符,不回显
		scanf("%c",&op);
		if('q' == op)
		{
			printf("退出程序成功!\n");
			break;
		}
		switch(op)
		{
			case '+':
				printf("add = %d\n",argc1+argc2);
				break;
			case '-':
				printf("sub = %d\n",argc1-argc2);
				break;
			case '*':
				printf("mul = %d\n",argc1*argc2);
				break;
			case '/':
				printf("div = %d\n",argc1/argc2);
				break;
			default:
				printf("输入有误,请重新输入!\n");
		}
	}
	return 0;
}


数组:一组有序且相同类型元素的集合
数组的特点:
(1)内存连续
(2)元素数据类型相同

定义格式:
存储类型 数据类型 数组名[元素个数];
分析:
存储类型:决定了开辟存储连续元素的内存区域
数据类型:数组元素的数据类型
数组名:标志这一片连续空间的名字
元素个数:说明分配某种数据类型元素空间的个数
注意:元素个数可以写成常量或者宏均可,建议写成宏(方便修改空间大小)
元素个数不可以写成变量,因为变量具有不确定性(定义意味着分配空间)

如何访问数组中的元素?
—》
数组名[下标];

测试:
定义一个可以存放5个整形元素的一维数组。
//int arr[5];

#define N 5
int arr[N];//定义意味着分配空间,此时编译器会分配一片含有sizeof(int)*N 个字节的空间
—>访问数组中的每一个元素值?
—》arr[0],arr[1],arr[2],arr[3],arr[4]


初始化:
对于数组的初始化:int arr[5] = {1,2,3,4,5}; //正确的


不能这样去赋值:
int arr[5];
arr[5] = {1,2,3,4,5}; //错误的


int arr[5];
int i;
for(i=0;i<5;i++)
{
scanf("%d",&arr[i]); —>正确的
}

#include <stdio.h>

#define N 5
int main(int argc, const char *argv[])
{
	//定义一个含有5个整形元素的数组
	int arr[] = {1,2,3};
	printf("sizeof(arr) / sizeof(int) = %d\n",sizeof(arr)/sizeof(int));
	//printf("sizeof(arr) = %d\n",sizeof(arr));
	//printf("sizeof = %d\n",sizeof(int)*N);
	//arr[N] = {1,2,3,4,5};--->错误的
	
	int i;
	/*
	printf("please input arrValues:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&arr[i]);
	}
	*/
	printf("output is:\n");
	for(i=0;i<N;i++)
	{
		printf("arr[%d] = %d\n",i,arr[i]);
	}
	/*
	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]);
	*/
	return 0;
}


总结:
(1)对于数组的输入和输出要利用循环完成
(2)如果数组是满初始化时,则打印数组数组会按照原样输出
(3)如果数组部分初始化,则剩余未被赋值的元素会自动补0
(4)如果想要清空一个数组,则可以利用第三条:int arr[5] = {0};
(5)一维数组中的元素个数可以被省略不写,当被省略时,则会根据后面所赋值的元素个数来决定到底省略的元素个数是谁.


冒泡排序:
从左到右,两两依次进行比较,假设按照从小到大排序,则:
如果左边大于右边,则进行交换,否则不交换,继续往后进行比较

#define N 5
int arr[N] = {89,32,12,78,61};

第一趟:32,12,78,61,89
第一次:32,89,12,78,61
第二次:32,12,89,78,61
第三次:32,12,78,89,61
第四次:32,12,78,61,89

第二趟:12,32,61,78,89
第一次:12,32,78,61,89
第二次:12,32,78,61,89
第三次:12,32,61,78,89

第三趟:12,32,61,78,89
第一次:12,32,61,78,89
第二次:12,32,61,78,89

第四趟:12,32,61,78,89
第一次:12,32,61,78,89

伪代码:
第一趟:

 for(i=0;i<N-1;i++)
	  {
		if(arr[i] > arr[i+1])
		{
			//定义一个中间变量(临时变量)
			int Temp;
			Temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = Temp;
		}
	  }

第二趟:

  for(i=0;i<N-2;i++)
	  {
		if(arr[i] > arr[i+1])
		{
			//定义一个中间变量(临时变量)
			int Temp;
			Temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = Temp;
		}
	  }

第三趟:

  for(i=0;i<N-3;i++)
	  {
		if(arr[i] > arr[i+1])
		{
			//定义一个中间变量(临时变量)
			int Temp;
			Temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = Temp;
		}
	  }

第四趟:

 for(i=0;i<N-4;i++)
	  {
		if(arr[i] > arr[i+1])
		{
			//定义一个中间变量(临时变量)
			int Temp;
			Temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = Temp;
		}
	  }

将以上四趟进行综合:
伪代码:

//定义两个循环变量
int i,j;
//第一个for循环用来控制趟数
for(i=0;i<N-1;i++)
{
	//这个for循环用来控制每一趟里面所需要进行交换的次数
	for(j=0;j<N-1-i;j++)
	{
		if(arr[j] > arr[j+1])
		{
			int Temp;
			Temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = Temp;
		}
	}
}

完整的冒泡排序写法:

#include <stdio.h>

#define N 5
int main()
{
	//定义一个一维数组,用来实现冒泡排序
	int arr[N] = {0};

	int i,j;
	printf("请输入%d个数组元素值:\n",N);
	for(i=0;i<N;i++)
	{
		scanf("%d",&arr[i]);
	}
	
	printf("排序之前为:\n");
	for(i=0;i<N;i++)
	{
		printf("%d ",arr[i]);
	}
	//printf("\n");
	putchar('\n');

	printf("冒泡中......\n");
	//第一个for循环用来控制所需趟数
	for(i=0;i<N-1;i++)
	{
		//第二个for循环用来控制每一趟里面所需要交换的次数
		for(j=0;j<N-1-i;j++)
		{
			if(arr[j] > arr[j+1])
			{
				int Temp;
				Temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = Temp;
			}
		}
	}
	printf("冒泡之后按照从小到大的顺序为:\n");
	for(i=0;i<N;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;
}


一维字符数组:

//定义一个可以最大存放20个字符的一维数组?
#define N 4
char str[N] = {‘g’,‘a’,‘g’,’\0’};
char str[N] = {“gaga”};
char str[N] = “gaga”;

字符串相关的输入输出函数:
简易版:
gets(数组名);
puts(数组名);

#include <stdio.h>

#define N 7
int main()
{
	char str[N] = {'\0'};
	//char str[N] = {0};
	scanf("%s",str);
	//gets(str);
	//printf("%s\n",str);
	puts(str);
	return 0;
}

总结:
gets和scanf的区别:
gets可以获得一个带有空格的字符串,只有遇到回车才代表输出结束
scanf不可以获得带有空格的字符串,遇到空格,回车均代表输入结束

puts和printf的区别:
puts会自带换行
printf不会自带换行,需要手动添加’\n’

作业:
1,完成求100-200之间的所有素数,并求其和进行输出

#include <stdio.h>

int main()
{
	//实现100-200之间的所有素数并求和
	int i,j;
	int sum = 0;
	for(i = 100;i<=200;i++)
	{
		for(j=2;j<=i;j++)
		{
			if(0 == i%j)
			{
				break;
			}
		}
		if(j == i)
		{
			sum+=i;
			printf("%d\n",i);
		}
	}
	printf("sum = %d\n",sum);
	return 0;
}

2,完成求一个整形数组的最大值

#include <stdio.h>

#define N 5

int main()
{
	//实现求一维整形数组中的最大值
	int arr[N] = {0};
	int i;
	for(i=0;i<N;i++)
	{
		scanf("%d",&arr[i]);
	}
	//假设数组中的首元素为最大值
	int Max = arr[0];
	for(i=1;i<N;i++)
	{
		if(Max < arr[i])
		{
			Max = arr[i];
		}
	}
	printf("Max = %d\n",Max);
	return 0;
}

3,求一维整形数组中的次大值

#include <stdio.h>

int main()
{
	int arr[5] = {0};
	int i;
	for(i=0;i<5;i++)
	{
		scanf("%d",&arr[i]);
	}
	//定义两个存放最大值和次大值的变量
	int Max,Mid;
	//给Max和Mid进行赋值,用前两个进行比较得出最大值和次大值
	if(arr[0] > arr[1])
	{
		Max = arr[0];
		Mid = arr[1];
	}
	else
	{
		Max = arr[1];
		Mid = arr[0];
	}
	//定义循环从下标等于2开始变化
	for(i=2;i<5;i++)
	{
		//当该值比最大值大时
		if(arr[i] > Max)
		{
			//先将Max赋值给Mid
			Mid = Max;
			Max = arr[i];
		}
		//当该值比最大值小但是比次大值大
		else if(arr[i] > Mid)
		{
			Mid = arr[i];
		}
	}
	//输出最大值和次大值
	printf("Max = %d\tMid = %d\n",Max,Mid);
	return 0;
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值