补充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;
}
报错:
问题: 两个写的不一样,应改为相同的(无法解释的外部符号:要不函数没有定义,要不定义了名字写错了)