黑马程序员-----c语言基础与重点第三篇——函数1与循环

时间:2022-11-24 00:27:14

------- android培训java培训IOS培训.Net培训、期待与您交流! ----------

本系列博客主要描述c语言基础与OC语言基础。大家可随时沟通交流。根据学习做一些笔记,也方便学习和复习巩固。

函数

从定义上分别为库函数与用户定义函数;从功能上来看,分为有返回值函数与无返回值函数;

从主与被上,分为主调函数与被调函数;从参数上来看,分为无参函数与有参函数。

无参无返回值类型

void 函数名(){  声明部分与语句  }

无参有返回值类型

返回值类型   函数名(){  声明部分与语句 return 变量或常量  }

有参无返回值类型

void 函数名(参数){  声明部分与语句  }

有参有返回值类型

返回值类型 函数名(参数){  声明部分与语句  return 变量或常量  }


形参:不会立即分配存储空间;如果有多个形参可以用逗号分隔;形参的类型可以不相同。

在函数中不能定义与形参同名的变量;调用函数要声明。

实参:可以是常量整型,变量,表达式;函数名不能与变量同名。


递归函数

一个函数在它的函数体内调用它自身称为递归调用,在递归调用中,主调函数又是被调函数。

递推阶段——缩小问题的规模;回归阶段——回归计算。


 在不同速度的设备之间传递数据的时候,需要使用缓冲区临时存储数据

scanf函数工作时会利用一个输入缓冲区把用户在键盘上输入的字符临时存储起来,程序实际上从这个输入缓冲区里获得数字

先进入输入缓冲区的数据必须优先处理如果用户输入的内容和scanf函数要求的格式不一致,则它们会一直无法被处理,这会

导致后面输入的内容也无法处理

可以使用如下两条语句把输入缓冲区里可能存在的错误数据丢弃
scanf("%*[^\n]");//把输入缓冲区里第一个换行字符前的所有内容丢弃

scanf("%*c");//把输入缓冲区里第一个换行字符丢弃

printf函数使用输出缓冲区临时存储要打印的内容
只有满足如下四个条件中的某一个,输出缓冲区里面的内容才会显示在屏幕上
1.'\n'换行字符前面的内容会被打印在屏幕上
2.当主函数结束后程序打印的内容出现在屏幕上
3.当输出缓冲区被充满的时候,里面的内容会被打印在屏幕上
4.可以使用fflush(stdout)语句把输出缓冲区里的内容强制显示在屏幕上

sizeof函数可以对数组名称进行sizeof计算,得到的结果是整个数组中包含的字节个数

可以利用sizeof关键字在程序中计算出数组中包含的存储区个数


循环

作为程序结构中的循环结构,

这里介绍三个循环 :for循环 ,while循环 ,do……while循环

循环语句可以让程序中的一组语句反复多次运行
使用for关键字可以用来编写循环
可以在for循环中让一个变量依次代表一组数字,然后使用一组语句对每个数字作同样的处理
这个变量叫做循环变量
采用如下结构描述循环变量的变化过程
(把开始数字赋值给循环变量;用逻辑表达式描述循环变量和结束数字之间的关系;循环变量每次的变化规律)

for(表达式1;表达式2;表达式3)

{   

      语句

}

while关键字也可以用来编写循环
while循环的格式如下
while(逻辑表达式)
{
反复执行的语句
}

只要逻辑表达式结果为真就反复不停执行大括号里的语句,直到逻辑表达式结果为假,循环结束
只要把逻辑表达式写成1则循环成为死循环
while循环里同样可以使用break;和continue;语句,效果在for循环使用一样
while循环有可能什么都不做

do{

    反复执行的语句
}while(逻辑表达式);

先进行大括号里面,再进行()里面的判断
do...while格式也可以用来实现循环,这种循环至少会执行一次
这种循环必须在小括号后面用分号结束


冒泡排序

特点:大数下沉,小数上浮

代码:

#include<stdio.h>

void maoPao(int arr[],int len){

              int  temp;

              for(int i=0;i<len-1;i++){

                    for(int j=0; j<len-1-i;j++){

                        if(arr[j]>arr[i]){

                              temp=arr[j];

                              arr[j]=arr[j+1];

                              arr[i+1]=temp;

                         }

                     }

              }

}

int main(){

            int  a[6]={10,3,5,9,2,7};

            maoPao(a,6);

            for(int i=0;i<6;i++){

                   printf("%d\t",a[i]);

            }

            return 0;

}

选择排序

特点:每一次找最小,放最前(已经完成的除外)

代码:

#include<stdio.h>

void selectSort(int arr[], int len){

            int  temp;

            for(int i=0;i<len-1;i++){

                  for(int j=i+1; j<len;j++){

                        if(a[i]>arr[j]){

                            temp=arr[i];

                            arr[i]=arr[j];

                            arr[j]=temp;

                        }

                 }

            }

}

int main(){

              int a[4]={12,1,3,2};

              selectSort(a,4);

              for(int i=0;i<4;i++){

                   printf("%d\t",a[i]);

              }

              return 0;

}

折半查找

在有序表中,取中间元素作为对象,若给定的值与中间元素的值相等,则查找成功;大于它则在它的右半区查找;

小于它则在它的左半区查找,直到查找成功,或无数据元素,则查找失败。

代码:

#include<stdio.h>

int  searchItem(int arr[],int len,int key){

        int low=0;high=len-1,mid;

        while(low<=high){

              mid=(low+high)/2;

              if(key>arr[mid]){

                  low=mid+1;

              }

              else if(key<arr[mid]){

                 high=mid-1;

              }

              else{                                                                                      (注意,如果是插入一个数,输出位置的话,原代码改两处)

                         return      mid;                                                                                       改1:return mid+1;

              }

}

return         -1                                                                                                                 改2:return  low;

}

int  main(){

          int a[]={3,6,8,10,15};

          int loc=searchItem(a,5,10);

          printf("loc=%d\n",loc);

   return 0;

}