C语言基础练习题

前面已经说过了C语言的一些基础知识,具体见C语言基础,,现在来思考一些问题:

首先,第一个问题,如果我要交换两个变量,有哪些方式呢?

当然,你可能会说,这很简单嘛,直接给个中间变量不就行了吗?

例如:a = 7 , b = 3

声明一个中间变量 t,让 t = a ; a = b ; b = t ; 完美解决问题!

的确,这是一个好方法。但是,如果我现在告诉你,不能使用中间变量,你会怎么解决呢?

说到这里,有些小伙伴就开始苦恼了,其实也不是很复杂,我们只需要:

令 a = a + b ; b = a - b ; a = a - b ;看完之后,是不是很简单?

但这都不是重点,我想说的是下面这种方法:

a = 7 , b = 3

a = a^b; // 0111 ^ 0011 = 0100      4

b = b^a; // 0011 ^ 0100 = 0111      7

a = a^b; // 0100 ^ 0111 = 0011      3

上面用到了异或运算,在c语言中,‘ ^ ’表示的异或,而不是平方,异或是两个相同就为0,不同就为1

这三种方法都可以解决两个变量交换问题,主要是前提条件不同。

接下来,说第二个问题,冒泡排序,想必这是学计算机语言的必备题目啊。

冒泡排序的主要思想就是交换位置,例如下面这个例子:

a[10] = { 9 , 3 , 1 , 4 , 6 , 7 , 5 , 2 , 0 , 8 }

第一次的时候是9和3比较,若前面一个数比后面一个数大,则交换位置,所以9和3需要互换位置;

然后,9再与后面一个数比较,若前面一个数比后面一个数大,则交换位置;

以此类推,第一轮的最后结果是9换到了最后面,即{ 3 , 1 , 4 , 6 , 7 , 5 , 2 , 0 , 8 ,9}。

下面的循环体,很显然就是我们之前交换变量所说的第三种方法,它完全等同于:

t = a[i+1];     a[i+1] = a[i];  a[i] =  t;

#include<stdio.h>

int main()
{
    int a[10] = {9,3,1,4,6,7,5,2,0,8};
    int i,n = 9;
    while(n--){
        for(i = 0;i < 9;i++){
            if(a[i] > a[i+1]){
                a[i]^=a[i+1];
                a[i+1]^=a[i];
                a[i]^=a[i+1];
            }
        }
    }

    for(i = 0;i < 10;i++){
        printf("%3d",a[i]);
    }

    return 0;
}

最后一个问题是,如何去掉重复的字符,例如 “aaaabbbbcccccc” 只输出 “abc”

这个问题的关键是新建一个数组,将原数组的第一位赋值给新数组的第一位,如下面这个例子,将a[0]赋值给b[0],接着,再一次比较,如果数组a里面的值b数组没有,就将其添加到b数组的里,与此同时,下标加1,这就不难理解为什么 j 要++了。

值得一提的是,字符串的最后一位都会有一个默认的 ‘\0’。

#include<stdio.h>

int main(){
	char a[] = "aaaabbbbccccc",i=0,j=0,b[10]={0};
	b[0]=a[0];
	while(a[i] != '\0'){
		if(a[i] != b[j]){
			b[j+1] = a[i];
			j++;
		}
		i++;
	}
	printf("%s\n",b); 
	return 0;
}

好了,今天的问题就分享到这了,希望大家能够共同进步!

猜你喜欢

转载自blog.csdn.net/weixin_38629529/article/details/82153085