《C语言程序设计(第3版)》教材配套习题 第七章

排序问题

选择法排序

输入:第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出:在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
核心从头开始,找出其后所有数中的最大值,并将该值换到最前面

#include <stdio.h>
#define N 10

void swap(int *a,int *b);
int main()
{
    int a[N];
    int n;
    int i, j, index;
    
    scanf("%d", &n);
    //遍历数组
    for ( i=0; i<n; i++ ){
        scanf("%d", &a[i]);
    }
    //从第一个数开始,与其后的数依次比较;比较至倒数第二个数即可
    for ( i=0; i<n-1; i++ ){
    	index = i;
        for( j=i+1; j<n; j++ ){ //找出后面的数的最大值
            if ( a[j]>=a[index] ) index = j; //有重复数,也需要排到前面来            	
        }     
        swap(&a[index], &a[i]);  
    }
    
    for ( i=0; i<n; i++ ){
        printf("%d", a[i]);
        if ( i!=n-1 ) printf(" ");
    }
    
    return 0;
}

void swap(int *a,int *b) //传入指针
{
    int tmp = 0;
    
    tmp = *a;
    *a = *b;
    *b = tmp;
}
冒泡法排序(升序)

核心:每一趟都通过两两交换,将最大值换到最右边

for( i=1; i<n; i++ ){ //进行n-1趟
	//第i趟时,从a[0]到a[n-i-1]都与它们的下一个数比较 
   	for ( j=0; j<n-i; j++){
   		if ( a[j]>a[j+1] ){ //下一个数更大时,二者交换位置
   			temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
		}
	}
}

查找问题

二分查找法

思路:与中值比较,找到 / 中值左片区 / 中值右片区

left = 0;
right = n-1; //最大数组下标
while ( left<=right ){
	mid = (left+right)/2; //找中间下标
	if ( x==a[mid] ) break; //找到了
	else if ( x<a[mid] ) right = mid-1; //比中值小,从中值左边开始找
	else left = mid+1; //比中值大,从中值右边开始找
}
printf("%d\n",mid);

字符串输入与转换

十六进制字符串转换成十进制非负整数

输入:在一行中给出一个不超过80个字符长度的、以#结束的非空字符串。
输出:第1行中输出已滤去所有非十六进制字符(不区分大小写)的字符串。 在第2行中输出转换后的十进制数。题目保证输出结果在长整型范围内。
重点

  1. 输入以某字符结尾的字符串:(a[i]=getchar()) != ‘#’
  2. 将字符串转换成整数:尤其注意数字需要减去’0’,不能直接用
char a[N], b[N]; //已定义N为80
int i=0, j=0;
int factor = 1;
long long result = 0;

while( (a[i]=getchar()) != '#' )
{
    scanf("%c", &a[i]);
    //if ( a[i]=='#' ) break; //输入控制
    if ( a[i]>='0' && a[i]<='9' || (a[i]>='a' && a[i]<='f') || (a[i]>='A'&&a[i]<='F') ){ //获取十六进制字符
        b[j] = a[i];
        j++;
    } 
    i++;
}

for ( j=j-1; j>=0; j-- ){
    if ( b[j]>='0'&&b[j]<='9' ) result += factor*(b[j]-'0'); //这里不是数字
    else if ( b[j]>='a'&&b[j]<='f' ) result += factor*(b[j]-'a'+10);
    else result += factor*(b[j]-'A'+10);
    factor *= 16;
}

printf("%s\n", b);
printf("%lld", result);
大小字母转换

重点

  1. 小写转大写—— -‘a’+‘A’
  2. 大写转小写—— -‘A’+‘a’
    [例1](使用1个数组)
i = 0;
while ( (str[i]=getchar()) != '\0') {
	if (str[i] >= 'a' && str[i] <= 'z'){
		str[i]=str[i]-'a'+'A';
	}
	else if (str[i] >= 'A' && str[i] <= 'Z'){
		str[i]=str[i]-'A'+'a';
	}
	i++;
}

[例2](使用2个数组)

i = 0;
while ( (str1[i]=getchar()) != '\0') {
    if (str1[i] >= 'a' && str1[i] <= 'z'){
        str2[i] = str1[i]-'a'+'A';
    }else if (str1[i] >= 'A' && str1[i] <= 'Z'){
        str2[i] = str1[i]-'A'+'a';
    }else{
        str2[i] = str1[i]}
    i++;
}
str2[i] = '\0';
电码加密之指针的应用

要求:小写字母z变换成为a,其他字母变换成为该字母ASCII码顺序后一位的字母,比如o变换成为p。
裁判测试程序样例

#include <stdio.h>
# include <string.h>
# define MAXLINE 80
void encrypt ( char *s);
int main (void)
{
   char line [MAXLINE];

   gets(line);
   encrypt (line);
   printf ("%s\n", line);
	 return 0;
}

/* 请在这里填写答案 */

关键把数组名当作指针(指向首地址),移动指针获取数组元素。
解答

void encrypt ( char *s)
{
    int i;
    for ( i=0; i<strlen(s); i++ ){
        if ( *(s+i)=='z' ) *(s+i) = 'a'; //注意把s+i整个括起来
        else *(s+i) = *(s+i) + 1;
    }    
}

删除字符串中的空格

使用1个数组

不要忘了给新字符串一个结尾’\0’

i = j = 0;
while ( (str[i]=getchar()) != '\0' ){
	if ( str[i] != ' ' ){
		str[j] = str[i];
		j++;
	}
	i++;
}
str[j] = '\0';  //把str数组下标为j及其之后的内容截掉
使用2个数组

不要忘了给新字符串一个结尾’\0’

i = j = 0;
while ( (str1[i]=getchar()) != '\0' ){
	if ( str1[i] != ' ' ){
		str2[j] = str1[i];
		j++;
	}
	i++;
}
str2[j] = '\0';  //给新数组一个结尾
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值