第一阶段第八天(函数结构体以及调用)

C语言学习:函数与结构体应用解析
这篇博客详细介绍了C语言中函数的使用,包括如何定义、调用函数以及结构体的概念和操作。通过实例讲解了结构体在函数中的传递方式,深入探讨了函数与结构体相结合的应用场景,帮助读者掌握高级C语言编程技巧。
1.
package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数add,接受两个整数作为参数,返回这两个整数的和。
 *
 */
public class Demo8_1 {
    /**
     * 入口文件
     * @param args
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner类对象
        System.out.println("请输入两个整数:");//提示用户输入信息
        int a=sc.nextInt();//获取用户输入信息
        int b=sc.nextInt();
        System.out.println(add(a,b));//调用函数
        sc.close();//关闭Scanner对象
    }
    /**
     * 实现两个整数求和
     * @param a  第一个参数 int
     * @param b  第一个参数 int
     * @return   返回两个整数之和 int
     */
    public static int add(int a,int b){
        int sum=0;
        sum=a+b;
        return sum;     
    }
 
}


2.
package day8;
 
import java.util.Scanner;
 
/**
 * 写一个函数,接受一个整数,输出这个整数的所有因子。
 *
 */
public class Demo8_2 {
    /**
     * 入口文件
     * @param args 参数
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner类对象
        System.out.println("请输入一个整数");//提示用户输入信息
        int num=sc.nextInt();//获取用户输入信息
        yinzi(num);//调用函数
        sc.close();//关闭Scanner对象
         
    }
    /**
     * 实现一个整数的所有因子
     * @param num  参数int类型
     */
    public static void yinzi(int num){
        for(int i=1;i<num;i++){
            if(num%i==0){
                System.out.println(i);
            }
        }
    }
     
}


3.
package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,接受一个整数n,输出1+2+3+...+n 的和
 *
 */
public class Demo8_3 {
    /**
     * 入口文件
     * @param args 参数
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner类对象
        System.out.println("请输入一个整数");//提示用户输入信息
        int num=sc.nextInt();//获取用户输入信息
        add(num);//调用函数
        sc.close();//关闭Scanner对象
    }
    /**
     * 实现输出打印1+2+3...+n的和
     * @param num 参数 代表要加到num
     */
    public static void add(int num){
        int sum=0;
        for(int i=1;i<=num;i++){
            sum+=i;         
        }
        System.out.println("1+2+3+...+"+num+"="+sum);
    }
}



4.
package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,接受一个整数参数n,输出n 个HelloWorld
 *
 */
public class Demo8_4 {
    /**
     * 入口文件
     * @param args
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner类对象
        System.out.println("请输入一个整数:");//提示用户输入信息
        int n=sc.nextInt();//获取用户输入信息
        Hello(n);   //调用函数  
        sc.close();//关闭Scanner对象
    }
    /**
     * 实现输出n个HelloWorld
     * @param n参数 int类型
     */
    public static void Hello(int n){
        for(int i=1;i<=n;i++){
            System.out.println("HelloWorld");
        }
    }
}


5.
package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,接收一个整数,输出这个整数是几位数。
 *
 */
public class Demo8_5 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个整数");
        int n=sc.nextInt();
        weishu(n);
    }
    public static void weishu(int n){
        int count=0;
        while(n>0){
            n=n/10;
            count++;
        }
        System.out.println(count);
    }
}


6.

package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,判断一个整数是否是质数。
 *
 */
public class Demo8_6 {
    /**
     * 入口文件
     * @param args参数
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner类对象
        System.out.println("请输入一个整数");//提示用户输入信息
        int n=sc.nextInt();//获取用户输入
        prime(n);//调用函数
        sc.close();//关闭Sannner对象
    }
    /**
     * 实现判断一个整数是否是质数
     * @param n参数
     */
    public static void prime(int n){
        if(n==1){
            System.out.println("1不是质数");
        }
        for(int i=2;i<=n;i++){
            if(n%i==0&&n!=i){
                System.out.println("这个数不是质数");
                break;
            }else{
                System.out.println("这个数是质数");
                break;
            }
        }
    }   
}






