#Linux中的GCC编程# 20170722 C培训作业

C

2017 7 22

1、函数封装与调用,输入一组数字,并计算和打印

#include"stdio.h"
/*------------------------------------------------
    @函数原型声明
------------------------------------------------*/
void input_array(int *p,int *len);    //输入函数
void output_array(int *p,int len);    //输出函数
float calculate_array(int *p,int len);   //数据处理
/*-----------------------------------------------
    @主函数
------------------------------------------------*/
int main()
{
    int array[30]={0};               //定义数组,预留30个元素空间
    int len=0;                       //定义长度,用来记录 输入的数字的个数
    float ave=0;                     //浮点型 数据,存储 平均值结果
    input_array(array,&len);     //调用输入函数
    printf("输入的数组:");      
    output_array(array,len);     //输出存入的数组
    printf("%d\n",len);          
    ave=calculate_array(array,len);  //进行数据计算
    printf("平均值是%f\n",ave);      //输出计算结果
    return 0;
}
/*------------------------------------------------
    @子函数:输入函数,传入数组首地址,长度变量的空间地址
------------------------------------------------*/
void input_array(int *p,int *len)
{
   //传入数组  和数字
   printf("请输入一批正数,以-1为结束标志!\n");
   int i=1;
   while(1)
   {
       printf("第%d个:",i++);
       scanf("%d",p);    //p是数组指针
       if(*p==-1)
       {
           break;
       }  
       ++(*len);         //用于计数

       p++;
   }   
}
/*------------------------------------------------
    @子函数:输出函数,一次输出全部数据
------------------------------------------------*/
void output_array(int *p,int len)
{
     int i=0;
     for(i=0;i<len;i++)
     {
         printf("%d ",*p);
         p++;
     }
     printf("\n");
}
/*------------------------------------------------
    @子函数:数据计算
------------------------------------------------*/
float calculate_array(int *p,int len)
{
     float sum=0;
     int i=0;
     for(i=0;i<len;i++)
     {
         sum+=*p++;            //算出数据和
     }
     return sum/(len);         //返回平均值
}


运行结果:

[root@localhost Kshine]# gcc test22.c -o test -Wall
[root@localhost Kshine]# ./test
请输入一批正数,以-1为结束标志!
第1个:1
第2个:2
第3个:3
第4个:4
第5个:5
第6个:-1
输入的数组:1 2 3 4 5 
5
平均值是3.000000

2、找出10个整型数中最大和最小值,并分别换到数组的头和尾

#include"stdio.h"
/*
    @函数原型声明
*/
void input_array(int *);         //输入
void output_array(int *);        //输出
void deal_array(int *);          //数据处理
int main()
{
   int array[10]={0};          //定义数组
   input_array(array);          //调用输入函数
   printf("交换前:");      
   output_array(array);         //输出数组(还未交换)

   deal_array(array);           //数据处理,开始交换数据

   printf("交换后:");
   output_array(array);         //输出交换之后的数组
   return 0;
}
/*----------------------------------------------------
    @子函数:输入函数,接受10个整数
----------------------------------------------------*/
void input_array(int *p)
{
    int i=0;
    printf("请输入10个整数:\n");
    for(i=0;i<10;i++)
    {
    // printf("第%d个数:",i+1);
     scanf("%d",p);
     p++; 
    }
}
/*------------------------------------------------------
    @子函数:数据处理,将最大最小放置到两端。
----------------------------------------------------*/
void deal_array(int *p)
{
    int flag_min=0,flag_max=0;         //用于记录 最大值和最小值的下标
    int i=0;                           //用于循环计数
    int *p1=p;                         //被操作的指针
    int max_num=*p,min_num=*p;         //记录最大值和最小值,用于循环比较。
  
    for(i=0;i<10;i++)
    {
        if(*p1>=max_num)
        {
            flag_max=i;               //存储 序号
            max_num=*p1;              //存储 最大值
        }
        if(*p1<=min_num)
        {
            flag_min=i;
            min_num=*p1;
        }
        p1++;
    }
    printf("最小值在数组的%d位置,最大在 %d位置\n",flag_min+1,flag_max+1);  //用于调试显示
    //开始交换,最小的放到最前面,最大的放在后面
    p1=p;
    for(i=0;i<10;i++,p1++)
    {
        if(i==flag_min&&flag_min!=0)  //指针走到了最小值的位置,对应的下标i等于flag_min
        {
             *p=*p^*p1;
             *p1=*p^*p1;
             *p=*p^*p1;         //完成数据交换 ,把最小放到 0位置

             if(flag_max==0)    //如果最大的数字恰巧在第一个,为了防止第一个数值先被交换(这样会改变最大的位置)
             {
                flag_max=i;     //最大值的位置就会转移到当前指针所在的位置
                continue;       //跳过本次循环防止进入 下方的最大值的交换过程。
             }
        }
        
        if(i==flag_max&&flag_max!=9)  //指针走到最大值的位置,对应的下表i等于flag_max
        {
            *(p+9)=*(p+9)^*p1;   
             *p1=*(p+9)^*p1;
             *(p+9)=*(p+9)^*p1;    //这里已经把 最大放到 9位置
             
             if(flag_min==9)    //如果最小恰巧在最后一个位置,这样可能会被提前交换到别的位置,需要改变最小的记录位置
             {
                  flag_min=i;
                  continue;     //跳过本次循环,留作对称之用,可以不加。
             }
        }
    }

}
/*------------------------------------------------------
     @子函数:输出函数,将数组中的数据一次输出。
-----------------------------------------------------*/
void output_array(int *p)
{
    int i=0;
    for(i=0;i<10;i++)
    {
     printf("%d ",*p);
     p++;
    }
    printf("\n");
}


运行结果:

[root@localhost Kshine]# gcc test21.c -o test -Wall 
[root@localhost Kshine]# ./test
请输入10个整数:
23 13 2 3 1 32 12 31 33 22
交换前:23 13 2 3 1 32 12 31 33 22 
最小值在数组的5位置,最大在 9位置
交换后:1 13 2 3 23 32 12 31 22 33

3、字符串的倒置

#include"stdio.h"
void upturn_string(char *);
int main()
{
    char str[30]="";
    printf("请输入一个字符串:\n");
    scanf("%s",str);
    printf("倒置前:");
    puts(str);
    upturn_string(str);

    printf("倒置后:");
    puts(str);
    return 0;
}

void upturn_string(char *str)
{
     char *p=str,*q=str;
     while(*q)q++;
     q--;
     while(p<q)
     {
         *p=*p^*q;
         *q=*p^*q;
         *p=*p^*q;
         p++;
         q--;
     }
}


运行结果:

[root@localhost Kshine]# gcc test23.c -o test -Wall 
[root@localhost Kshine]# ./test
请输入一个字符串:
Kshine2017
倒置前:Kshine2017
倒置后:7102enihsK

猜你喜欢

转载自blog.csdn.net/Kshine2017/article/details/85048110