模块化设计和函数调用的综合运用

利用模块化设计思想,实现如下功能:

1)定义函数从文件中读取一组数据存入一维数组score中,返回读取的数据个数

2)定义函数,实现任意一个一维数组的前n 个元素求和,并返回最后的结果

3)定义函数实现利用二分法查找该数s是否存在数组score中,如果存在则返回对应的元素下标,否则返回-1

  1. 定义一个函数实现输入一个数x,将其从数组中删除,返回剩余的元素个数。(首先保证这个数是存在的)

5)定义一个函数,实现输入一个数x,将其插入到数组中,插入后的数组元素顺序不变,返回数组的元素个数。

6) 定义一个函数按某顺序对这数组进行排序,如果des为0,则降序,如果des为1,则升序。算法可以选择冒泡或选择排序。

程序里面测试的文件暂时放在 F:\1.txt
可以根据情况修改。
文件里面的数据格式为一行整数,整数之间用空格分开,例如: 5 84 3 1 0 7 9

#include <stdio.h>

// 1.定义函数从文件中读取一组数据存入一维数组score中,返回读取的数据个数
int read(int arr[])
{
    int n = 0;
    FILE *fp;
    fp = fopen("F:\\1.txt", "r");
    if(fp == NULL) {
        return -1;
    }
    while(!feof(fp)) {
        fscanf(fp, "%d", &arr[n]);
        n++;
    }
    fclose(fp);
    printf("数组数据个数:%d\n", n);
    return n;
}
// 2.定义函数,实现任意一个一维数组的前n 个元素求和,并返回最后的结果
int sum(int arr[], int n)
{
    int i, s = 0;
    for(i=0; i<n; i++) {
        s += arr[i];
    }
    printf("前n个元素的和:%d\n", s);
    return s;
}
// 3.定义函数实现利用二分法查找该数s是否存在数组score中,如果存在则返回对应的元素下标,否则返回-1
int search(int arr[], int n, int des)
{
    int s;
    int left = 0;
    int right = n - 1;
    int mid = 0;
    printf("请输入需要查找的元素: ");
    scanf("%d", &s);
    if(des == 0) { // 数组元素为降序顺序
        while(left <= right) {
            mid = (left + right) / 2;
            if(arr[mid] > s) {
                left = mid + 1;
            }
            else if(arr[mid] < s) {
                right = mid - 1;
            }
            else {
                printf("找到目标,%d 元素的下标是: %d\n", s, mid);
                return mid;
            }
        }
    }
    else if(des == 1) { // 数组元素为升序顺序
        while(left <= right) {
            mid = (left + right) / 2;
            if(arr[mid] < s) {
                left = mid + 1;
            }
            else if(arr[mid] > s) {
                right = mid - 1;
            }
            else {
                printf("找到目标,%d 元素的下标是: %d\n", s, mid);
                return mid;
            }
        }
    }
    printf("找不到目标\n");
    return -1;
}
// 4.定义一个函数实现输入一个数x,将其从数组中删除,返回剩余的元素个数。(首先保证这个数是存在的)
int remove(int arr[], int n)
{
    int x, i;
    printf("请输入需要删除的元素: ");
    scanf("%d", &x);
    for(i=0; i<n; i++) {
        if(arr[i] == x) {
            break;
        }
    }
    for(; i<n-1; i++) {
        arr[i] = arr[i + 1];
    }
    printf("删除成功,数组元素个数为: %d\n", n + 1);
    return (n - 1);
}
// 5.定义一个函数,实现输入一个数x,将其插入到数组中,插入后的数组元素顺序不变,返回数组的元素个数。
int insert(int arr[], int n, int des)
{
    int x, i, j;
    printf("请输入需要插入的元素: ");
    scanf("%d", &x);
    if(des == 0) { // 数组元素为降序顺序
        for(i=0; i<n; i++) {
            if(x > arr[i]) {
                break;
            }
        }
        for(j=n; j>i; j--) {
            arr[j] = arr[j - 1];
        }
        arr[i] = x;
    }
    else if(des == 1) { // 数组元素为升序顺序
        for(i=0; i<n; i++) {
            if(x < arr[i]) {
                break;
            }
        }
        for(j=n; j>i; j--) {
            arr[j] = arr[j - 1];
        }
        arr[i] = x;
    }
    printf("插入成功,数组元素个数为: %d\n", n + 1);
    return (n + 1);
}
// 6.定义一个函数按某顺序对这数组进行排序,如果des为0,则降序,如果des为1,则升序。算法可以选择冒泡或选择排序。
void sort(int arr[], int n, int des)
{
    int i, j, t;
    if(des == 0) { // 数组元素为降序顺序
        for(i=0; i<n; i++) {
            for(j=0; j<n-1-i; j++) {
                if(arr[j] < arr[j + 1]) {
                    t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
            }
        }
        printf("降序排序: ");
        for(i=0; i<n; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    else if(des == 1) { // 数组元素为升序顺序
        for(i=0; i<n; i++) {
            for(j=0; j<n-1-i; j++) {
                if(arr[j] > arr[j + 1]) {
                    t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
            }
        }
        printf("升序排序: ");
        for(i=0; i<n; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
}
// 7.输出数组所有元素
void print(int arr[], int n)
{
    int i;
    printf("输出数组所有元素: ");
    for(i=0; i<n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main()
{
    int arr[100];
    int num; // 数组元素个数
    num = read(arr);
    sort(arr, num, 1);
    sum(arr, 3);
    search(arr, num, 1);
    num = insert(arr, num, 1);
    print(arr, num);
    num = remove(arr, num);
    print(arr, num);

    return 0;
}

1

#include <stdio.h>
int main()
{
    int a[6];
    FILE* fpread;
    fpread = fopen("data.txt", "r");
    if (fpread == NULL)
    {
        printf("file is error.");
        return -1;
    }

    
        for (int j = 0; j < 6; j++)
        {
            fscanf(fpread, "%d", &a[j]);
        }
    
    fclose(fpread);

        for (int j = 0; j < 6; j++)
        {
            printf("%d\t",a[j]);
        }
        printf("\n");

    return 0;
}
2
#include<stdio.h>

int arraySum(int a[],int n)
{
int Nsum=0;  //定义一个变量存储元素的和


for(int i=0;i<n;i++)
{
Nsum=Nsum + a[i];
}
return Nsum;
}

int main()
{  
int b[5]={10,23,45,21,67};
int c= 4;
int sum = arraySum(b,c); //调用函数并传参
printf("数组b前%d位的和==%d/n",c,sum);
return 0;
}
3
#include<stdio.h>//标准输出,输入头文件

int brnary_search(int arr[],int k,int sz)//int 这个函数返回整数,注:(int arr[]接收实参数组的第一个元素地址),数组传参数不会把这个数组全部传上去,而是把数组元素首个地址传上去。
{
    int left=0;//数组的左下标
    int light=sz-1;//数组的右下标,因为sz代表数组元素的个数,因为数组下标从0开始,使用最右下标应该-1;
    while(left<=light)//循环条件左下标必须小于或等于才能进入循环。
    {
        int mid=(left+light)/2;//每次求中间的下标
        if(arr[mid]<k)//判断中间下标对应的元素值小于查找k的值。
        {
            left=mid+1;//中间下标+1,为下次循环left的值
        }
        else if(arr[mid]>k)//判断中间下标对应的元素值大于查找k的值
        {
            light=mid-1;//上面判断所查找的值小,所以新的范围应该在左边,左边下标不变,右边下标为中间下标-1;
        }
        else
        {
            return mid;//查找的值与数组值相等,返回数组下标,
        }
    }
    return -1;//当查找左下标超过右下标,代表查询整数不在数组范围内,返回-1;
}

int main()//主函数
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};//定义数组
    int k=0;
    printf("请输入想查找的整数:");
    scanf("%d",&k);//从键盘获取要查找的整数
    int sz=sizeof(arr)/sizeof(arr[0]);//求出数组里元素的个数。
    int ret=brnary_search(arr,k,sz);//创建ret 变量来接收查找返回值()里的元素代表要传的实参数。
    if(-1==ret)//判断返回值是否等于-1;
    {
        printf("找不到\n");
    }
    else
    {
        printf("找到了,下标为:%d\n",ret);//定义函数返回的数组下标。
    }
    return 0;
}
5
#include<stdio.h>//直接插入排序

void insert_array(int *a,int length,int element)//插入函数 往有序的数组a里插入值为element的元素使数组a依然有序 

{

  int i,j,t,f;

  for(i=0;i<length;i++)

  {

    if(a[i]>element)

       {

        t=i;//找到位置以后 可以依次移动数组元素腾出位置了

         for(j=length;j>=t;j--)

            {

               if(j==t)

                   a[j]=element;

           else

                  a[j]=a[j-1];//数组依次往后移动 不管正序还是倒序都可以

        }

        f=1;

        break;

      }

       

      

   }

   if(f!=1)//当element大于所有数组元素时候

   {

     a[length]=element;

   }

  for(i=0;i<length+1;i++)

  {

    printf("%d ",a[i]);

  } 

}

int main()

{

  int a[5]={1,2,3,5,6};

  int e=7;

  insert_array(a,5,e);

}
6
#include<stdio.h>
void sort(int a[],int n)
{
    int temp,i,j;
    for(i=0;i<n-1;i++)        //i<n-1是因为数组的最后一位已经在之前的运算中接受了排序。
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {temp=a[i];a[i]=a[j];a[j]=temp;}    //注意if的规范书写(加{}),不规范可能出错。
        }
    }
}
 
void PrintArr(int a[], int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
}
 
int main(void)
{
   int len,a[100],i;
   scanf("%d",&len);
   for(i=0;i<len;i++)
   {
       scanf("%d",&a[i]);
   }
   sort(a,len);
   PrintArr(a,len);
   return 0;
}