C语言学习初阶 二分查找 水仙花数 打印菱形

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

对于一个重新学习C语言这门课的学生来说,我想在这里写一些重要的笔记,比较难懂的例题(当然,只针对于我个人来说),大家也都可以参考。

一、C语言最简单开始

1. 数据类型

char        //字符数据类型
short       //短整型
int         //整形
long        //长整型
long long   //更长的整形
float       //单精度浮点数
double      //双精度浮点数

每个占几个字节,用下面的函数查看一下,就知道,这个最好要记住。

#include<stdio.h>
void main(){
    
    
	printf("char= %d\n", sizeof(char));
	printf("short=%d\n", sizeof(short));
	printf("int=%d\n", sizeof(int));
	printf("long=%d\n", sizeof(long));
	printf("long long =%d\n", sizeof(long long));
	printf("double= %d\n", sizeof(double));
}

在这里插入图片描述

2. 变量,常量

变量顾名思义,就是一些会发生改变的值,常量就是一旦定义好,就无法改变的值。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。
  3. 变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
  4. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  5. 全局变量的生命周期是:整个程序的生命周期。

3. 字符串+转义字符

由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。(注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串)
转义字符:
? 在书写连续多个问号时使用,防止他们被解析成三字母词
’ 用于表示字符常量’
\“ 用于表示一个字符串内部的双引号
\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示1~3个八进制的数字。 如: \130 X
\xdd dd表示2个十六进制数字。 如: \x30 0

#include <stdio.h>
int main()
{
    
    
    printf("%d\n", strlen("abcdef"));
    printf("%d\n", strlen("c:\test\328\test.c"));
    return 0;
}

输出结果分别为:6 14
第一个很好理解,这里我把第二个分一下,就比较好理解了,比较尴尬的是,开始我的理解也是错误的,最后才发现是这样,为了方便理解,我把每个字符中间用#隔开:c#:# \t#e#s#t#\32#8#\t#e#s#t#.#c,可以发现一共13个#。

4. 选择与循环语句

选择语句就是我们所说的if,switch,switch我觉得就是一种特殊的选择语句,里面也类似于if,else这种选择,比较好理解。注意:break可以退出switch,default子句用于处理,匹配不到case的情况,可以写在switch里的case的前或者后,都无所谓。
循环语句
while
for
do while

#include <stdio.h>
int main()
{
    
    
	int i = 1;
	while (i <= 10)
	{
    
    
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}
#include <stdio.h>
int main()
{
    
    
 int i = 0;
 for(i=1; i<=10; i++)
 {
    
    
 printf("%d ", i);
 }
 return 0;
}
#include <stdio.h>
int main()
{
    
    
 int i = 10;
 do
 {
    
    
 printf("%d\n", i);
 }while(i<10);
 return 0;
}

这里再说一下,break和continue的区别,前者直接跳出循环,后者结束本次循环,进入下一循环。

二、典型的题

1.打印菱形

#include<stdio.h>
//打印菱形
int main()
{
    
    
	int i, j, N = 5;
	//上半部分
	for (i = 0; i < N; i++) //N控制上半部分行数
	{
    
    
		for (j = i; j < N - 1; j++) //随行数递增,空格数递减(这里每行前面的空格数分别为4,3,2, 1,0)
			printf(" ");
		for (j = 0; j < 2 * i + 1; j++) //随行数递增,“*”数递增(这里每行前面的*数分别为1,3,5,7,9)
			printf("*");
		printf("\n"); //记得换行
	}
	//下半部分,其实就是上半部分的翻转
	for (i = N - 2; i >= 0; i--) //这里i从N-2开始的,不知道为什么的可以换成N-1试试,保证秒懂
	{
    
    
		for (j = i; j < N - 1; j++) //这里的空格数刚好相反,是随行数递增的
			printf(" ");
		for (j = 0; j < 2 * i + 1; j++) //这里的“*”数则是递减的(想想图形的样子)
			printf("*");
		printf("\n"); //同样的记得换行
	}
	return 0;
}

2.求出0~100000之间的所有“水仙花数”并输出。

#include <math.h>
void main(){
    
    
	int n;
	int a[6] = {
    
     0 };
	int i;
	int sum = 0;
	int count = 0;
	for (n = 0; n <= 100000; ++n){
    
     //遍历0-100000之间所有数字
		for (i = n; i; i /= 10){
    
    
			a[count] = i % 10;  //用数组a[count]将每一位存起来,用count记下数字的位数
			++count;
		}
		for (i = 0; i < count; ++i){
    
    
			sum += pow(a[i], count); //将数组中所存的数字的每一位进行对应的位数count次方并求和
		}
		if (n == sum){
    
    
			printf("%d \n", n);
		}
		count = sum = 0; //强制将count与sum归0
	}
}

3.二分查找

#include <math.h>
void main()
{
    
    
	int ar[] = {
    
     12, 23, 34, 45, 56, 67, 78, 90, 100, 120, 150, 200, 1234 };
	int n = sizeof(ar) / sizeof(ar[0]);
	int key;
	printf("input key:>");
	scanf("%d", &key);
	int low = 0;
	int high = n - 1;
	int mid, index = -1;
	while (low <= high)
	{
    
    
		mid = (low + high) / 2;
		if (key == ar[mid])
		{
    
    
			index = mid;
			break;
		}
		else if (key < ar[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}
	if (index == -1)
		printf("要查找的%d不存在.....\n", key);
	else
		printf("要查找的%d在: 第%d个\n", key, index+1);
}

总结

这里先介绍了一点点,还有很多典型的题,后面的函数,数组,指针,还会加入,怎么说呢,第二遍学这门语言,感觉很不一样,没有第一次,那么懵懂了,知道给一个东西,要怎样去实现,虽然有时候实现的方式比较垃圾,这也是写的太少的原因,所以还是要一言不合,撸代码呀。

猜你喜欢

转载自blog.csdn.net/weixin_45070922/article/details/109644258
今日推荐