C语言实现计算器

运算速度是线性级,而且只用一个数组占用空间也比较少,可能需要的逻辑比较复杂。但是能够解决问题。实现了不带括号的所有加减乘除运算。

具体的思想:首先定义好3个存储数字变量,3个存储符号的变量,因为在四则运算中必须判断第2个有时候第三个符号后才能做出计算。然后判断完之后,将其计算出来。每次根据符号做出结果,最多判断3次符号。

代码可能比较多,但是速度特别快

int Get_number(char *str)
{
	int first_1 = 0;
	int second_2 = 0;
	int three_3 = 0;
	int sum = 0;
	int t = 0;
    int num_i = 0; //记录位数
	int i = 0; 
	char *sign_init = str;
	char *sign_num = sign_init; //获取数字
	char *sign_first = sign_init;  //记录第一个符号位置
	int pop_num = 0;
	char *sign_second = sign_init; //记录第二个符号位置
	char *sign_three = sign_init;
	while(*str != '\0')
	{
		
		if(*sign_first >= '0' && *sign_first <= '9')
		{
					 while(*str >= '0' && *str <= '9')
					 {
						 str++;
						 num_i++;
					 } // 一直获取数字
					 sign_first = str; // 获取符号的时候位置
					 sign_num = str;
					 sign_num--;
					 if(num_i == 1)  // 一位时候直接转换
					 {
						 pop_num = char_to_int(*sign_num);   //先化为int
						 first_1 = pop_num; 
						 
					 }else   //多位时候转换
					 {
							 for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
							{
							 pop_num = char_to_int(*sign_num);   //先化为int
							 first_1 += change_number_place(pop_num , i); 
								sign_num--;
							}	
					} 
				 num_i = 0;
				 //获取符号前面的一个数 frist_1 的到第一个数
		}

     else if(*sign_first == '+' || *sign_first == '-') // 如果是第一个为加号减号
		 {
			 
			 	 if(*sign_second >= '0' && *sign_second <= '9')
						 {
										if(!(*str >= '0' && *str <= '9'))
										 {
										
												str++;
												while(*str >= '0' && *str <= '9')
												{
												 str++;
												 num_i++;
												}
												sign_second = str ;//记录第二次
												sign_num = str;  //记录符号位置继续获取第二个数
												sign_num--;				
														 if(num_i == 1)  // 一位时候直接转换
															{
																pop_num = *sign_num - '0';   //先化为int
																second_2 = pop_num; 
											 
															}else   //多位时候转换
															{
																for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		second_2 += change_number_place(pop_num , i); 
																	sign_num--;
																}	

															}
													num_i = 0;
										 }
						 }
					
				if(*sign_second == '+' || *sign_second == '-') // 如果是加号或减号,first_1就可以合并
				{
					
					if(*sign_first == '+')
					{
						first_1 = first_1 + second_2;
						second_2 = 0;
						
					}else if(*sign_first == '-')
					{
						first_1 = first_1 - second_2;
						second_2 = 0;
					}
					
					if(*sign_three >= '0' && *sign_three <= '9')
					{
						if(!(*str >= '0' && *str <= '9'))
							{
								str++; //合并后取第二个符号后面的数,也就是第三个数
							while(*str >= '0' && *str <= '9')  //取第三个数
											{
											 str++;
											 num_i++;
											}
											sign_num = str; //取第三个数
											sign_three = str;//取完数之后,指针移到了第3个数后面的那个符号
											sign_num--;				
													 if(num_i == 1)  // 一位时候直接转换
														{
															pop_num = *sign_num - '0';   //先化为int
																three_3 = pop_num; 
										 
														}else   //多位时候转换
														{
															for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
															{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		three_3 += change_number_place(pop_num , i); 
																    sign_num--;
															}	

									 }
									 num_i = 0;//取完第三个数,指针移到第2个数后面的符号
							}
					}
					
					
							 if(*sign_three == '=')//如果第三位是等于号例如:1+2+3= 或 1+2-3=
							 {
			           if(*sign_second == '+')
								 {
									 sum = first_1 + three_3;
									 return sum;
								 }else if(*sign_second == '-')
								 {
									 sum = first_1 - three_3;
									 return sum;
								 }
							 }else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
							 {
								 //如果第三个为加减号时候,第一个不动,其他移动
								 if(*sign_second == '+')
								 {										
									   sum = first_1 + three_3;
										 first_1 = sum; 
								     sign_first = sign_three;
								     second_2 = 0;
								     sign_second = sign_init;
								     three_3 = 0;
								     sign_three = sign_init;
									 
								 }else if(*sign_second == '-')
								 {
									   sum = first_1 - three_3;
										 first_1 = sum; 
								     sign_first = sign_three;
								     second_2 = 0;
								     sign_second = sign_init;
								     three_3 = 0;
								     sign_three = sign_init;
								 }

							 }else if(*sign_three == '*' || *sign_three == '/')
							 {
										sign_first = sign_second;
								    second_2 = three_3;
								    sign_second = sign_three; 
                    three_3 = 0;
								    sign_three = sign_init;
							 }
				}
				
				
	    else if((*sign_second == '*' || *sign_second == '/'))//如果二个符号是 * 或者 /
				{
								if(!(*str >= '0' && *str <= '9'))
								{
									      str++;//第二个符号后面的数,也就是第三个数
												while(*str >= '0' && *str <= '9')
												{
												 str++;
												 num_i++;
												}
												sign_num = str; //取第三个数
												sign_three = str;//记录第三个数后面的符号
												sign_num--;				
														 if(num_i == 1)  // 一位时候直接转换
															{
																pop_num = *sign_num - '0';   //先化为int
																	three_3 = pop_num; 
											 
															}else   //多位时候转换
															{
																for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																{
																		pop_num = char_to_int(*sign_num);   //先化为int
																		three_3 += change_number_place(pop_num , i); 
																		sign_num--;
																}	

										 }
										 num_i = 0;//取到第三个数
								}
												
								
							 if(*sign_second == '*') //合并后面的运算 first_1 保留数据,second_2 和 three_3 合并;
							 {
								 second_2 = second_2 * three_3;
								 three_3 = 0;
								 sign_second = sign_init;
								 
							 }else if(*sign_second == '/')
							 {
								 second_2 = second_2 / three_3;
								 sign_second = sign_init;
								 three_3 = 0;
							 }
	             
							 if(*sign_three == '=') //如果第3个标记是 = 也就是 1+2*3= 或者 1+2/3= 的
							 {
			           if(*sign_first == '+')
								 {
									 sum = first_1 + second_2; //得出结果
									 return sum;
								 }else if(*sign_first == '-')
								 {
									 sum = first_1 - second_2;
									 return sum;
								 }
								 
							 }else if(*sign_three == '+' || *sign_three == '-')//如果不是等于号需要重新分配了
							 {
								
									  if(*sign_first == '+')
										{
										first_1 = first_1 + second_2;
										sign_first = sign_three;
										second_2 = 0;
										sign_second = sign_init;
										three_3 = 0;
										sign_three = sign_init;
										}else if(*sign_first == '-')
										{
										first_1 = first_1 - second_2;
										sign_first = sign_three;
										second_2 = 0;
										sign_second = sign_init;
										three_3 = 0;
										sign_three = sign_init;											
										}
								 
							 }else if(*sign_three == '*' || *sign_three == '/')
							 {
								  sign_second = sign_three;
								  three_3 = 0;
									sign_three = sign_init;
							 }
				}
				
				
				
				else if(*sign_second == '=') //如果第二位就是等于号,那就直接运算了
				{
					if(*sign_first == '+')
					{
						sum = first_1 + second_2;
						return sum;
					}else if(*sign_first == '-')
					{
						sum = first_1 - second_2;
						return sum;
					}else if(*sign_first == '*')
					{
						sum = first_1 * second_2;
						return sum;
					}else if(*sign_first == '/')
					{
						sum = first_1 / second_2;
						return sum;
					}
				}
		 }
		 else if (*sign_first == '*' || *sign_first == '/')
		 {
					 if(*sign_second >= '0' && *sign_second <= '9')
					 {
												if(!(*str >= '0' && *str <= '9'))
												 {
														 str++;
														while(*str >= '0' && *str <= '9')
														{
														 str++;
														 num_i++;
														}
														sign_second = str ;//记录第二次
														sign_num = str;  //记录符号位置继续获取第二个数
														sign_num--;				
																 if(num_i == 1)  // 一位时候直接转换
																	{
																		pop_num = *sign_num - '0';   //先化为int
																			second_2 = pop_num; 
													 
																	}else   //多位时候转换
																	{
																		for(i = 1 ; i <= num_i ; i++) //位数是几 num_i 就是几
																		{
																									pop_num = char_to_int(*sign_num);   //先化为int
																									second_2 += change_number_place(pop_num , i); 
																			sign_num--;
																		}	

																	}
															num_i = 0;
												 }
					 }

					 
					 if(*sign_first == '*')
					 {
						 first_1 = first_1 * second_2;
						 sign_first = sign_second;
						 second_2 = 0;
						 sign_second = sign_init;
						 
						 
					 }else if(*sign_first == '/')
					 {
						 first_1 = first_1 /second_2;
						 sign_first = sign_second;
						 second_2 = 0;
						 sign_second = sign_init;
					 }
			  
		 }
		 else if(*sign_first == '=')
		 {
			 sum = first_1;
			 return sum;
		 }
	}
	
	return sum;
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值