自己看码源1

补充1.

问题探究:没有关闭黑屏显示 

1.字符串同时向中间靠拢

2.不可循环错误码

<1>.码一中错误:"="不能用于比较两个字符串是否相等,可用库函数strcmp

<2>.码二问题:只能循环1次

解决方案:开头加入#define _CRT_SECURE_NO_WARNINGS后删去scanf_s

原因探讨:设想scanf_s与VS2013对应性

3.问题代码(算最大公约数)

(问题无法算出最大公约数)

 错误一:scanf函数格式错误,未输入取地址符号

错误二:逻辑错误c=a%b应写为c=b

问题三:没有必要比大小,太复杂

int main()
{
	int a;
	int b;
	int c;
	scanf("%d%d", &a, &b);
	/*if (m < n)
		m = n;*/
	while (a%b)
	{
		c = a%b;
		a = b;
		b = c;

	}
	printf("%d", c);
	return 0;

}

结果:

4.

问题:文件名.cpp结束

解决方案:文件名以.c结束

5.代码确定从1到100中9的个数

(if,else  if)与(if,if)区别

 

问题探究:第一种是并列关系

                 第二种是递进关系 

6错误代码(计算1/1+1/2+1/3+...+1/99+1/100的值)

 错误原因:sum在累加后变化,sum=1/100取整为0

7.优化代码

 优化:max最初赋值不应为0;而是应为数组中一个数,可假设为arr[0]

8.数据表格空格对齐

%2d(右对齐)打印两位,如果不够两位用空格补齐

%-2d(加负号左对齐) 打印两位,如果不够两位用空格补齐

9.错误代码(猜数字游戏)

 错误一:swich拼写错误,应为switch

错误二:作用域,input在花括号内定义,应在外围定义

错误三:后面注释漏了一个}没有注释

10.(补充9)随机数概念

时间戳:当前计算机当前时间-计算机起始时间(1970.1.1.0:0:0)=(xxxx)秒

 此代码问题:给出值不随机

解决方法:在工程里只调用多次scanf函数(rand生成从0到32737的数)

game()
{
	printf("猜数字\n");
	int ret = 0;
	
	ret=rand();
	printf("%d\n",ret);
}
 //NULL:空指针
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
    do
	{
		printf(" play press 1 or exit press 0\n");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("输入错误\n");
				break;
		}
	} while (input);
	return 0;
}

 代码改进<1>:(目标)改为生成1到100之间的随机数

将ret=rand();改为ret = rand() % 100+1;【{ret = rand() % 100}表示0到99的数字】

 代码改进<2>:(目标)改为每次猜数生成随机数不变

提出问题:(问题代码)

 game()
{
	printf("猜数字\n");
	int ret = 0;
	int guess = 0;
	ret = rand() % 100;
	//scanf("%d", &ret);
	//printf("%d\n",ret);
	while (1)
	{
		scanf("%d", &ret);
		if (guess > ret)
			printf("猜大了\n");
		else if (guess < ret)
			printf("猜小了\n");
		else
		printf("猜对了,结果是:%d\n", ret);
		break;
	}
}
 //NULL:空指针
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
    do
	{
		printf(" play press 1 or exit press 0\n");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("输入错误\n");
				break;
		}
	} while (input);
	return 0;
}

问题:<1>每次输入所猜数字后,都要重新判断"play press 1 or exit press 0"

问题一:&ret应写为&guess(在【ret = rand() % 100】ret已经完成赋值,在此使用guess重复赋值)

问题二:不加花括号{ }出现

                加花括号:

《援引李哥》:括起来,它就包含了这两行代码

                 不括起来,它就只包含printf那一行代码,他这儿的break,就一定会执行到,然后就会结束当前循环。

****解决后代码及结果

game()
{
	printf("猜数字\n");
	int ret = 0;
	int guess = 0;
	ret = rand()%100+1;
	//scanf("%d", &ret);
	//printf("%d\n",ret);
	while (1)
	{
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了,结果是:%d\n", ret);
			break;
		}
	}
}
 //NULL:空指针
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
    do
	{
		printf(" play press 1 or exit press 0\n");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("输入错误\n");
				break;
		}
	} while (input);
	return 0;
}

 &&回顾反思:这个代码需重复回答”play press 1 or exit press 0“

如何修改成一个只玩一次后停止的程序(****感谢苏铭宇先生的友情帮助)

援引苏铭宇先生:“在swich所在大括号外加入break即可”

输出结果为:

11.自编函数(自编strcpy函数)

my_strcpy(char* dest, char*src)
{
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;
}
int main()
{
	char arr1[] = "###########";
		char arr2[] = "bit";
		my_strcpy(arr1, arr2);
		printf("%s\n", arr1);
		return 0;
}

代码优化

角度一:

*dest = *src;
        src++;             可优化为*dest ++= *src++;(先=后++
        dest++;

角度二:

while (*src != '\0')
    {                                        while(*dest ++= *src++)   
        *dest = *src;                   {
        src++;              可优化为     ;
        dest++;                           }
    }                                        (解释:*dest ++= *src++;先后执行#=b,#=i,#=t,#=\0,但是由于\0的
    *dest = *src;                        ASCII值为0,0放在此进行条件判断为假,停止循环

角度三:(规避错误)

避免传入空指针,

while (*dest++ = *src++)
	{
		;
	}

 前加入条件变为:

 角度四:(利用assert断言)改后为

my_strcpy(char* dest, char*src)
{
	assert(dest != NULL);
	assert(src != NULL);
		while (*dest++ = *src++)
		{
			;
		}
	
}

优点:发现问题后展示问题,指出哪里有问题,便于程序员解决问题

角度五:

补:先引入一个基本代码(const修饰指针变量)

<1>const放在指针变量的*左边时

解释: const放在指针变量的*左边时,修饰的是*p,也就是说,不能通过p来改变*p(num)的值。

<2>const放在指针变量的*右边时

 解释: const放在指针变量的*右边时,修饰的是p

 接着说角度五:

 在“char*src”前加const(那么*src的值不会改变),即使后面函数中*dest与*src位置写反就会报错,及时发现问题。

改后为:

 角度六:

 在“my_strcpy(char* dest, const char*src)”前加char*,使函数有返回值(4个改动

char* my_strcpy(char* dest, const char*src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
		while (*dest++ = *src++)
		{
			;
		}
		return ret;//返回被改变数组的起始地址
}
int main()
{
	char arr1[] = "###########";
		char arr2[] = "bit";
		printf("%s\n", my_strcpy(arr1, arr2));//通过返回的起始地址打印被改变数组
		return 0;
}

13.自编函数(strlen函数)


char* my_strlen(const char* str)
{
	int count=0;
	assert(str!=NULL);
	while (*str!='\0')
	{ 
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcde";
	int len = my_srtlen(arr);
	printf("%d\n",len);
	return 0;
}

报错:

问题: 两个写的不一样,应改为相同的(无法解释的外部符号:要不函数没有定义,要不定义了名字写错了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值