7.

package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,计算两点(x1,y1)和(x2,y2)之间的距离。
 *
 */
public class Demo8_7 {
    /**
     * 文件入口
     * @param args参数
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner对象
        System.out.println("请分别输入两点的坐标数值x1,y1,x2,y2");//提示用户输入信息
        double x1=sc.nextDouble();//获取用户输入
        double y1=sc.nextDouble();
        double x2=sc.nextDouble();
        double y2=sc.nextDouble();
        distance(x1,y1,x2,y2);//调用函数
        sc.close();//关闭Scanner对象
         
    }
    /**
     * 实现两点(x1,y1)和(x2,y2)之间的距离
     * @param x1参数1  
     * @param y1参数2
     * @param x2参数3
     * @param y2参数4
     */
    public static void distance(double x1,double y1,double x2,double y2){
        double dx=x1-x2;
        double dy=y1-y2;
        double dist=Math.sqrt(dx*dx+dy*dy);//两点之间的距离
        System.out.println(dist);       
    }
}






8.

package day8;
 
import java.util.Scanner;
 
/**
 * 
 * 写一个函数,接收三个整数 a,b,c, 计算ax^2+bx+c=0的根。
 *
 */
public class Demo8_8 {
    /**
     * 入口文件
     * @param args参数
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);//实例化Scanner对象
        System.out.println("请输入三个整数");//提示用户输入信息
        int a=sc.nextInt();//获取用户输入信息
        int b=sc.nextInt();
        int c=sc.nextInt();
        jisuan(a,b,c);//调用函数
        sc.close();
    }
    /**
     * 实现计算ax^2+bx+c=0的根
     * @param a参数1
     * @param b参数2
     * @param c参数3
     */
    public static void jisuan(int a,int b,int c){
        double flag=b*b-4*a*c;
        if(flag<0){
            System.out.println("此方程无实数根");
        }else{
            System.out.println("此方程的实数根是X1= "+(-b+Math.sqrt(flag)/2*a));
            System.out.println("此方程的实数根是X2= "+(-b-Math.sqrt(flag)/2*a));
        }
         
    }
 
}

9.

package day8;
/**
 * 
 * 求一个三位数,该三位数等于其每一位数字的阶乘之和。
 *
 */
public class Demo8_9 {
    /**
     * 入口文件
     * @param args参数
     */
    public static void main(String[] args) {
        for(int num=100;num<=999;num++){//三位数100-999
            int ge=num%10;//个位
            int shi=num/10%10;//十位
            int bai=num/100;//百位            
            if(num==jiecheng(ge)+jiecheng(shi)+jiecheng(bai)){//三位数等于每一位阶乘之和
                System.out.println(num);//打印输出这个三位数
            }
        }
    }
    /**
     * 实现数字的阶乘
     * @param a  参数
     * @return 返回类型 int
     */
    public static int jiecheng(int a){
        int jc=1;
        if(a==0){
            return 0;//数字为0的时候阶乘为0
            }else{
                for(int i=1;i<=a;i++){
                    jc*=i;      //计算阶乘
                }
                return jc;
            }       
    }
}



