精华内容
下载资源
问答
  • 编一程序,交换两个字符变量的值并输出。 #include<stdio.h> main() { char ch1='A',ch2='B',chTemp;//Temp是临时的意思,代表中转站 ,在C语言中是通用的 printf("ch1=%c,ch2=%c\n",ch1...

    编一程序,交换两个字符变量的值并输出。

    #include<stdio.h> 
    main()
    {
        char ch1='A',ch2='B',chTemp;//Temp是临时的意思,代表中转站 ,在C语言中是通用的
        printf("ch1=%c,ch2=%c\n",ch1,ch2);
        chTemp=ch1;
        ch1=ch2;
        ch2=chTemp;;
        printf("ch1=%c,ch2=%c\n",ch1,ch2);
    }
    

    在这里插入图片描述

    展开全文
  •  printf("请输入两个字符(不用打空格):"); /*输出提示信息*/   scanf("%c%c",&c1,&c2); /*从键盘输入字符*/   c0=c1; /*数值交换*/   c1=c2; /*数值交换*/   c2=c0; /*数值交换*/   printf(...

    //顺序流程及结构 

    #include"stdio.h"                             /*编译预处理命令*/                                        
    void main()                                                                        /*main函数*/ 
    {
        char c1,c2,c0;                                                            /*定义字符型变量*/ 
        printf("请输入两个字符(不用打空格):");        /*输出提示信息*/ 
        scanf("%c%c",&c1,&c2);                                            /*从键盘输入字符*/ 
        c0=c1;                                                                            /*数值交换*/ 
        c1=c2;                                                                            /*数值交换*/ 
        c2=c0;                                                                            /*数值交换*/ 
        printf("%c\t%c",c1,c2);                                            /*输出交换后的数据*/ 
         
    }
    //这个程序和之前的换酒程序差不多。这个我发现就是输入的字符如果打了空格,空格
    //也会算进去。然后输出那里就是只有输出一个字符。所以输入的时候不要摁空格或者回车 

    展开全文
  • 函数函数的本质就是针对变量的操作...例如,strcat() 用来连接两个字符串,memcpy() 用来复制内存到另一个位置。自定义函数函数的声明函数声明就是告诉 C 编译器函数的名称、返回类型和参数以及如何调用函数。函数的...

    eb6c96415cb691379611fa873b059b49.png

    函数

    函数的本质就是针对变量的操作过程,同时可能也会改变当前程序的状态。它接受多个输入值,计算并返回一个输出值。

    函数大体上分为 3 类:

    1. 主函数:每个 C 程序都至少有一个 main()
    2. 内置函数:由 C 标准库提供。例如,strcat() 用来连接两个字符串,memcpy() 用来复制内存到另一个位置。
    3. 自定义函数

    函数的声明

    函数声明就是告诉 C 编译器函数的名称、返回类型和参数以及如何调用函数。函数的实际主体可以单独定义,但当你在一个源文件中定义函数且在另一个源文件中调用函数时,函数声明是必需的。

    声明函数时,首先将返回值的类型写在前面,后面紧跟函数的名字,而后的一对圆括号里面包裹函数的输入参数,参数之间用 , 进行分割。

    函数声明包括以下几个部分:

    return_typefunction_name(parameter list);

    在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面两种都是有效的声明:

    int max(int num1, int num2);
    int max(int, int);

    函数的定义

    函数体部分紧跟其后,

    函数定义除了定义函数的名称、返回类型、形参列表之外,最重要的是编写函数的主题,即函数体。包裹在 {} 里,里面包含了函数执行的所有语句,语句之间使用 ; 分隔。return 语句用来结束函数的执行,并返回一个值。

    C 程序中函数的结构如下:

    return_typefunction_name(parameter list){
       body of the function
    }
    • 返回类型:一个函数可以返回一个值,返回类型定义了函数返回的值的数据类型。有些函数不需要返回值,在这种情况下,return_type 是关键字 void
    • 函数名(函数标识符):函数名和参数列表一起构成了函数签名。
    • 形式参数:形参就像是占位符。当函数被调用时,向形参传递一个值,而这个值被称为实际参数。形参列表包括函数参数的类型、顺序、数量。形参是可选的,即形参列表可以为。
    • 函数主体:包含了一组定义函数执行任务的语句。
    /* 函数返回两个数中较大的那个数 */
    int max(int num1, int num2) 
    {
       /* 局部变量声明 */
       int result;
     
       if (num1 > num2)
          result = num1;
       else
          result = num2;
     
       return result; 
    }

    函数的形参与实参

    如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。当调用函数时,有两种向函数传递参数的方式:

    • 值传递:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
    • 引用传递:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

    值传递

    默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。

    • swap.c
    /* 函数定义 */
    void swap(int x, int y)
    {
       int temp;
    
       temp = x; /* 保存 x 的值 */
       x = y;    /* 把 y 赋值给 x */
       y = temp; /* 把 temp 赋值给 y */
      
       return;
    }
    • main.c
    #include <stdio.h>
     
    /* 函数声明 */
    void swap(int x, int y);
     
    int main ()
    {
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
     
       printf("交换前,a 的值: %dn", a );
       printf("交换前,b 的值: %dn", b );
     
       /* 调用函数来交换值 */
       swap(a, b);
     
       printf("交换后,a 的值: %dn", a );
       printf("交换后,b 的值: %dn", b );
     
       return 0;
    }

    引用传递

    通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。

    • swap.c
    /* 函数定义 */
    void swap(int *x, int *y)
    {
       int temp;
       temp = *x;    /* 保存地址 x 的值 */
       *x = *y;      /* 把 y 赋值给 x */
       *y = temp;    /* 把 temp 赋值给 y */
      
       return;
    }
    • main.c
    #include <stdio.h>
     
    /* 函数声明 */
    void swap(int *x, int *y);
     
    int main ()
    {
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
     
       printf("交换前,a 的值: %dn", a );
       printf("交换前,b 的值: %dn", b );
     
       /* 调用函数来交换值
        * &a 表示指向 a 的指针,即变量 a 的地址
        * &b 表示指向 b 的指针,即变量 b 的地址
       */
       swap(&a, &b);
     
       printf("交换后,a 的值: %dn", a );
       printf("交换后,b 的值: %dn", b );
     
       return 0;
    }

    可变长形参列表

    有时候我们需要函数带有可变数量的参数,而不是预定义数量的参数。C 语言提供了 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。

    int func(int, ... ) {}
     
    int main() {
       func(1);
       func(1, 2);
       func(1, 2, 3);
       return 0;
    }
    • 定义一个函数,int 形参代表了要传递的可变参数的总数,... 可变长形参运算符标识函数的形参数量是可变的。
    • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
    • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
    • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
    • 使用宏 va_end 来清理赋予 va_list 变量的内存。
    #include <stdio.h>
    #include <stdarg.h>
    
    double Avg(int num, ...) {
        va_list valist;
        double sum = 0.0;
        int i;
    
        /* 初始化 valist,数量为 num 个 */
        va_start(valist, num);
        for (i = 0; i < num; i++) {
            /* 访问所有赋给 valist 的参数 */
            sum += va_arg(valist, int);
        }
        /* 清理为 valist 保留的内存 */
        va_end(valist);
    
        return sum / num;
    
    }
    
    int main() {
        printf("Average of 2, 3, 4, 5 = %fn", Avg(4, 2, 3, 4, 5));
        printf("Average of 5, 10, 15 = %fn", Avg(3, 5, 10, 15));
        return 0;
    }

    运行:

    $ ./main
    Average of 2, 3, 4, 5 = 3.500000
    Average of 5, 10, 15 = 10.000000

    函数的调用

    定义 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

    调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。

    #include <stdio.h>
     
    /* 函数声明 */
    int max(int num1, int num2);
     
    int main ()
    {
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
       int ret;
     
       /* 调用函数来获取最大值 */
       ret = max(a, b);
     
       printf( "Max value is : %dn", ret );
     
       return 0;
    }
     
    /* 函数返回两个数中较大的那个数 */
    int max(int num1, int num2) 
    {
       /* 局部变量声明 */
       int result;
     
       if (num1 > num2)
          result = num1;
       else
          result = num2;
     
       return result; 
    }

    函数的指针

    函数名本质就是一个地址,也就是一个指针。函数指针是指向函数的指针类型变量,函数指针可以像一般函数一样,用于调用函数、传递参数。也就是说,函数指针其实可以看做就是一个函数的 “别名”。

    函数指针很方便,可以作为实参传入函数,在函数体中,仅仅通过指针就可以调用函数,这也是为了提高代码的效率。函数指针和普通指针差不多,主要的区别是函数指针指向了特定的函数。

    声明一个函数指针:

    typedef int (*fun_ptr)(int, int);

    e.g.

    #include <stdio.h>
     
    int max(int x, int y){
        return x > y ? x : y;
    }
     
    int main(void){
        /* 定义并初始化一个函数指针 */
        int (*p)(int, int) = &max;  // 可以省略地址运算符 &
        int a, b, c, d;
     
        printf("Input three numbers:");
        scanf("%d %d %d", &a, &b, &c);
    
        d = p(p(a, b), c); 
        printf("MAX: %dn", d);
        
        return 0;
    }

    回调函数

    回调函数就是将函数指针作为实参传入到某个函数,即:回调函数就是一个通过函数指针调用的函数。

    #include <stdlib.h>
    #include <stdio.h>
    
    void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) {
    
        size_t i;
    
        for(i = 0; i < arraySize; i++) {
            array[i] = getNextValue();
        }
    }
    
    int getNextRandomValue(void) {
        return rand();
    }
    
    int main() {
        int i;
        int myarray[10];
    
        populate_array(myarray, 10, &getNextRandomValue);  // & 可以省略,因为函数名的本质就是一个指针
    
        for(i = 0; i < 10; i++) {
            printf("%d ", myarray[i]);
        }
    
        printf("n");
        return 0;
    }

    递归函数

    递归,指的是在函数的定义中调用函数自身

    a4e04833f6ead82e4fbabf7e09662ef0.png
    void recursion()
    {
       statements;
       ... ... ...
       recursion(); /* 函数调用自身 */
       ... ... ...
    }
     
    int main()
    {
       recursion();
    }

    但在使用递归时,一定要注意编写退出条件,否则会进入死循环。递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,等等。

    数的阶乘

    #include <stdio.h>
     
    double factorial(unsigned int i) {
       if(i <= 1)
       {
          return 1;
       }
       return i * factorial(i - 1);
    }
    
    int main() {
        int i = 15;
        printf("%d 的阶乘为 %fn", i, factorial(i));
        return 0;
    }

    斐波那契数列

    #include <stdio.h>
     
    int fibonaci(int i) {
       if (i == 0) {
          return 0;
       }
       if (i == 1) {
          return 1;
       }
       return fibonaci(i-1) + fibonaci(i-2);
    }
     
    int main() {
        int i;
        for (i = 0; i < 10; i++) {
           printf("%dtn", fibonaci(i));
        }
        return 0;
    }

    构造函数(Constructor)

    构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值。例如:

    • Java 中的 new 运算符
    • Python 中的 __init__ 函数

    通常的,一个类中只有一个构造函数;特别的,一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。

    析构函数(Destructor)

    析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做 “清理善后” 的工作。

    以 C++ 为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如:~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括 void 类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

    C/C++学习资料分享交流群:1093776732 入群有全套学习视频资料电子书免费赠送!

    参考资料:

    C语言编程基础www.makeru.com.cn七天提升C语言www.makeru.com.cn七天提升C编程能力www.makeru.com.cn夯实C语言,从小白到大牛的进阶之路!www.makeru.com.cn
    展开全文
  • 它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c...
  • 应注意问题: 当指针作为函数的参数进行传递的时候,本质上还是...要求:定义初始化两个字符串变量,执行输出操作;然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。 程序1.1 #i

    应注意问题:

    当指针作为函数的参数进行传递的时候,本质上还是进行的“值传递”,也就是复制了一个新的指向该地址的指针变量。

    只有在被调函数中,对指针进行引用操作,才可以达到不需要返回值,就对指针指向的变量做出相应的变化。

    下面分析这样两个例子;

    要求:定义并初始化两个字符串变量,并执行输出操作;然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。

    程序1.1

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
       string str1="I love China!",str2="I love JiNan!";
       void Exchange(string *p1,string *p2);
       cout<<"str1: "<<str1<<endl;
       cout<<"str2: "<<str2<<endl;
       Exchange(&str1,&str2);
       cout<<"str1: "<<str1<<endl;
       cout<<"str2: "<<str2<<endl; 
       return 0;
    }
    void Exchange(string *p1,string *p2){
    	string *p3;
    	p3=p1;
    	p1=p2;
    	p2=p3;
    }

    输出结果:


    程序1.2

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
       string str1="I love China!",str2="I love JiNan!";
       void Exchange(string *p1,string *p2);
       cout<<"str1: "<<str1<<endl;
       cout<<"str2: "<<str2<<endl;
       Exchange(&str1,&str2);
       cout<<"str1: "<<str1<<endl;
       cout<<"str2: "<<str2<<endl; 
       cout<<endl;
       return 0;
    }
    void Exchange(string *p1,string *p2){
    	string p3;
    	p3=*p1;
    	*p1=*p2;
    	*p2=p3;
    }

    输出结果:


    分析:

    通过这两个程序的结果对比,程序1.1中的函数没有达到交换数值的目的,而程序1.2达到了;

    因为,在主函数中,主函数把str1和str2的首元素的地址,作为实参传递给了函数Exchange函数;Exchange函数中的,p1用于接收str1的地址,p2用于接收str2的地址,这个过程是进行了值传递。

    在程序1.1中,只是指针p1和指针p2的值进行了交换,对原来的字符串str1和str2并没有什么影响;而在程序1.2中,是*p1和*p2的值进行了交换,而*p1就是str1它本身,*p2就是str2它本身,所以实际上是str1和str2进行了交换


    展开全文
  • 要求:定义初始化两个字符串变量,执行输出操作;然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现。程序1.1 代码如下:#include<iostream>#include<string>using namespace std;int...
  • 《你必须知道495C语言问题》

    热门讨论 2010-03-20 16:41:18
    它不需要临时变量就可以交换a和b的值。 34 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35  3.6 可是&&和||操作符呢?我看到过...
  • 它不需要临时变量就可以交换a和b的值。 34 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 35  3.6 可是&&和||操作符呢?我看到过...
  • 它不需要临时变量就可以交换a和b的值。 63 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 64 3.6 可是&&和||操作符呢?我看到过类似...
  •  删除环境变量中的PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有Oracle的组和图标。  删除所有与Oracle相关的目录,包括: C:\Program file\Oracle目录。 ORACLE_BASE目录。 C:\Documents ...
  • 它不需要临时变量就可以交换a和b的值。  3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢?  3.6 可是&&和||操作符呢?我看到过类似...
  • 它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while...
  • 它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c ...
  • 它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c ...
  • 你必须知道495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    3.12 我需要根据条件把一个复杂表达式赋值给两个变量一 个。可以用下边这样代码吗? ((condition) ? a : b) = complicated expression; . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 目录iii ...
  • 如果你为变量var赋值为一个字符串,那么它变成了一个字符串。如果你又为它赋了整数,那么它就变成了整数。" $foo = "0"; // $foo是字符串(ASCII 48) $foo++; // $foo是字符串"1" (ASCII 49) $foo += 1; // $foo...
  • CodingBootcamps-使用C解决问题:入门级-第2天动手练习 该程序提高了入门级学生...交换两个数字 程序5:将为您提供存储在变量“ a”和“ b”中的两个数字。 您的任务是交换存在的值并打印。 例子输入: 4 5 输出: 5 4
  • CodingBootcamps-使用C解决问题:入门级-第2天动手练习 该程序提高了入门级学生...交换两个数字 程序5:将为您提供存储在变量“ a”和“ b”中的两个数字。 您的任务是交换存在的值并打印。 例子输入: 4 5 输出: 5 4
  • php面试宝典3

    2017-03-17 17:43:03
    1.不用定义新变量直接交换现有两个变量的值 $a=7; $b=2; $a=$a+$b; $b=$a-$b; $a=$a-$b; echo $a; echo ''; echo $b; 2.简述以下输出语句的区别 echo :可以同时输出个字符串,可以多个参数,不需要圆括号,无返回值...
  • /*p4是指向字符变量的指针变量*/ 应该注意的是,一个指针变量只能指向同类型的变量,如P3 只能指向浮点变量,不能时而指向一个浮点变量, 时而又指向一个字符变量。 指针变量的赋值  指针变量同普通变量一样,...
  • 交换两个变量的值而不使用临时变量.bat 交换两个变量的值而不使用临时变量.cmd 人民币大小写互转程序.cmd 人民币金额小写转大写.cmd 今天访问过的程序文件所在目录.cmd 以文件夹名为名建立文本文件.cmd 使用WMI别名...
  • 交换两个变量的值而不使用临时变量.cmd 今天访问过的程序文件所在目录.cmd 以文件夹名为名建立文本文件.cmd 使用WMI别名获取CPU信息.bat 保留空行替换字符串.cmd 修改IP跟电脑名.bat 停止隐藏共享.cmd 全盘...
  • 请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成...
  • 3. 请用户输入一个字符串,计算字符串中字符个数,并输出。 4. 用方法来实现:计算两个最大。思考:方法参数?返回值?扩展(*):计算任意多个数间最大(提示:使用可变参数,params)。 5. 用方法来...
  •  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变字符串。而这个StringBuffer类提供字符串进行修改。当你知道字符数据要...
  • c++面试经典算法

    2017-12-17 18:00:33
    6、编写一个函数,调用传递引用的参数,实现两个字符变量的交换。7、设计一个集合类Set,包括将集合置空、添加元素、判断元素是否在集合中、输出集合,以及将集合中元素逆置。10、有若干教师,每个教师只有姓名,...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    在前种格式中,会将<来源>复制至<目的地>或将多<来源>文件复制至已存在<目录>,同时设定权限模式及所有者/所属组。在第三种格式中,会创建所有指定目录及它们主目录。长选项必须用参数在使用短选项时也...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

交换两个字符变量的值并输出