C语言日记③-分支和循环
Micah Two

c语言是一门结构化的程序设计语言

  • 顺序结构
  • 选择结构
  • 循环结构

if选择

与java一致

题目:
判断一个数是否为奇数
输出100以内的奇数

image

1
2
3
4
5
6
7
8
9
int main() {
for (size_t i = 0; i < 100; i++)
{
if (i % 2 != 0) {
printf("%d\n", i);
}
}
return 0;
}

switch选择

与java一致

给个数,判断是星期几

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
printf("%s\n", "星期一");
break;
case 2:
printf("%s\n", "星期二");
break;
case 3:
printf("%s\n", "星期三");
break;
case 4:
printf("%s\n", "星期四");
break;
case 5:
printf("%s\n", "星期五");
break;
case 6:
printf("%s\n", "星期六");
break;
case 7:
printf("%s\n", "星期七");
break;
default:
break;
}

控制台与char

getchar()从控制台获取一个字符的ASCII码
putchar(ASCII码 )从控制台打印一个char

循环打印,除了ctrl+z
ctrl+z 会获取一个EOF

1
2
3
4
5
int charn = getchar();
while ((charn=getchar())!=EOF) {
putchar(charn);
}

有时候getchar 会读取到\n
这时候需要清空缓冲区
再来一次
getchar()

getchar 只能读取一个字符 scanf 不会读取到空格

for循环

与java一致,不可foreach

有趣的for代码:
1.

1
2
3
for (;;) {
printf("呵呵\n");
}

死循环 一直输出呵呵

for循环的初始化,调整,判断都可以省略
但是判断省略循环条件就一直为真

1
2
3
4
5
6
7
8
9
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("呵呵\n");
}
}

这个代码会输出多少个哈哈呢?

答案是:10个
image

为什么呢?

因为第一次i的for循环的时候j已经变为10了,此时进行第二次i循环,j不会重新变成0,j部分直接跳过

循环题目

计算一个数的阶乘
阶乘计算公式为 !n=1*2*3*4...*n

1
2
3
4
5
6
7
8
int num = '0';
scanf("%d", &num);
int count = 1;
for (size_t i = 1; i < num+1; i++)
{
count *= i;
}
printf("%d\n", count);

计算1!+2!+3!…+10!

1
2
3
4
5
6
7
8
9
10
11
12
int result = 0;
for (size_t i = 0; i <= 10; i++)
{
int count = 1;
for (size_t j = 1; j < i+1; j++)
{
count *= j;
}

printf("%d--%d\n", i,count);
result += count;
}

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int binsearch(int x,int *v, int n) {
//这里注意一下,传递过来的数组长度是不能计算的,贼坑
//int length = sizeof(v) / sizeof(v[0]);
int result = -1;
for (size_t i = 0; i < n; i++)
{
if (x == v[i])
result = v[i];
if (i==n-1)
{
break;
}
}
return result;
}


main:

int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14 };
int result = binsearch(13,arr,100);

printf("%d\n", result);

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
for (size_t i = 0; i < 10; i++)
{
if (i == 9)
break;
if (i != 9)
printf("\n");
for (size_t j = 0; j < i; j++)
{
printf(" ");
}
for (size_t j = 10; j > i; j--)
{
printf("**");
}


}
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 10; j > i; j--)
{
printf(" ");
}
for (size_t j = 0; j < i; j++)
{
printf("**");
}
if (i != 9)
printf("\n");

}

image

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {
char pwd[20] = { 0 };
int num = 0;
while (num < 3) {
printf("请输入密码:");
scanf("%s", pwd);
if (strcmp("123456",pwd)!= 0) {
printf("%s\n", pwd);
num++;
}
else {
printf("输入正确!");
}
};
return 0;
}

数组循环查找之二分查找法

想在一个0-100的数组内找出99,如果按照传统的查找方法来查找,需要查询99此才能找到,而二分查找法可以7(?次就找到

具体查找实现

求0和数组长度的平均值
判断与所需的值是大了还是小了,如果小了,则进行寻找大于的50%,反之

最后找到等于所求值的数

tips:
如果寻找不到,会有最大值和最小值互换的情况判断这点可以确定是否找到,注意,最大值一定是大于最小值的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define MID(X,Y) ((X+Y)/2)


int arr[] = { 1,2,3,4,5,6,7,8,9,10,13 };
int sz = sizeof arr / sizeof arr[0];
int left = 0;
int right = sz - 1;
int k = 3;

while (left<=right)
{
int mid = MID(left, right);
if (arr[mid] > k){
right = mid - 1;
}
else if (arr[mid] < k) {
left = mid + 1;
}
else {
printf("找到了,下标在:%d 当前下标输出值:%d\n", mid,arr[mid]);
break;
}
}
if (right<left)
{
printf("没找到\n");
}

[[C语言日记④ 分支和循环以及趣味题目]]

由 Hexo 驱动 & 主题 Keep
总字数 15.9k 访客数 访问量