<think>好的,我现在需要帮助用户解决如何使用C语言的qsort函数结构体数组中的第2到第8个元素进行排序的问题。首先,我得回忆一下qsort函数的用法。qsort的原型是void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))。其中,base是指向数组的指针,nmemb是元素个数,size是每个元素的大小,compar是比较函数。 用户的问题是要对结构体数组的特定范围进行排序,也就是从第2个到第8个元素。这通常意味着需要调整base指针和nmemb参数。因为数组索引是从0开始的,所以第2个元素对应的索引是1,第8个元素对应的索引是7。因此,需要计算起始位置和元素数量。 首先,确定base参数。假设结构体数组名为arr,那么起始地址应该是arr + 1,即指向第二个元素的指针。然后,元素个数是7(从索引1到7,共7个元素)。每个元素的大小是sizeof(struct结构体),这里需要用户根据实际情况替换成具体的结构体类型。 接下来,比较函数的编。对于结构体数组的比较,需要根据用户指定的字段进行比较。用户可能需要根据某个成员变量进行排序,比如年龄或姓名。比较函数需要将void指针转换为结构体指针,然后访问相应的成员进行比较。例如,如果按年龄升序排序,比较函数可以返回a->age - b->age。 然后,示例代码部分需要展示如何调用qsort。需要注意的是,指针的偏移应该正确,比如base参数应该是&arr[1],而元素个数是8 - 2 + 1 = 7个。这可能会让用户产生疑问,所以需要解释清楚索引的范围。 另外,用户提供的引用中有关于二维数组和结构体排序的例子,可以参考这些来构建结构体比较函数。例如,引用[3]中的示例展示了如何比较整型指针,而结构体的比较则需要根据具体成员进行调整。 可能还需要提醒用户注意数组越界的问题,确保第2到第8个元素确实存在于数组中,否则会导致未定义行为。此外,如果结构体包含动态分配的内存或字符串,比较时需要注意深拷贝的问题,但根据用户的问题描述,可能暂时不需要考虑这些复杂情况。 最后,生成相关问题的时候,需要考虑用户可能的后续问题,比如如何降序排序、如何处理多级排序(比如先按年龄再按姓名)、或者如何对不同类型的成员进行排序。这些相关问题可以帮助用户更深入地理解qsort的使用。</think>### 解答:使用qsort对结构体数组指定范围排序 #### 1. 核心步骤说明 要使用`qsort`对结构体数组的**第2到第8个元素**(假设数组索引从0开始,实际对应索引1到7)排序,需注意以下三点: - **调整起始指针**:通过指针偏移定位到第二个元素 - **计算元素数量**:索引1到7共包含7个元素 - **正确编比较函数**:根据结构体成员定义排序规则 #### 2. 完整示例代码 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义结构体 typedef struct { int id; char name[20]; double score; } Student; // 比较函数:按分数降序排序 int Compare(const void *a, const void *b) { const Student *s1 = (const Student*)a; const Student *s2 = (const Student*)b; if (s1->score > s2->score) return -1; // 降序 if (s1->score < s2->score) return 1; return 0; } int main() { Student students[10] = { {101, "Alice", 88.5}, {102, "Bob", 92.3}, {103, "Charlie", 79.8}, {104, "David", 95.1}, {105, "Eve", 85.6}, {106, "Frank", 90.0}, {107, "Grace", 87.2}, {108, "Hank", 93.7}, {109, "Ivy", 81.4}, {110, "Jack", 89.9} }; // 对索引1-7(第2到第8个元素)排序 qsort( &students[1], // 起始地址 7, // 元素数量 sizeof(Student), // 元素大小 Compare ); // 输出排序结果 for (int i = 0; i < 10; i++) { printf("%2d: %-8s %.1f\n", students[i].id, students[i].name, students[i].score); } return 0; } ``` #### 3. 关键点说明 - **指针偏移**:`&students[1]`指向第二个元素的首地址[^2] - **元素数量**:索引1到7共7个元素,对应参数值为`7` - **结构体成员访问**:比较函数中通过强制类型转换访问具体成员[^3] - **排序稳定性**:若分数相同,可以通过添加二级排序条件(如按id升序)优化 #### 4. 预期输出示例 ``` 101: Alice 88.5 // 未参与排序 108: Hank 93.7 // 排序后的第2个元素 104: David 95.1 // 排序后的第1个元素 102: Bob 92.3 106: Frank 90.0 110: Jack 89.9 107: Grace 87.2 105: Eve 85.6 109: Ivy 81.4 // 未参与排序 103: Charlie 79.8 // 未参与排序 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值