练习2-1
#include <stdio.h>
#include <time.h>
int sleep(unsigned long x)
{
clock_t c1 = clock(), c2;
do {
if ((c2 = clock()) == (clock_t)-1) //在这里要记住“==”优先级高于“=”
return 0;
} while (1000.0*(c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
int main(void)
{
int i;
clock_t c;
for (i = 10; i > 0; i--) {
printf("\r%3d", i);
fflush(stdout);
sleep(1000);
}
printf("\r\aFIRE!!!\n");
c = clock();
printf("程序开始后经过了%.1f秒。\n", (double)c / CLOCKS_PER_SEC);
printf("程序开始后经过了%d时钟。\n", c); //在这里使用时钟表示时间
return 0;
}
练习2-2
strlen()函数和sizeof求字符串长度需要注意下面几点:
1. strlen函数求得的字符串长度是从字符串第一个元素到第一个'\0'之间元素的个数(如果字符串中间有'\0',则结果不是整个字符串的长度),同时不包括该'\0'
2. sizeof求得的结果是存储该字符串的变量占用的空间大小,因而一定会包括'\0'.若'\0'后还有空余的空间,也会包含到结果里面
解释(与2种求值方式的实现原理有关):
1. strlen()的一种实现就是遍历字符串,遇到'\0'就终止,因而返回的结果是第一个'\0'前字符元素的个数
2. sizeof 常用来求变量占用内存空间的大小,因而它返回的是存储字符串的变量所占用的内存空间大小,用来求字符串的长度,只在特定情况下可行,即字符数组刚好被一个字符串占满
#include <time.h>
#include <stdio.h>
#include <string.h>
int sleep(unsigned long x)
{
clock_t c1 = clock(), c2;
do {
if ((c2 = clock()) == (clock_t)-1)
return 0;
} while (1000.0*(c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
void gput(const char *s, int speed)
{
int a = strlen(s), i; //第一遍用sizeof()写的,没有实现功能
for (i = 0; i < a; i++) {
printf("%c", s[i]);
fflush(stdout);
sleep(100);
}
}
int main (void)
{
char str[64];
printf("请输入字符串:");
scanf("%s", str);
gput(str, 100);
return 0;
}
练习2-3
#include <time.h>
#include <stdio.h>
#include <string.h>
int sleep(unsigned long x)
{
clock_t c1 = clock(), c2;
do {
if ((c2 = clock()) == (clock_t)-1)
return 0;
} while (1000.0*(c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
void bput(const char *s, int d, int e, int n)
{
int i;
for (i = 0; i < n; i++) {
printf("\r");
printf("%s", s); //显示字符串
sleep(d); //字符串显示d毫秒
printf("\r"); //光标回到最左端
printf(" "); //字符串消失
sleep(e); //字符串消失e毫秒
}
}
int main(void)
{
char str[] = "ABCDEFGH";
bput(str, 1000, 1000, 5);
return 0;
}
练习2-4
我在本题设置循环次数n时遇到了难题,先使用的是for语句,效果不好;后改为do(while)实现了功能。
#include <stdio.h>
#include <time.h>
#include <string.h>
int sleep(unsigned long x)
{
clock_t c1 = clock(), c2;
do {
if ((c2 = clock()) == (clock_t)-1)
return 0;
} while (1000.0*(c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
void telop(const char *s, int direction, int speed, int n)
{
int i, j, k = 0;
int cnt = 0;
int str_len = strlen(s);
do{
printf("\r"); //光标回到本行开头
for (j = 0; j < str_len; j++) {
if (cnt + j < str_len)
putchar(s[cnt + j]);
else
putchar(s[cnt + j - str_len]);
}
fflush(stdout);
sleep(speed);
if (direction == 1)
{
if (cnt > 0)
cnt--;
else
cnt = str_len - 1;
}
else
{
if (cnt < str_len - 1)
cnt++;
else
cnt = 0;
}
k++;
} while (k < n);
}
int main(void)
{
int model;
char string[] = "ABCDEFGH";
printf("请选择字幕滚动模式:(1)从左往右滚(0)从右往左滚:");
scanf("%d", &model);
telop(string, model, 1000, 10);
return 0;
}
练习2-5
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int stage;
int i;
int a, b, c;
int x;
int n;
int start_time[5], end_time[5]; //建立两个数组分别记录下每次运算的起始时钟和终止时钟
clock_t start, end;
clock_t start_per_time, end_per_time; //每次心算时刻的起始时钟和终止时钟
srand(time(NULL)); //设置随机数的种子
printf("扩大视野心算训练开始!!!\n");
start = clock();
for (stage = 0; stage < 5; stage++) {
a = 10 + rand() % 90;
b = 10 + rand() % 90;
c = 10 + rand() % 90;
n = rand() % 17; //生成0~16随机数
printf("%d%*s+%*s%d%*s+%*s%d: ", a, n, "", n, "", b, n, "", n, "", c);
start_per_time = clock();
start_time[stage] = start_per_time;
do {
scanf("%d", &x);
if (x == a + b + c)
break;
printf("回答错误。请从新输入。");
} while (1);
end_per_time = clock();
end_time[stage] = end_per_time;
}
end = clock();
printf("%d次运算用时%.1f秒。\n", 5, (double)(end - start) / CLOCKS_PER_SEC);
for (i = 0; i < 5; i++) {
printf("第%d次运算共用时%.1f秒\n", i + 1, (double)(end_time[i] - start_time[i]) / CLOCKS_PER_SEC);
}
printf("平均每次用时%.1f秒\n", (double)(end - start) / (CLOCKS_PER_SEC * 5));
return 0;
}
练习2-6
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
srand(time(NULL));
int a, b; //两个随机数,对应+与-
int i, j, k; //三个随机数,用于加法减法运算
a = rand() % 2; //生成0与1随机数,0对应“-”,1对应“+”
b = rand() % 2;
i = 10 + rand() % 90; //随机生成10~99之间的整数
j = 10 + rand() % 90;
k = 10 + rand() % 90;
printf("i=%3d,j=%3d,k=%3d\n", i, j, k);
if (a == 0 && b == 0)
printf("i-j-k=%d\n", i - j - k);
else if (a == 1 && b == 1)
printf("i+j+k=%d\n", i + j + k);
else if(a==1&&b==0)
printf("i+j-k=%d\n", i + j - k);
else
printf("i-j+k=%d\n", i - j + k);
return 0;
}