《程序设计》函数题|021-030

习题8-2 在数组中查找指定元素 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:在数组中查找指定元素
int search(int list[],int n,int x){
    // 返回值
    int result=-1;
    // 顺序查找
    for(int i=0;i<n;++i){
        if(list[i]==x){
            result=i;
            break;
        }
    }
    // 返回
    return result;
}

习题8-3 数组循环右移 – 浙大版《C语言程序设计(第4版)》题目集

// 交换数组两个元素
void swap(int a[],int i,int j){
    int tmp=a[i];
    a[i]=a[j];
    a[j]=tmp;
    // 返回
    return;
}
// 逆置
void reverse(int a[],int left,int right){
    // 对撞指针
    while(left<right){
        swap(a,left++,right--);
    }
    // 返回
    return;
}
// 数组循环右移m个位置
void ArrayShift(int a[],int n,int m){
    // m比n大时
    m=m%n;
    // 三次逆置等效实现循环右移
    reverse(a,0,n-1);
    reverse(a,0,m-1);
    reverse(a,m,n-1);
    // 返回
    return;
}

习题8-4 报数 – 浙大版《C语言程序设计(第4版)》题目集

// 处理:报数
void CountOff( int n, int m, int out[] ){
    int people[MAXN]; // 1表示还在圈中,0表示已退出
    int i, count, pos, exit_order;
    
    // 初始化所有人都在圈中
    for (i = 0; i < n; i++) {
        people[i] = 1;
    }
    
    pos = 0; // 当前位置
    exit_order = 1; // 退出顺序
    
    while (exit_order <= n) {
        count = 0; // 当前报数
        
        // 找到第m个人
        while (count < m) {
            if (people[pos] == 1) {
                count++;
            }
            
            if (count < m) {
                pos = (pos + 1) % n; // 移动到下一个人
            }
        }
        
        // 当前位置的人退出
        out[pos] = exit_order;
        people[pos] = 0;
        exit_order++;
        
        // 移动到下一个还在圈中的人
        while (people[pos] == 0 && exit_order <= n) {
            pos = (pos + 1) % n;
        }
    }
}

习题8-5 使用函数实现字符串部分复制 – 浙大版《C语言程序设计(第4版)》题目集

// 处理:字符串复制
void strmcpy( char *t, int m, char *s ){
    int i, j;
    int len = 0;
    
    // 计算字符串t的长度
    while (t[len] != '\0') {
        len++;
    }
    
    // 如果m超过字符串长度,结果字符串为空串
    if (m > len) {
        s[0] = '\0';
        return;
    }
    
    // 从第m个字符开始复制(m从1开始计数,数组下标从0开始)
    for (i = m - 1, j = 0; t[i] != '\0'; i++, j++) {
        s[j] = t[i];
    }
    
    // 添加字符串结束符
    s[j] = '\0';
}

习题8-6 删除字符 – 浙大版《C语言程序设计(第4版)》题目集

#include <string.h>

// 处理:删除字符串中的指定字符
void delchar(char *str, char c){
    // 删除 前后双指针
    int left=0;
    int right=0;
    int sLen=strlen(str);
    while(right<sLen){
        if(str[right]!=c){
            str[left++]=str[right];
        }
        ++right;
    }
    str[left]='\0';
    // 返回
    return;
}

习题8-8 判断回文字符串 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:回文字符串—>true 否则->false
bool palindrome(char *s){
    // 返回值
    bool result=true;
    // 判断 相向双指针
    int left=0;
    int right=strlen(s)-1;
    while(left<right){
        if(s[left++]!=s[right--]){
            result=false;
            break;
        }
    }
    // 返回
    return result;
}

习题8-9 分类统计各类字符个数 – 浙大版《C语言程序设计(第4版)》题目集

#include <string.h>

// 处理:分类统计各类字符个数
void StringCount(char *s){
    // 统计
    int sLen=strlen(s);
    int cnt[5]={0};
    for(int i=0;i<sLen;++i){
        if(s[i]>='A' && s[i]<='Z'){
            ++cnt[0];
        }else if(s[i]>='a' && s[i]<='z'){
            ++cnt[1];
        }else if(s[i]==' '){
            ++cnt[2];
        }else if(s[i]>='0' && s[i]<='9'){
            ++cnt[3];
        }else{
            ++cnt[4];
        }
    }
    // 输出
    for(int i=0;i<5;++i){
        printf("%d",cnt[i]);
        if(i<4){
            printf(" ");
        }
    }
    // 返回
    return;
}

习题9-2 计算两个复数之积 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:两个复数之积
struct complex multiply(struct complex x, struct complex y){
    // 结果
    struct complex result;
    // 计算
    result.real=x.real*y.real-x.imag*y.imag;
    result.imag=x.real*y.imag+x.imag*y.real;
    // 返回结果
    return result;
}

习题9-6 按等级统计学生成绩 – 浙大版《C语言程序设计(第4版)》题目集

// 返回:不及格人数
// 处理:设置等级
int set_grade(struct student *p, int n){
    // 返回值
    int result=0;
    // 根据学生成绩设置其等级 统计不及格人数
    for(int i=0;i<n;++i){
        int score=p[i].score;
        if(score>=85 && score<=100){
            p[i].grade='A';
        }else if(score>=70 && score<=84){
            p[i].grade='B';
        }else if(score>=60 && score<=69){
            p[i].grade='C';
        }else{
            p[i].grade='D';
            ++result;
        }
    }
    // 返回
    return result;
}

练习10-1 使用递归函数计算1到n之和 – 浙大版《C语言程序设计(第4版)》题目集

// 递归:计算前n项和
int sum(int n){
    // 边界处理
    if(n<=0) return 0;
    // 递归出口
    if(n==1) return 1;
    // 递归表达式
    return n+sum(n-1);
}

《《程序设计》函数题|021-030》有1条评论

发表评论