C编程(SSE)

1、输入一个3行4列的二维数组,然后输出这个二维数组的所有元素
int main()
{

    int a[3][4];
    int i,j;
    //输入数据
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    //输出数据
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }


    return 0;
}



2、用字符指针排序奥运会参与国家(小到大)
//China
//American
//Austria
//India
//Japan
#define MAX_LEN 10
#define N 150
#include <string.h>
void sortString(char *pStr[],int n);//指针数组
int main()
{
    int n;
    printf("总共有多少个国家?\n");
    scanf("%d",&n);
    getchar();
    //输入
    char name[N][MAX_LEN];
    char *pStr[N];//定义指针数组
    printf("输入各个国家名:\n");
    for(int i=0;i<n;i++)
    {
        pStr[i]=name[i];//name的第0行首地址给pStr[0]、name的第1行首地址给pStr[1]......
        gets(pStr[i]);//每次输入一个字符串
    }
    //排序
    sortString(pStr,n);//把指针数组传进去
    //输出
    printf("输出各个国家名:\n");
    for(int i=0;i<n;i++)
    {
        puts(pStr[i]);//输出排序后的n个字符串
    }

    return 0;
}

void sortString(char *pStr[],int n)
{
    char *temp=NULL;
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(strcmp(pStr[j],pStr[i])<0)
            {
                temp=pStr[i];
                pStr[i]=pStr[j];
                pStr[j]=temp;
            }
        }

    }



}





3、计算输出n阶矩阵的转置矩阵,n由用户从键盘输入
#define N 10
//向矩阵中输入数据
void InputMarix(int a[][N],int n);
//转置
void Transport(int a[][N],int n);
//输出
void PrintMatrix(int a[][N],int n);
//交换
void Swap(int *x,int *y);
int main()
{
    int n;
    int a[N][N];
    printf("Input n:");
    scanf("%d",&n);
    //向矩阵中输入数据
    InputMarix(a,n);
    //转置
    Transport(a,n);
    //输出
    printf("转置后为:\n");
    PrintMatrix(a,n);

    return 0;
}
void Swap(int *x,int *y)
{
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}



void InputMarix(int a[][N],int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }


}

void PrintMatrix(int a[][N],int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }


}

void Transport(int a[][N],int n)
{
    int temp[N];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
            //a[i][j]=a[j][i];
            Swap(&a[i][j],&a[j][i]);
        }
    }



}





4、下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a[0]中的数对调,次最小数和a[1]中的数对调。
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
#include <stdio.h>
#define N 20
void fun(int *a,int n)
{
    int i, m, t, k;
    //考察选择法排序
    for(i=0; i<2; i++)//要求最小数分别和a[0]与a[1]对调  (循环两遍)
    {
        m=i;//假设m最小
        for(k=i; k<n; k++)
        {
            if(a[k]<a[m])
                m=k;

        }

        if(m!=i)
        {
            t=a[m];
            a[m]=a[i];
            a[i]=t;
        }

    }
}
int main()
{
    int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
    for(i=0; i<n; i++)
        printf("%d ",b[i]);
    printf("\n");
    fun(b,n);
    for(i=0; i<n; i++)
        printf("%d ", b[i]);
    printf("\n");
    return 0;
}



5、程序改错。在一个3x4矩阵中找出最大数及最大数所在元素的下标。
#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol);
int main()
{
    int score[M][N], i, j, maxScore, row, col;
    for ( i=0; i<M; i++ )
    {
          for ( j=0; j<N; j++ )
          {
               scanf("%d", &score[i][j]);
          }
    }
    maxScore = FindMax(score, M, N, &row, &col);
    printf("%d %d %d\n", maxScore, row+1, col+1);
    return 0;
}

int FindMax( int (*p)[N], int m, int n, int *pRow, int *pCol )
{
    int  i, j, max;
    max = *(p)[0];//假设二维数组第一行第一个元素最大
    *pRow = 0;
    *pCol = 0;
    for (i=0; i<m; i++)
    {
        for (j = 0; j<n; j++)//j要从0开始(这里不是一维数组,不是j=i+1,不要搞混)
        {
            if ( *(*(p+i)+j) > max )//相当于if ( a[i][j] > max )  //行解引用了一次列解引用了一次
            {
                max = *(*(p+i)+j) ;
                *pRow = i;
                *pCol = j;
            }
        }
    }
    return max;

}



6、利用结构体数组计算每个学生的平均分
typedef struct date
{
    int year;
    int month;
    int day;
}DATE;
typedef struct student
{
    long studentID;
    char studentName[10];
    char studentSex;
    DATE birthday;
    int score[4];

}STUDENT;

int main()
{
    int sum[30];//计算4门课的总分
    STUDENT stu[30]={
        {100310121,"小刚",'M',{1991,5,19},{72,83,90,82}},
        {100310122,"小明",'M',{1992,8,20},{88,92,78,78}},
        {100310123,"小红",'F',{1991,9,19},{98,72,89,66}},
        {100310124,"小莉",'F',{1992,3,22},{87,95,78,90}}
    };
    for(int i=0;i<4;i++)
    {
        sum[i]=0;//初始化为0分!!!
        for(int j=0;j<4;j++)
        {
            sum[i]+=stu[i].score[j];
        }
        printf("%10ld%8s%3c%6d/%02d/%02d%4d%4d%4d%4d%6.1f\n",
               stu[i].studentID,
               stu[i].studentName,
               stu[i].studentSex,
               stu[i].birthday.year,
               stu[i].birthday.month,
               stu[i].birthday.day,
               stu[i].score[0],
               stu[i].score[1],
               stu[i].score[2],
               stu[i].score[3],
               sum[i]/4.0
               );
    }



    return 0;
}


7、
编程统计候选人的得票数。设有3个候选人li、zhang、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,
若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
      li:3
   zhang:3
    wang:2
Wrong election:2



输入格式:
"Input vote %d:"
"%s"
输出格式:
"Election results:\n"
候选人姓名+"%8s:%d\n"
"Wrong election:%d\n"


#include <string.h>
struct candidate
{
    char name[20];
    int count;

}candidate[3]={{"li",0},{"zhang",0},{"wang",0}};
int main()
{
    int flag=1;//废票
    int wrong=0,i=0,j=0;
    //10个选民,选民每次输入一个得票的候选人的名字
    char name[20];
    for(i=0;i<10;i++)
    {
        printf("Input vote %d:",i+1);
        scanf("%s",name);//输入候选人名字
        //不写这句sse不通过,因为输入可能会有大写要全转为小写(用函数strlwr),转大写用(strupr)
        strlwr(name);
        flag=1;//这句不要漏
        for(j=0;j<3;j++) //不要把j老写顺手写成i,导致找半天错没找出来
        {
            if(strcmp(name,candidate[j].name)==0)
            {
                candidate[j].count++;//被投票的+1
                flag=0;//不是废票
            }
        }
        if(flag)
        {
            wrong++;//废票
            flag=0;
        }


    }
    printf("Election results:\n");
    for(i=0;i<3;i++)
    {
        printf("%8s:%d\n",candidate[i].name,candidate[i].count);//结构体里的第i个元素的name值和count值
    }
    printf("Wrong election:%d\n",wrong);

    return 0;

}


8、
将任一整数转换为二进制形式。
**输入格式要求:"%d" 提示信息:"Input number:"
**输出格式要求:"number of decimal form:%d\n" "    it\'s binary form: "
程序运行示例如下:
Input number:876
number of decimal form:876
    it's binary form: 00000000000000000000001101101100

/*
将十进制正整数18转换成二进制数的具体计算方法如下:
18/2=9 余0;
9/2=4  余1;
4/2=2  余0;
2/2=1  余0;
1/2=0  余1;
将以上的余数结果按倒序的方式书写,转换成二进制即为:10010
*/

void decimalToBinary(int decimal)
{
    //要想前面补0,这里必须初始化为0
    int binary[32]={0};//假设整数不会超过32位
    int i=0;
    while(decimal>0)
    {
        binary[i]=decimal%2;
        decimal /=2;
        i++;
    }
    //输出二进制数,前面补0直达32位
    printf("    it\'s binary form: ");
    for(int j=31;j>=0;j--)//倒着输出 //注意是j=31不是32
    {
        printf("%d",binary[j]);
    }
    //如果二进制数不足32位,补0
//    for(int k=i;k<32;k++)
//    {
//        printf("0");
//    }
    printf("\n");
}

int main()
{
    int num;
    printf("Input number:");
    scanf("%d",&num);
    printf("number of decimal form:%d\n",num);
    decimalToBinary(num);
    return 0;
}


9、
打印出以下图案:

          *
       *  *  *
    *  *  *  *  *
 *  *  *  *  *  *  *
    *  *  *  *  *
       *  *  *
          *
输出格式:"%3c"
行与行之间无空行
注意:中间一行前面没有多余的空格,每行在*后没有空格直接输出换行

int main()
{
    int i,j,k;//i控制行,j控制列
    char c='*';
    char a=' ';
    for(i=0;i<=3;i++)
    {
        for(j=0;j<3-i;j++)
            printf("%3c",a);
        for(k=0;k<=2*i;k++)
            printf("%3c",c);
        printf("\n");
    }
    for(i=0;i<=2;i++)
    {
        for(j=0;j<i+1;j++)
            printf("%3c",a);
        for(k=0;k<=4-2*i;k++)
            printf("%3c",c);
        printf("\n");
    }


    return 0;
}


10、
下面程序用于从键盘输入3*4矩阵的元素,通过调用函数FindMax,求出这3*4矩阵元素中的最大值及其所在行列位置,
然后输出这个最大值及其所在行列下标位置(注意下标从0开始)。(找出其中的4处错误,并改正之)
#include <stdio.h>
int FindMax(int x[3][4],int *pRow,int *pCol);
main()
{
    int a[3][4], max, i, j, row, col;

    for (i=0; i<3; i++)
    {
        for (j=0; j<4; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    max = FindMax(a,&row,&col);
    printf("max=%d,row=%d,col=%d\n",max,row,col);
}
int FindMax(int x[3][4],int *pRow,int *pCol)
{
    int max, i, j;
    max = x[0][0];
    for (i=0; i<3; i++)
    {
        for (j=0; j<4; j++)
        {
            if (x[i][j] > max)
            {
                max = x[i][j];
                *pRow = i+1;
                *pCol = j+1;
            }
        }
    }
    return max;
}



11、
下面程序使用选择排序算法,对从键盘输入的学生成绩按降序排序,请找出其中的错误,并改正之。

#include<stdio.h>
#define N 40
void ReadScore(int score[], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d", &score[i]);
    }
}
void WriteScore(int score[], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ", score[i]);
    }
}
void Swap(int *x, int *y)
{
    int temp;

    temp = *x;
    *x = *y;
    *y = temp;
}
void DataSort(int score[], int n)
{
    int i, j, k;
    for (i=0; i<n-1; i++)
    {
        k = i;
        for (j=i+1; j<n; j++)
        {
            if (score[j] > score[k])
            {
                k = j;
            }
        }
        if (k != i)
        {
          Swap(&score[k],&score[i]);
        }
    }
}
int  main()
{
    int score[N],aver,n;
    printf("Input n:\n");
    scanf("%d",&n);
    ReadScore(score, n);
    DataSort(score,n);
    WriteScore(score,n);
    return 0;
}





12、下面程序使用选择排序算法,对从键盘输入的学生成绩按降序排序,请找出其中的错误,并改正之。

#include<stdio.h>
#define N 40
void ReadScore(int score[], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d", &score[i]);
    }
}
void WriteScore(int score[], int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ", score[i]);
    }
}
void Swap(int *x, int *y)
{
    int temp;

    temp = *x;
    *x = *y;
    *y = temp;
}
void DataSort(int score[], int n)
{
    int i, j, k;
    for (i=0; i<n-1; i++)
    {
        k = i;
        for (j=i+1; j<n; j++)
        {
            if (score[j] > score[k])
            {
                k = j;
            }
        }
        if (k != i)
        {
          Swap(&score[k],&score[i]);
        }
    }
}
int  main()
{
    int score[N],aver,n;
    printf("Input n:\n");
    scanf("%d",&n);
    ReadScore(score, n);
    DataSort(score,n);
    WriteScore(score,n);
    return 0;
}





-------SSE中等题------------------------------------------------------------------------------------------------

------------一维数组部分中等题---------------------------

1、从键盘输入n个整数,用函数编程实现计算其最大值和最小值,
并互换它们所在数组中的位置。

void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
int main()
{
    int a[10]={0};
    int n;
    printf("Input n(n<=10):\n");
    scanf("%d",&n);
    ReadData(a,n);
    MaxMinExchang(a,n);

    PrintData(a,n);
    return 0;
}
void ReadData(int a[], int n)
{
    //读入数据
    printf("Input %d numbers:\n",n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
}
void PrintData(int a[], int n)
{
    //输出数据
    printf("Exchange results:");
    for(int i=0;i<n;i++)
    {
        printf("%5d",a[i]);
    }
    printf("\n");
}


void MaxMinExchang(int a[], int n)
{
    int max=-9999;
    int min=9999;
    int maxpos=-1,minpos=-1;
    for(int i=0;i<n;i++)
    {
       if(a[i]>max)
       {
           maxpos=i;
           max=a[i];
       }
       if(a[i]<min)
       {
           minpos=i;
           min=a[i];
       }

    }
    a[maxpos]=min;
    a[minpos]=max;
//或者可以像下面一样写
    // 确保maxpos和minpos不是初始值-1
    if (maxpos != -1 && minpos != -1)
    {
        // 交换最大值和最小值
        int temp = a[maxpos];
        a[maxpos] = a[minpos];
        a[minpos] = temp;
    }
}













2、
下面两个表示8个产品时的固定成本和可变成本
float fixed[] = { 11.31, 12.12, 13.67, 11.91, 12.30, 11.8, 11.00, 12.00 } ;
float variable[] = { 1.12, 1.13, 3.14, 1.35, 2.20, 1.28, 1.00, 2.10 } ;

写一个程序输入编号为1到8的产品号以及生产的数量,输出生产这种产品的总成本。
注:总成本=固定成本+产品个数*可变成本
**输入格式要求:"%d"
提示信息:"请输入产品号(1-8):" "请输入该种产品的生产数量:"
**输出格式要求:"生产编号为%d,数量为%d的产品的总成本为%.2f\n"

//int main()
//{
//    int id=0;
//    int n=0;
//    float cost=0;
//    float fixed[] = { 11.31, 12.12, 13.67, 11.91, 12.30, 11.8, 11.00, 12.00 } ;
//    float variable[] = { 1.12, 1.13, 3.14, 1.35, 2.20, 1.28, 1.00, 2.10 } ;
//    printf("请输入产品号(1-8):");
//    scanf("%d",&id);
//    printf("请输入该种产品的生产数量:");
//    scanf("%d",&n);
//    cost=fixed[id-1]+n*variable[id-1];
//    printf("生产编号为%d,数量为%d的产品的总成本为%.2f\n",id,n,cost);
//
//    return 0;
//}




3、
编写一个程序,将用户输入的十进制短整型正数n转换成二进制数。
如果用户输入负数或者读入错误,则要求用户重新输入


int main()
{
    int binary[16]={0};//这里一定要初始化
    int n=0;
    printf("n=");
    scanf("%hd",&n);
    int i=0;
    while(n!=0)
    {
      binary[i]=n%2;
      n=n/2;
      i++;
    }
    printf("the binary number is ");
    for(int j=15;j>=0;j--) //前面用0补 //从最后一个倒序输出
    {
        printf("%d",binary[j]);
    }
    return 0;
}





4、编写程序,把一维数组a 输入任意6个整数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[6];
    for(int i=0;i<6;i++)
    scanf("%d",&a[i]);
    for(int i=0;i<6;i++)
    {
        for(int j=0;j<5;j++)
            printf("%d ",a[j]);
        printf("%d \n",a[5]);
        int temp=a[5];
        for(int j=5;j>0;j--)
        {
            a[j]=a[j-1];
        }
        a[0]=temp;

    }
    return 0;
}





------------最值实现(中等题)-------------

1、编程实现一个输入指定范围内的整数的函数getint,其完整的函数原型为:int getint(int min, int max);,它负责接收用户的输入,进行验证,
保证接收的一定是一个介于min和max之间([min, max]区间内)的一个整数并最后返回该整数。如果用户输入不合法,则会提示继续输入,
直到输入合法时为止。要求编写完整的程序并测试你所写的getint函数。已知[min, max]区间为[3,100]。

***输入提示信息***:"请输入[%d..%d]间的一个整数:\n"
***输入数据格式***:在getint()函数中输入数据用"%d"
***输出数据格式***:"请输入[%d..%d]间的一个整数:\n"
"你输入的整数为:%d\n"
程序的运行示例如下:
请输入[3..100]间的一个整数:0
请输入[3..100]间的一个整数:102
请输入[3..100]间的一个整数:200
请输入[3..100]间的一个整数:36
你输入的整数为:36
*/
//int getint(int min, int max);//它负责接收用户的输入,进行验证[min, max]区间内,并最后返回该整数,不合法,则会提示继续输入
//int main()
//{
//    int min=3,max=100;
//    int ret=getint(min,max);
//    printf("你输入的整数为:%d",ret);
//
//}
//int getint(int min, int max)
//{
//    int n=0;
//    do{
//        printf("请输入[%d..%d]间的一个整数:\n",min,max);
//        scanf("%d",&n);
//        // 清除输入缓冲区中的换行符或其他非数字字符
//        while (getchar() != '\n');
//    }while(n>max || n<min);
//    return n;
//}



2、按如下函数原型,编程实现计算数组a中n个整数的最大值和最小值,并互换它们在数组中的位置。
void MaxMinExchang(int a[], int n);
要求按如下函数原型,用指针做函数参数,实现两个数的互换。
void Swap(int *x, int *y);
在主函数中调用函数ReadData()从键盘输入10个整数,调用函数MaxMinExchang()计算其最大值和最小值并互换它们在数组中的位置,最后调用函数PrintData()输出互换后的数组的各个元素值。
**输入提示信息:"Input 10 numbers:"
**输入格式:"%d"
**输出提示信息:"Exchange results:"
**输出格式:"%5d
*/

#define N 20
void MaxMinExchang(int a[], int n);
void Swap(int *x, int *y);
void ReadData(int a[], int n);
void PrintData(int a[], int n);
int main()
{
    int a[N];
    int n=10;
    printf("Input 10 numbers:");
    ReadData(a,n);
    MaxMinExchang(a,n);
    printf("Exchange results:");
    PrintData(a,n);
    return 0;
}
void ReadData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

}
void Swap(int *x,int *y)
{
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}

void MaxMinExchang(int a[], int n)
{
    //计算其最大值和最小值并互换它们在数组中的位置(没要排序)
    //用单层循环就行
    int maxpos=0,minpos=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]>a[maxpos])
        {
            //max=a[j];
            maxpos=i;
        }
        if(a[i]<a[minpos])
        {
            //min=a[j];
            minpos=i;
        }

    }
    if(maxpos != minpos)
        Swap(&a[maxpos],&a[minpos]);


}

void PrintData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%5d",a[i]);
    }

}





3、要求:从键盘输入10个不同的整数存入一个数组中,用函数编程将其中的最大数与最小数位置互换,分别输出互换之前最大值和最小值及其在数组中的位置,以及互换后的数组

函数原型:void MaxMinExchang(int a[], int n);
输入提示信息:"Input 10 numbers:"
输入格式:"%d"
最大值输出提示信息:"Max element position:%d,Max element:%d\n"
最小值输出提示信息:"Min element position:%d,Min element:%d\n"
数组输出提示信息:"Exchange results:"
数组输出格式:"%4d"

程序运行结果示例:
Input 10 numbers:0 2 7 4 9 11 5 47 6 97↙
Max element position:9,Max element:97
Min element position:0,Min element:0
Exchange results: 97 2 7 4 9 11 5 47 6 0


#define N 20
void MaxMinExchang(int a[], int n);
void Swap(int *x, int *y);
void ReadData(int a[], int n);
void PrintData(int a[], int n);
int main()
{
    int a[10];
    int n=10;

    //从键盘输入10个不同的整数存入一个数组中
    ReadData(a,n);
    //最大数与最小数位置互换
    MaxMinExchang(a,n);

    //输出
    PrintData(a, n);

    return 0;
}
void ReadData(int a[], int n)
{
    printf("Input 10 numbers:");
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
}
void PrintData(int a[], int n)
{
    printf("Exchange results:");
    for(int i=0;i<n;i++)
    {
        printf("%4d",a[i]);
    }
}
void Swap(int *x,int *y)
{
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}
void MaxMinExchang(int a[], int n)
{
    int maxPos=0,maxValue=a[0];
    int minPos=0,minValue=a[0];
    for(int i=0;i<n;i++)
    {
        if(a[i]>maxValue)
        {
            maxPos=i;
            maxValue=a[i];
        }
        if(a[i]<minValue)
        {
            minPos=i;
            minValue=a[i];
        }
    }
    Swap(&a[maxPos],&a[minPos]);


    //打印最大位置,最大值,最小位置,最小值
    printf("Max element position:%d,Max element:%d\n",maxPos,maxValue);
    printf("Min element position:%d,Min element:%d\n",minPos,minValue);
}








4、 从键盘输入某班学生某门课的成绩和学号(最多不超过40人),当输入为负值时,表示输入结束,用函数编程通过返回数组中最大元素的下标,查找并输出成绩的最高分及其所在的学生学号。
**输入格式要求:"%ld%d" 提示信息:"Input student’s ID and score:" "input error!\n"
**输出格式要求:"Total students are %d\n" "The highest is:%ld, %d\n"
程序运行示例如下:
Input student’s ID and score:070310122 84
Input student’s ID and score:070310123 83
Input student’s ID and score:070310124 88
Input student’s ID and score:070310125 87
Input student’s ID and score:070310126 61
Input student’s ID and score:-1 -1
Total students are 5
The highest is:70310124, 88


#define N 40
void ReadData(int score[],int n,long id[]);
int FindMax(int score[],int n,long id[]);
int main()
{
    long id[N];
    int score[N];
    int n=-1;
    do{
        n++;
        printf("Input student’s ID and score:");
        scanf("%ld%d",&id[n],&score[n]);
    }while(score[n]>0 && id[n]>0);
    printf("Total students are %d\n",n);

    //查找并输出成绩的最高分及其所在的学生学号
    int ret=FindMax(score,n,id);
    printf("The highest is:%ld, %d\n",id[ret],score[ret]);
    return 0;
}

int FindMax(int score[],int n,long id[])
{
    //查找并输出成绩的最高分及其所在的学生学号
    int maxScore=score[0];
    int maxScoreid=id[0];
    int maxPos=0;
    for(int i=0;i<n;i++)
    {
        if(score[i]>maxScore)
        {
            maxPos=i;
            maxScore=score[i];
            maxScoreid=id[i];
        }
    }
    return maxPos;

}







5、按如下函数原型计算n名职工的最高月收入:
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum);
在主函数中从键盘输入某单位n名职工的月收入及职工号(最多不超过30人,具体人数n由键盘输入),调用函数FindMax()计算职工的最高月收入及职工号。
**输入提示信息:无
**输入格式:输入职工人数用"%d",输入职工号及月收入用"%ld%f"
**输出提示信息和格式:"Maxincome=%.2f\tMnum=%ld\n"(要求在主函数中输出最高收入和职工号)



#define N 40
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum);
int main()
{
    int n;
    float income[N];//收入
    long num[N];//职工号
    float Maxincome;//最高收入
    long Maxnum;//最高收入职工号
    scanf("%d",&n);//输入职工人数
    for(int i=0;i<n;i++)
    {
        //输入月收入和职工号
        scanf("%ld%f",&num[i],&income[i]);
    }
    //计算职工的最高月收入及职工号
    FindMax(income,num,n,&Maxincome,&Maxnum);
    //输出最高收入和职工号
    printf("Maxincome=%.2f\tMnum=%ld\n",Maxincome,Maxnum);
    return 0;
}
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum)
{
    float maxincome=income[0];
    long maxnum=num[0];
    for(int i=0;i<n;i++)
    {
        if(income[i]>maxincome)
        {
            maxincome=income[i];
            maxnum=num[i];

        }
    }
    *pMaxincome=maxincome;
    *pnum=maxnum;//将最大收入对应职工号通过指针返回



}


6、输入5个字符串,输出其中最小的字符串。
**输入格式要求:"%s"
**输出格式要求:"min is %s\n"

程序运行示例如下:
first <===输入5行字符串
second
third
44444
555555
min is 44444 <===此行为输出

*/
/*
#define N 100
#include <string.h>
int main()
{
    char str[5][N];
    char temp[100];
    //输入字符串
    for(int i=0;i<5;i++)
    {
        scanf("%s",str[i]);
    }
    //输出最小的字符串
    strcpy(temp,str[0]);
    for(int j=0;j<5;j++)
    {
        if(strcmp(str[j],temp)<0)
            strcpy(temp,str[j]);
    }
    printf("min is %s\n",temp);

    return 0;
}






7、有10个评委参加打分。输入10个评委打的分数(1—10之间的数字),找出一个最高分和一个最低分后,并输出是第几个评委打的最高分,第几个评委打的最低分。
函数原型如下:
void ReadScore(int Score[]) ; //用于输入评委的分数
void MaxMin(int Score[],int *MaxNum,int *MinNum) ;//用于找出最高分和最低分的评委
**输入提示信息:无
**输入格式:"%d"
**输出提示信息及格式:"最高分为第%d个评委,最低分为第%d个评委\n"
按如下框架编写程序:
#include <stdio.h>
voidReadScore(intScore[])
{
}
voidMaxMin(intScore[],int*MaxNum,int*MinNum)
{
}
main()
{

}



#include <stdio.h>
void ReadScore(int Score[]) ; //用于输入评委的分数
void MaxMin(int Score[],int *MaxNum,int *MinNum) ;//用于找出最高分和最低分的评委
void ReadScore(int Score[])
{
    for(int i=0;i<10;i++)
    {
        scanf("%d",&Score[i]);
    }
}

void MaxMin(int Score[],int*MaxNum,int*MinNum)
{
    int Max=Score[0];//假设最高分和最低分
    int Min=Score[0];
    for(int i=0;i<10;i++)
    {
        if(Score[i]>Max)
        {
            Max=Score[i];
            *MaxNum=i;
        }
        if(Score[i]<Min)
        {
            Min=Score[i];
            *MinNum=i;
        }
    }

}
int main()
{
    int score[10];
    int maxnum=0,minnum=0;//最高分和最低分的评委的位置
    ReadScore(score);//输入评委的分数
    MaxMin(score,&maxnum,&minnum);
    //找出最高分和最低分的评委
    printf("最高分为第%d个评委,最低分为第%d个评委\n",maxnum+1,minnum+1);

    return 0;
}




8、计算数组最大值及最大值下标。数组最多30个元素,数组元素个数n由键盘输入。
请按如下框架编程,在“......”的位置添加缺失的语句,使程序完整。


#include <stdio.h>
void Input(int a[], int n);
int Findmax(int a[], int n, int *pos);
int main()
{
    int n, a[30];
    int maxNum;//存放数组最大值
    int maxPos;//存放最大值下标
    printf("Input n:");
    scanf("%d", &n);
    Input(a, n);
    maxNum= Findmax(a,n,&maxPos);//返回最大值

    printf("The maximum subscript is:%d,The maximum value is:%d\n", maxPos+1, maxNum);
    return 0;
}
//读入数组元素的值
void Input(int a[], int n)
{
    int i;
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
}
//计算数组最大值及最大值下标
int Findmax(int a[], int n, int *pos)
{
    int i, maxNum;
    *pos = 0;
    maxNum = a[0];
    for(i=0;i<n;i++)
    {
        if(a[i]>maxNum)
        {
            maxNum=a[i];
            *pos=i;
        }
    }
    return maxNum;
}





9、从键盘输入某班学生某门课的成绩(每班人数最多不超过30人,具体人数由键盘输入),
按如下函数原型,用指针做函数参数编写函数FindMax()计算最高分及相应学生的学号返回给主函数,然后在主函数中输出最高分及相应学生的学号。

void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
**输入提示信息:
输入学生人数的提示信息为"How many students?"
输入学号和成绩的提示信息为"Input student’s ID and score:\n"
**输入数据格式:输入学生人数用"%d", 输入学号和成绩用"%ld%d"
**输出提示信息和数据格式:"maxScore = %d, maxNum = %ld\n"
按如下框架编写程序:


#include <stdio.h>
#define N 30
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
int main()
{
    //FindMax()计算最高分及相应学生的学号返回给主函数
    //在主函数中输出最高分及相应学生的学号
    int n=0;
    int score[N];
    long num[N];
    int MaxScore=score[0];
    long MaxNum=num[0];
    printf("How many students?");
    scanf("%d",&n);
    printf("Input student’s ID and score:\n");
    for(int i=0;i<n;i++)
    {
        scanf("%ld%d",&num[i],&score[i]);
    }
    FindMax(score,num,n,&MaxScore,&MaxNum);
    printf("maxScore = %d, maxNum = %ld\n",MaxScore,MaxNum);

}
//函数功能:计算最高分及其相应学生的学号

void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum)
{
    *pMaxScore=score[0];
    *pMaxNum=num[0];
    for(int i=0;i<n;i++)
    {
        if(score[i]>*pMaxScore)
        {
            *pMaxScore=score[i];
            *pMaxNum=num[i];
        }
    }



}



10、从键盘输入某单位职工的月收入(最多不超过30人),具体人数由键盘输入。试编程输出该单位职最高月收入和最低月收入。
输出格式:printf("min=%10.2f,max=%10.2f\n", );
要求:利用函数计算n名职工的最高和最低月收入。
函数原型:void find_MaxMin(float income[],int n,float *pmax,float *pmin);


#define N 30
void find_MaxMin(float income[],int n,float *pmax,float *pmin);
int main()
{
    int n=0;
    float income[N];
    float max,min;
    scanf("%d",&n);
    //输入数据
    for(int i=0;i<n;i++)
    {
        scanf("%f",&income[i]);
    }
    find_MaxMin(income,n,&max,&min);
    printf("min=%10.2f,max=%10.2f\n",max,min);
}
void find_MaxMin(float income[],int n,float *pmax,float *pmin)
{
    *pmax=income[0];
    *pmin=income[0];
    for(int i=0;i<n;i++)
    {
        if(income[i]>*pmax)
        {
            *pmax=income[i];
        }
        if(income[i]<*pmin)
        {
            *pmin=income[i];
        }
    }


}


11、写一个程序,输入十个整数到数组unsorted中。程序将循环遍历unsorted数组十遍,
每遍选择最小的值拷贝到sorted数组中的下一个可用元素位置,并将unsorted中对应的最小值替换为一个大值(例如9999)。
示例如下:

开始时的unsorted:14 22 67 31 89 11 42 35 65 49
开始时的sorted:
第一遍后的unsorted:14 22 67 31 89 9999 42 35 65 49
第一遍后的sorted:11
第二遍后的unsorted:9999 22 67 31 89 9999 42 35 65 49
第一遍后的sorted:11 14
……

显示sorted数组的值。
**输入格式要求:"%d" 提示信息:"请输入十个整数:\n" "第%d个数:"
**输出格式要求:"%d " 提示信息:"完成后sorted数组的值为:"





int main()
{
    int unsorted[10];
    int sorted[10];
    printf("请输入十个整数:\n");
    for(int i=0;i<10;i++)
    {
        printf("第%d个数:",i+1);
        scanf("%d",&unsorted[i]);
    }
    //功能实现
    for(int i=0;i<10;i++)//向sorted中放元素
    {
        int min=unsorted[0];
        int minpos=0;
        for(int j=0;j<10;j++)//找unsorted中最小元素
        {
            if(unsorted[j]<min)
            {
                min=unsorted[j];
                minpos=j;
            }
        }
        unsorted[minpos]=9999;
        sorted[i]=min;//向sorted中放元素
    }
    //输出sorted
    printf("完成sorted之后数组的值:");
    for(int i=0;i<10;i++)
    {
        printf("%d ",sorted[i]);
    }

    return 0;
}




12、要求:从键盘输入10个整数存入一个数组中,用函数编程将其中的最大数与最小数位置互换,然后输出互换后的数组。
函数原型:void MaxMinExchang(int a[], int n);
输入提示信息:"Input 10 numbers:"
输入格式:"%d"
输出提示信息:"Exchang results:"
输出格式:"%4d"
程序运行结果示例:
Input 10 numbers:0 2 7 4 9 11 5 47 6 97↙
Exchang results: 97 2 7 4 9 11 5 47 6 0

void MaxMinExchang(int a[], int n);
int main()
{
    int n=10;
    int a[10];
    printf("Input 10 numbers:");
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    //最大数与最小数位置互换
    MaxMinExchang(a,n);
    printf("Exchang results:");
    for(int i=0;i<n;i++)
    {
        printf("%4d",a[i]);
    }

    return 0;
}
void MaxMinExchang(int a[], int n)
{
    int max=a[0];
    int min=a[0];
    int maxpos=0,minpos=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]>max)
        {
            max=a[i];
            maxpos=i;
        }
        if(a[i]<min)
        {
            min=a[i];
            minpos=i;
        }
    }
    a[maxpos]=min;
    a[minpos]=max;

}



13、键盘输入10个整数,用函数编程实现计算其最大值和最小值,并互换它们所在数组中的位置。
要求按如下函数原型编写程序
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
**输入提示信息要求:
"Input n(n<=10):\n"
"Input %d numbers:\n"
**要求输入格式为:"%d"
**输出提示信息:"Exchange results:"
**要求输出格式为:"%5d"
输出数组中所有数据后换行
注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。


void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
int main()
{
    int n=0;
    int a[10];
    printf("Input n(n<=10):\n");
    scanf("%d",&n);
    ReadData(a,n);
    MaxMinExchang(a,n);
    printf("Exchange results:");
    PrintData(a,n);
    return 0;
}

void ReadData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        printf("Input %d numbers:\n",i);
        scanf("%d",&a[i]);
    }
}
void MaxMinExchang(int a[], int n)
{
    int max=a[0];
    int min=a[0];
    int maxpos=0,minpos=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]>max)
        {
            max=a[i];
            maxpos=i;
        }
        if(a[i]<min)
        {
            min=a[i];
            minpos=i;
        }
    }
    a[maxpos]=min;
    a[minpos]=max;


}
void PrintData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%5d",a[i]);
    }
}



---------改错题(中等题)----------------

1、
求100~200间的全部素数(即质数),要求每行输出10个素数。
下面程序中存在比较隐蔽的错误,
请通过分析和调试程序,发现并改正程序中的错误。
注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才得满分。
#include <stdio.h>
main()
{
int m,k,i,n;
for(m=101;m<=200;m+=2)
{
if(n%10==0)
printf("\n");
k=sqrt(m);
for(i= 1;i<=k;i++)
if(m%i==0)
continue;
if(i==m%10)
{
printf("%d ",m);
n++;
}
}
}





#include <stdio.h>
#include <math.h>
int main()
{
    int m,k,i,n=0;//初始化
    for(m=101;m<=200;m+=2)//从101开始检查奇数(因为偶数肯定不是素数)
    {
        if(n%10==0)
        {
            printf("\n");
        }
        k=(int)sqrt(m);//强制类型转换
        for(i= 2;i<=k;i++)
        {
            if(m%i==0)
            {
                break;
            }

        }
        if(i>k)//如果循环正常结束,没有被break打断,则m是素数
        {
                printf("%d ",m);
                n++;//增加已经输出素数的计数
        }

    }
    return 0;
}





---------日期转换(中等题)--------------



1、背景:钟面上的时针和分针之间的夹角总是在 0 度~ 359 度之间。
举例来说,在十二点的时候两针之间的夹角为 0 度,而在六点的时候夹角为 180 度,在三点的时候为 90 度。
本题要解决的是计算 0:00 到 12:00之间任意一个时间的夹角。
输入:要求输入必须为 小时h分钟m的格式,如12h00m, 5h43m等,其他形式的输入都不接收,
如 12,00 或5h43等输入都不被接收,而且需要对“小时”和“分钟”进行数值有效判断(小时在[0,12],分钟在[0.60]之间),不满足以上要求时,需要重新输入。
在程序中首先打印:Please input time(e.g: 5h43m),然后输入时间。
格式为:
"Please input time(e.g: 5h43m)\n"
"%d%c%d%c"
输出:对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。
格式为:
"At %d:%02d the angle is %.1f degrees.\n"
如:
输入“12h00m”时,输出 At 12:00 the angle is 0.0 degrees.
输入“5h43m” 时,输出 At 5:43 the angle is 86.5 degrees.
输入“5h5m” 时,输出 At 5:05 the angle is 122.5 degrees.

提示1:以表中心到12点的连线为基准,分针每走1分钟是6度,时针与基准的夹角每个小时也是30度,从整点开始,每过1分钟时针再增加0.5度。
要求结果角度为正值,即最终要取绝对值(fabs函数)

提示2:二者之间角度不应大于180度,如果大于,应用360度减去该角度。



//计算 0:00 到 12:00之间任意一个时间的夹角。

#include <math.h>
int main()
{
    int hour,minute;
    char ch1,ch2;
    while(1)
    {
        printf("Please input time(e.g: 5h43m)\n");
        if(scanf("%d%c%d%c",&hour,&ch1,&minute,&ch2)==4 && ch1=='h' && ch2=='m' && hour>=0 && hour<=12 && minute>=0 && minute<=59)
        {
            break;//输入有效跳出循环
        }
        else{
            while(getchar()!='\n');//清除缓冲区直到换行符
            printf("Invalid input.Please try again.\n");
        }
    }

    //计算夹角
    double angleMinute=minute*6.0;//1分钟6度
    //如果时间是 3:30,那么时针不仅仅在90度位置,还会因为过了30分钟而稍微向前移动。因此,总角度是 90 + 30 * 0.5 = 90 + 15 = 105 度。
    double angleHour=(hour%12)*30+minute*0.5;//分针走一圈,时针走30度,分钟走1分钟,时针走0.5度
    double angle=fabs(angleHour-angleMinute);//两指针之间的夹角
    if(angle>180)
    {
        angle=360-angle;
    }

    //用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。
    printf("At %d:%02d the angle is %.1f degrees.\n",hour,minute,angle);

    return 0;
}





2、给定某年某月某日,将其转换成这一年的第几天并输出。
    **输入格式要求:"%d%d%d"
    **输出格式要求:"%d"
    程序运行示例如下:
    2012 11 8
    313


int main()
{
    int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
    int year,month,day=0;
    int leap=1;
    //leap=((year%4==0 && year!=100)||(year%400==0));//leap=1是闰年
    printf("给定年月日(eg.2024 3 22):\n");
    scanf("%d%d%d",&year,&month,&day);
    for(int i=1;i<month;i++)
    {
        if((year%4==0 && year!=100)||(year%400==0))
        {
            leap=1;//是闰年
        }
        else leap=0;
        day=day+a[leap][i];
        //day=22+a[1][1]=53
        //day=53+a[1][2]=72

    }
    printf("%d",day);

    return 0;
}



3、按如下函数原型,用指针做函数参数,编程实现两个元素值的交换。
void Swap(int *x, int *y);
在主函数中输入数组元素的个数n,然后分别调用函数ReadData()输入数组a和数组b的元素值,
在循环语句中调用函数Swap()交换数组a和数组b的对应元素的值,最后在主函数中分别调用函数PrintData()输出数组a和数组b的元素值。

**输入提示信息:
"Input array size(n<=10):"
"Input array a:"
"Input array b:"
**输入格式:"%d"
**输出提示信息:
"Output array a:"
"Output array b:"
**输出格式:"%5d"
请按如下框架编程:



#include <stdio.h>
#define N 10
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void Swap(int *x, int *y);
int main()
{
    int a[N], b[N], i, n;
    printf("Input array size(n<=10):");
    scanf("%d",&n);
    printf("Input array a:");
    ReadData(a,n);
    printf("Input array b:");
    ReadData(b,n);
    //交换a和b两个数组元素
    for(int i=0;i<n;i++)
    {
        Swap(&a[i],&b[i]);
    }
    printf("Output array a:");
    PrintData(a,n);
    printf("Output array b:");
    PrintData(b,n);

    return 0;
}

//函数功能:输入数组a的n个元素值
void ReadData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
}
//函数功能:输出数组a的n个元素值
void PrintData(int a[], int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%5d",a[i]);
    }
    printf("\n");

}
//函数功能:两整数值互换
void Swap(int *x, int *y)
{
    int temp=0;
    temp=*x;
    *x=*y;
    *y=temp;
}







4、 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):
    输入某一年的第几天,计算并输出它是这一年的第几月第几日。

    函数功能: 对给定的某一年的第几天,计算它是这一年的第几月第几日
    函数入口参数:整型变量year,存储年。整型变量yearDay,存储这一年的第几天
    函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量
                  整型指针pDay,指向存储第几日的整型变量
    函数返回值: 无

    void MonthDay(int year, int yearDay, int *pMonth, int *pDay);
    输入提示信息:"Please enter year, yearDay:"
    输入格式:"%d,%d"
    输出提示信息和格式:"month = %d, day = %d\n"


void MonthDay(int year, int yearDay, int *pMonth, int *pDay);
int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
    int year=0,yearDay=0;
    int month=0,day=0;
    printf("Please enter year, yearDay:");
    scanf("%d,%d",&year,&yearDay);
    MonthDay(year,yearDay,&month,&day);
    printf("month = %d, day = %d\n",month,day);
    return 0;
}
void MonthDay(int year, int yearDay, int *pMonth, int *pDay)
{
    int i=0;
    if((year%4==0 && year!=100)||(year%400==0))//闰年
    {
        while(yearDay>a[1][i])
        {
            yearDay=yearDay-a[1][i];
            i++;
        }
        *pDay=yearDay;//最后减剩下的就是“几号”
    }
    else
    {
        while(yearDay>a[0][i])
        {
            yearDay=yearDay-a[0][i];
            i++;
        }
        *pDay=yearDay;
    }
    *pMonth=i;


}



----------选择控制结构(中等题)---------------

1、身高预测。

    每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。
    小孩成人后的身高与其父母的身高和自身的性别密切相关。
    设faHeight为其父身高,moHeight为其母身高,为float类型,身高预测公式为
    男性成人时身高 = (faHeight + moHeight) × 0.54 cm
    女性成人时身高 = (faHeight × 0.923 + moHeight) / 2 cm
    此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。

    请编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、
    父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、
    是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、
    是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好),
    利用给定公式和身高预测方法对身高进行预测。

    运行示例:
    Are you a boy(M) or a girl(F)?F↙
    Please input your father's height(cm):182↙
    Please input your mother's height(cm):162↙
    Do you like sports(Y/N)?N↙
    Do you have a good habit of diet(Y/N)?Y↙
    Your future height will be 167(cm)



int main()
{
    float faHeight,moHeight,childHeight;
    char sex;//  F/M
    char sports;//  Y/N
    char diet;
    //男性成人时身高 = (faHeight + moHeight) × 0.54 cm
    //女性成人时身高 = (faHeight × 0.923 + moHeight) / 2 cm
    //喜爱体育锻炼,那么可增加身高2%
    //良好的卫生饮食习惯,那么可增加身高1.5%
    printf("Are you a boy(M) or a girl(F)?");
    scanf(" %c",&sex);
    printf("Please input your father's height(cm):");
    scanf("%f",&faHeight);
    printf("Please input your mother's height(cm):");
    scanf("%f",&moHeight);
    printf("Do you like sports(Y/N)?");
    scanf(" %c",&sports);
    printf("Do you have a good habit of diet(Y/N)?");
    scanf(" %c",&diet);
    if(sex=='M')
    {
        childHeight=(faHeight + moHeight) * 0.54;
        if(sports=='Y')
        {
            childHeight=childHeight*1.02;
        }
        if(diet=='Y')
        {
            childHeight=childHeight*1.015;
        }

        printf("Your future height will be %f(cm)",childHeight);
    }
    else{
        childHeight=(faHeight * 0.923 + moHeight)/2.0;
        if(sports=='Y')
        {
            childHeight=childHeight*1.02;
        }
        if(diet=='Y')
        {
            childHeight=childHeight*1.015;
        }

        printf("Your future height will be %.0f(cm)",childHeight);
    }



    return 0;
}



2、
    请进行程序设计,从键盘上输入三个字符,根据其在计算机内的存储方式按照从小到大的顺序输出这三个字符。
    提示:字符输入方式可以使用scanf()或者getchar()
    输入格式:"%c%c%c"
    输出格式:"%c %c %c\n"


int main()
{
    char a[3];
    for(int i=0;i<3;i++)
    {
        a[i]=getchar();
        while(getchar()!='\n');
    }
    //从小到大输出

    char temp;
    for(int i=0;i<2;i++)
    {
        for(int j=i+1;j<3;j++)
        {
            if(a[j]<a[i])
            {
                temp=a[j];
                a[j]=a[i];
                a[i]=temp;
            }
        }
    }
    //输出
    printf("从小到大输出:");
    for(int i=0;i<3;i++)
    {
        printf("%c ",a[i]);
    }

}



//另法

void Sort(char *a,char *b)
{
    char temp;
    if(*a-*b>0)
    {
        temp=*a;
        *a=*b;
        *b=temp;
    }
}
int main()
{
    char a,b,c;
    scanf("%c%c%c",&a,&b,&c);
    Sort(&a,&b);
    Sort(&a,&c);
    Sort(&b,&c);
    printf("%c %c %c\n",a,b,c);
    return 0;
}




23机试编程真题(15’):
现有红黄紫三种肥料,价格分别为80、50、35元每袋,现要根据经费采购肥料
编写一个程序,要求输入经费费用n(1000<n<2000),输出满足以下两种条件之一的所有购买方案:
(1)紫色的袋数是黄色的1/3
(2)黄色的袋数是红色的2倍
要求输出每种情况,并且按照红黄紫的顺序输出



int main()
{
    int red,yellow,purple;
    int n=0;
    printf("输入经费(1000<n<2000):");
    scanf("%d",&n);
    if(n<=1000 || n>=2000)
    {
        printf("输入的经费不在有效范围内!\n");
        return 1;
    }

    //钱可以不用花完就这么算
//    for(red=0;red*80<=n;red++)//红色肥料袋数受预算限制
//    {
//        for(yellow=0;yellow*50<=n-red*80;yellow++)//黄色肥料袋数受预算限制
//        {
//            for(purple=0;purple*35<=n-red*80-yellow*50;purple++)//紫色肥料袋数受预算限制
//            {
//                //检查是否满足条件
//                if((yellow==3*purple || yellow == 2*red)&&(red*80+yellow*50+purple*35)<=n)
//                {
//                    printf("red=%d,yellow=%d,purple=%d\n",red,yellow,purple);
//                }
//            }
//
//        }
//
//    }

    //前全用花完就这么算
    for(red=0;red*80<=n;red++)//红色肥料袋数受预算限制
    {
        for(yellow=0;yellow*50<=n-red*80;yellow++)//黄色肥料袋数受预算限制
        {
            for(purple=0;purple*35<=n-red*80-yellow*50;purple++)//紫色肥料袋数受预算限制
            {
                //检查是否满足条件
                if((yellow==3*purple || yellow == 2*red)&&(red*80+yellow*50+purple*35)==n)
                {
                    printf("red=%d,yellow=%d,purple=%d\n",red,yellow,purple);
                }
            }

        }

    }

    return 0;
}


---------------结构体(中等题)------------------

1、以下程序有若干语法错误,不能正确输出s的成员n、s的成员b中的成员d、s的成员a的值。请找出并改正之。
输入:无
输出:Wang,11,30

#include <stdio.h>
struct date
{
    int y,m,d;
};
struct stu
{
    char n[10];
    struct date b;
    int a;
}s={"Wang",{1980,12,11},30};
int main()
{
    printf("%s,%d,%d\n",s.n,s.b.d,s.a);
    return 0;
}




2、程序改错。以下程序用于打印输出结构体数组的所有元素。


//struct s
//{
//    char name[10];
//    int age;
//};
//int main()
//{
//    struct s a[3] = {{"John",19},{"Paul",17},{"Marry",18}};
//    struct s *p=a;// 声明 p 为指向结构体 s 的指针
//    for(p = a; p < a+3; p++) // 改正循环条件
//    {
//        printf("%s,%d\n", p->name, p->age );
//    }
//    return 0;
//}


//或者
//struct s
//{
//    char name[10];
//    int age;
//};
//int main()
//{
//    struct s a[3] = {{"John",19},{"Paul",17},{"Marry",18}};
//    int p;
//    for(p = 0; p < 3; p++) // 改正循环条件
//    {
//        printf("%s,%d\n", a[p].name, a[p].age );
//    }
//    return 0;
//}




3、给定如下定义:

structdate_rec
{
intday ;
intmonth ;
intyear ;
};

写一个函数接收两个日期,如果两个日期相同,则返回0,如果第一个日期晚于第二个日期,则返回1,如果第一个日期早于第二个日期,则返回-1。并编写main函数测试它。
**输入格式要求:"%d%d%d" 提示信息:"请输入当前日期(年 月 日):"
**输出格式要求:"当前日期:%d年%d月%d日!\n" "第一个日期晚于第二个日期!" "第一个日期早于第二个日期!" "两个日期相同!"
程序运行示例如下:
请输入当前日期(年 月 日):2012 9 10↙
请输入当前日期(年 月 日):2013 7 10↙
当前日期:2012年9月10日!
当前日期:2013年7月10日!
第一个日期早于第二个日期!



struct date_rec
{
    int day ;
    int month ;
    int year ;
};
//函数声明
int compare_dates(struct date_rec date1,struct date_rec date2);

int main()
{
    //接收两个日期,如果两个日期相同,则返回0,
    //如果第一个日期晚于第二个日期,则返回1,
    //如果第一个日期早于第二个日期,则返回-1。
    struct date_rec date1,date2;
    //输入日期
    printf("请输入当前日期(年 月 日):");
    scanf("%d%d%d",&date1.year,&date1.month,&date1.day);
    printf("请输入当前日期(年 月 日):");
    scanf("%d%d%d",&date2.year,&date2.month,&date2.day);
    //输出日期
    printf("当前日期:%d年%d月%d日!\n",date1.year,date1.month,date1.day);
    printf("另一个日期:%d年%d月%d日!\n",date2.year,date2.month,date2.day);


    //比较日期并输出结果
    int result=compare_dates(date1,date2);
    switch(result)
    {
    case -1:
        printf("第一个日期早于第二个日期!");
        break;
    case 0:
        printf("两个日期相同!");
        break;
    case 1:
        printf("第一个日期晚于第二个日期!");
        break;
    default:
        printf("比较结果无效!\n");
    }

    return 0;

}

int compare_dates(struct date_rec date1,struct date_rec date2)
{

//注意:不能用“==”或者“!=”来判定两个结构体相等或者不相等
//在C语言中,判断两个结构体是否相等通常涉及比较结构体的所有成员。
//  这可以通过逐个比较结构体的每个字段来实现。如果结构体的所有字段都相等,则可以说这两个结构体相等。
//    if(date1.year==date2.year && date1.month==date2.month && date1.day==date2.day)
//    {
//        printf("两个日期相同!");
//    }

if(date1.year<date2.year)
{
    return -1;
}
else if(date1.year>date2.year)
{
    return 1;
}
else{
    if(date1.month<date2.month)
    {
        return -1;
    }
    else if(date1.month>date2.month)
    {
         return 1;
    }
    else
    {
        if(date1.day<date2.day)
        {
            return -1;
        }
        else if(date1.day>date2.day)
        {
            return 1;
        }
        else
        {
            return 0;
        }
     }
}


}




4 给定如下定义:
struct time_rec
{
    int hours ;
    int mins ;
    int secs ;
};
struct time_rec current_time;
写一个程序包含如下的函数,完成:
(a) 输入current_time的值:
void input_time(struct time_rec *current_time)
(b) 将current_time增加1秒:
void increment_time(struct time_rec *current_time)
(c) 显示current_time的新值。
void output_time(struct time_rec *current_time)
**输入格式要求:"%d%d%d" 提示信息:"请输入当前时间(时 分 秒):"
**输出格式要求:"当前时间:%d时%d分%d秒!"



void input_time(struct time_rec *current_time);
void increment_time(struct time_rec *current_time);
void output_time(struct time_rec *current_time);
struct time_rec
{
    int hours;
    int mins;
    int secs;
};
int main()
{
    struct time_rec current_time;
    printf("请输入当前时间(时 分 秒):");
    //输入时间
    input_time(&current_time);

    //输出
    printf("当前时间:");
    output_time(&current_time);

    //增加1s
    increment_time(&current_time);

    //输出增加后的时间
    printf("增加1秒后的时间:");
    output_time(&current_time);
    return 0;
}

void input_time(struct time_rec *current_time)
{
    //输入current_time的值:
    scanf("%d%d%d",&current_time->hours,&current_time->mins,&current_time->secs);
}
void increment_time(struct time_rec *current_time)
{
    //将current_time增加1秒:
    current_time->secs++;
    if(current_time->secs>59)
    {
        current_time->secs=0;
        current_time->mins++;
    }
    if(current_time->mins>59)
    {
        current_time->mins=0;
        current_time->hours++;
    }
    if(current_time->hours>23)
    {
        current_time->hours=0;
    }

}
void output_time(struct time_rec *current_time)
{
    //显示current_time的新值
    printf("%d时%d分%d秒",current_time->hours,current_time->mins,current_time->secs);
}





5、13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。
输出提示 "出圈成员及顺序:" 格式 "%3d"
输出提示 "\n最后的成员是:" 格式 "%3d"
程序的运行示例如下:
出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦)
最后的成员是: (抱歉这里的输出结果保密,暂不公开)



//int main()
//{
//
//
//
//    return 0;
//}



6、编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。
要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。
选民投票结束后程序自动显示各候选人的得票结果。
请通过分析和调试程序,发现并改正程序中的错误。
注意:将修改后的完整的源程序写在答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,
才给加10分,如果只改正了部分错误,则不加分。

程序运行示例如下:
输入
4
Li
Zhang
zha
Fun
输出
Li:1
Zhang:1
Fun:1


#include <string.h>
struct person
{
    char name[20];
    int count;
};
struct person leader[3] = {{"Li",0},{"Zhang",0},{"Fun", 0}};//在main外面初始化
int main()
{
    int i, j,n;
    char leader_name[20];
    scanf("%d\n", &n);//输入投票总数
    for(i = 0; i < n; i++)
    {
        scanf("%s", leader_name);
        for(j = 0; j < 3; j++)
        {
            if(strcmp(leader_name,leader[j].name)==0)
            {
                leader[j].count++;
            }
        }
    }
    printf("\n");
    for(i = 0; i < 3; i++)
    {
        printf("%5s:%d\n", leader[i].name, leader[i].count);
    }

    return 0;
}






7、编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,
选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。
要求用结构体数组candidate表示3个候选人的姓名和得票结果.
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
li:3
zhang:3
wang:2
Wrong election:2
输入格式:
"Input vote %d:"
"%s"
输出格式:
"Election results:\n"
"%8s:%d\n"
"Wrong election:%d\n"

#include <string.h>
struct candidate
{
    char name[20];
    int count;
};
struct candidate s[3]={{"zhang",0},{"li",0},{"wang",0}};//定义的是结构体数组!记得写方括号,字符串要用双引号
int main()
{
    int n=10;//总投票数
    char candidate_names[10][20];
    int wrong=0;
    //输入选票
    for(int i=0;i<10;i++)
    {
        printf("Input vote %d:",i+1);
        scanf("%s",candidate_names[i]);//数组名candidate[i]本身就是地址,不需要加&,注意二维数组的数组名

        int found=0;//标志位,表示是否找到了匹配的候选人
        for(int j=0;j<3;j++)//注意这里要用双重循环
        {
            if(strcmp(candidate_names[i],s[j].name)==0)//是s[i].name不是s.name[i]
            {
                s[j].count++;
                found=1;
                break;
            }
        }
        if(!found)
        {
            wrong++;
        }

    }
    printf("Election results:\n");
    for(int i = 0; i < 3; i++)
    {
        printf("%8s:%d\n", s[i].name, s[i].count);
    }
    printf("Wrong election:%d\n",wrong);//或者说wrong=10-s[0].count-s[1].count-s[2].count
    printf("Wrong election:%d\n",10-s[0].count-s[1].count-s[2].count);
    return 0;
}




8、定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天?注意闰年问题。
输入格式要求:"请输入日期(年,月,日)\n"
输出格式要求:"%d月%d日是%d年的第%d天\n"
程序的运行示例如下:
请输入日期(年,月,日)
1990,2,14↙
2月14日是1990年的第45天。



struct date
{
    int year;
    int month;
    int day;
};
char a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
    struct date s;
    int sum=0;
    printf("请输入日期(年,月,日)\n");
    scanf("%d,%d,%d",&s.year,&s.month,&s.day);
    if((s.year%4==0 && s.year%100!=0)||(s.year % 400)==0)
    {
        for(int i=0;i<s.month;i++)
        {
            sum=sum+a[1][i];
        }
        sum+=s.day;
    }
    else{
        for(int i=0;i<s.month;i++)
        {
            sum=sum+a[0][i];
        }
        sum+=s.day;
    }


    printf("%d月%d日是%d年的第%d天\n",s.month,s.day,s.year,sum);
    return 0;
}




9、以下程序有若干语法错误,不能正确输出成员a和成员v的值。请找出错误并改正之。

union
{
    int a;
    Struct
    {
        int u;
        float v;
    }b;
}
main()
{
    union uu m;
    m.a=200;
    m.u=500;
    m.v=120.5;
    printf("%d\t%f\n",m.a,m.b.v);
}



union uu
{
    int a;
    struct c
    {
        int u;
        float v;
    }b;
};
int main()
{
    union uu m;
    m.a=200;
    //m.b.u=500; 不能同时起作用
    m.b.v=120.5;
    printf("%d\t%f\n",m.a,m.b.v);
    return 0;
}




10、用结构体实现输入4个学生的学号(无符号整数)、姓名(字符串)和考试成绩(整数),然后按从高分到低分的顺序排列后输出。
程序的运行示例如下:
输入第1个学生的信息:学号、姓名、成绩
2011 zhangsan 89
输入第2个学生的信息:学号、姓名、成绩
2012 lisi 96
输入第3个学生的信息:学号、姓名、成绩
2013 wangwu 67
输入第4个学生的信息:学号、姓名、成绩
2014 liuliu 59
排序后学生的信息为:
2012 lisi 96
2011 zhangsan 89
2013 wangwu 67
2014 liuliu 59


struct student{
    unsigned long id;
    char name[20];
    int score;
};
int main()
{
    struct student stu[4];
    for(int i=0;i<4;i++)
    {
        printf("输入第%d个学生的信息:学号、姓名、成绩\n",i+1);
        scanf("%lu%19s%d",&stu[i].id,&stu[i].name,&stu[i].score);
    }
    //排序
    struct student temp;
    for(int i=0;i<3;i++)
    {
        for(int j=i+1;j<4;j++)
        {
            if(stu[j].score>stu[i].score)
            {
                temp=stu[i];
                stu[i]=stu[j];
                stu[j]=temp;
            }
        }
    }

    //输出排序后的结果
    printf("排序后的学生信息:\n");
    for(int i=0;i<4;i++)
    {
        printf("学号:%lu  姓名:%s  成绩:%d\n",stu[i].id,stu[i].name,stu[i].score);
    }
    return 0;
}






11、写一个函数days,实现主函数将年、月、日(结构体类型)传递给days函数,days函数计算该年该月该日是该年的第几天并传回主函数输出。
程序的运行示例如下:
请输入日期(年,月,日)
1990,2,14
2月14日是1990年的第45天。
输入格式:
"请输入日期(年,月,日)\n"
"%d,%d,%d"
输出格式:
"\n%d月%d日是%d年的第%d天。"



typedef struct date
{
    int year;
    int month;
    int day;
}Date;
//判断是否是闰年
int isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//计算该月之前所有月份的天数总和
int daysBeforeMonth(int year,int month)
{
    int daysInMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(isLeapYear(year))
    {
        daysInMonth[2]=29;//闰年2月有29天
    }
    int totalDays=0;
    for(int i=1;i<month;i++)
    {
        totalDays+=daysInMonth[i];
    }
    return totalDays;
}
//计算日期是该年的那一天
int daysOfYear(Date date)
{
    return daysBeforeMonth(date.year,date.month) + date.day;
}

int main()
{
    Date d;
    printf("请输入日期(年,月,日)\n");
    scanf("%d,%d,%d",&d.year,&d.month,&d.day);

    int dayOfYear=daysOfYear(d);//计算该年该月该日是该年的第几天并传回主函数输出
    printf("\n%d月%d日是%d年的第%d天。",d.month,d.day,d.year,dayOfYear);

    return 0;
}



//写法2(结构体作为函数参数)

#include <stdio.h>
#include <stdlib.h>
int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
typedef struct time
{
    int year,month,day;
}td;
void days(td *date,int *sum)
{
    if(date->year%4==0&&date->year%100!=0||date->year%400==0)//判断是闰年
    {
        for(int i=0;i<date->month-1;i++)
        {
            (*sum)+=a[1][i];
        }
        (*sum)+=date->day;
    }
    else
    {
        for(int i=0;i<date->month-1;i++)
        {
            (*sum)+=a[0][i];
        }
        (*sum)+=date->day;
    }
}
int main()
{
    td date;
    printf("请输入日期(年,月,日)\n");
    scanf("%d,%d,%d",&date.year,&date.month,&date.day);
    int sum=0;
    days(&date,&sum);
    printf("\n%d月%d日是%d年的第%d天。" ,date.month,date.day,date.year,sum);
    return 0;
}



12、中国有句俗语叫“三天打鱼两天晒网”,某人从90年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天中是在“打渔”,还是在“晒网”.
**输入格式要求:"%d%d%d" 提示信息:"Enter year/month/day:"
**输出格式要求:"He is fishing.\n" "He is sleeping.\n"
程序运行示例如下:
Enter year/month/day:1990 1 5
He is sleeping.

//思路:计算出总天数,去模5,用switch case语句

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
typedef struct time
{
    int year,month,day;
}td;

void days(td *date,int *sum)
{
    if(date->year%4==0&&date->year%100!=0||date->year%400==0)//判断是闰年
    {
        for(int i=0;i<date->month-1;i++)
        {
            (*sum)+=a[1][i];
        }
        (*sum)+=date->day;
    }
    else
    {
        for(int i=0;i<date->month-1;i++)
        {
            (*sum)+=a[0][i];
        }
        (*sum)+=date->day;
    }
}

int main()
{
    td date;
    int sum=0;
    printf("Enter year/month/day:");
    scanf("%d%d%d",&date.year,&date.month,&date.day);
    for(int i=1990;i<date.year;i++)
    {
        if(i%4==0&&i%100!=0||i%400==0)//判断闰年
            sum+=366;
        else//非闰年
            sum+=365;
    }
    days(&date,&sum);
    switch(sum%5)//这一步是关键,模5 //sum是总天数
    {
            case 1:
            case 2:
            case 3:
                {
                    printf("He is fishing.\n");
                    break;
                }
            default :
                {
                    printf("He is sleeping.\n");
                    break;
                }
    }
    return 0;
}



---------字符数组(中等题)-----------


1、输入一行字符,统计其中的英文字符、数字字符、空格字符,以及其他字符的个数。请找出以下程序的错误,并改正之。
#include <stdio.h>
#include <string.h>
#define ARR_SIZE = 80;
main()
{
charstr[ARR_SIZE];
int len, i;
int letter=0,digit=0,space=0,other=0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
for(i=0; i<len; i++)
{
if(a=<str[i]<=z || A=<str[i]<=Z)
{
letter ++;
}
elseif(0=<str[i]<=9)
{
digit ++;
}
elseif(str[i]=' ')
{
space ++;
}
else
other ++;
}
printf("英文字符数:%d\n", letter);
printf("数字字符数:%d\n", digit);
printf("空格数:%d\n", space);
printf("其他字符数:%d\n", other);
}


#include <stdio.h>
#include <string.h>
#define ARR_SIZE  80
int main()
{
    char str[ARR_SIZE];
    int len, i;
    int letter=0,digit=0,space=0,other=0;
    printf("请输入一个字符串:");
    gets(str);
    len = strlen(str);
    for(i=0; i<len; i++)
    {
        if(str[i]>='a'&&str[i]<='z' || str[i]>='A'&&str[i]<='Z')
        {
            letter ++;
        }
        else if(str[i]>='0' && str[i]<='9')//检测数字字符也要加单引号
        {
            digit ++;
        }
        else if(str[i]==' ')
        {
            space ++;
        }
        else
            other ++;
    }
    printf("英文字符数:%d\n", letter);
    printf("数字字符数:%d\n", digit);
    printf("空格数:%d\n", space);
    printf("其他字符数:%d\n", other);

    return 0;
}


----------循环控制结构(中等题)

1、将任一整数转换为二进制形式。
**输入格式要求:"%d" 提示信息:"Input number:"
**输出格式要求:"number of decimal form:%d\n" " it\'s binary form: "
程序运行示例如下:
Input number:876
number of decimal form:876
it's binary form: 00000000000000000000001101101100


将十进制正整数18转换成二进制数的具体计算方法如下:
18/2=9 余0;
9/2=4  余1;
4/2=2  余0;
2/2=1  余0;
1/2=0  余1;
将以上的余数结果按倒序的方式书写,转换成二进制即为:10010

10/2=5 余0
5/2=2  余1
2/2=1  余0
1/2=0  余1
倒序输出:1010


int main()
{
    int decimal;
    printf("Input number:");
    scanf("%d",&decimal);
    printf("number of decimal form:%d\n",decimal);
    //化为2进制
    //int shang=1;//当商为0时停止
    int yushu[32]={0};//余数
    int i=0;
    while(decimal!=0)
    {
        yushu[i]=decimal%2;//yushu=0
        decimal=decimal/2;//d=5
        i++;
    }
    //倒序输出余数数组
    for(int i=31;i>=0;i--)//注意是i=31;i>=0;不是i=32 i>0
    {
        printf("%d",yushu[i]);
    }



    return 0;
}




2、以下划线、英文字符开头的并且由下划线、英文字符和数字组成的标识符都是合法的标识符。
编写一个程序,判断输入的一行字符是否构成一个合法的C标识符(以下划线_开头的标识符视为合法的C标识符)。(假设输入的字符串非关键字且最大长度为32)
**输入格式要求:getchar()
**输出格式要求:"is\n" "is not\n"
程序运行示例1如下:
$223
is not
程序运行示例2如下:
hello world
is not
程序运行示例3如下:
hello
is



#include <string.h>
int main()
{
    char a[32];
    gets(a);
    int len=strlen(a);
    int flag=0;

    if(a[0]>='a'&&a[0]<='z' || a[0]>='A' && a[0]<='Z' || a[0]=='_')
    {
        for(int i=1;i<len;i++)
        {
            if(a[i]>='a'&&a[i]<='z' || a[i]>='A' && a[i]<='Z' || a[i]=='_')
            {
                flag=0;
            }
            else
            {
                flag=1;
                break;
            }
        }


    }
    else
    {
        flag=1;
    }
    if(flag==0)
        printf("is\n");
    else
        printf("is not\n");
    return 0;

}




3、
程序:显示法定格式的日期合同和其他法律文档中经常使用下列日期格式:
    Dated this day of ,19 .
编写程序用来显示这种格式的日期。用户以月/日的格式录入日期,然后计算机显示出“法定”格式的日期:
    Enter date (mm/dd/yy) : 7/19/96
    Dated this 19th day of July, 1996.
可以使用printf函数实现主要的格式化。然而,还有两个问题:如何为日添加“th”(或者“st”、“nd”、“rd”),
以及如何使用单词代替数字显示月份。幸运的是,switch语句可以很好地解决这两种问题:用一个switch语句负责显示日的后缀,
再用另一个switch语句显示出月份名。注意,11日、12日、13日对应的英文是th结尾。
**输入格式要求:"%d/%d/%d" 提示信息:"Enter date (mm/dd/yy):" "Dated this %d" "st/nd/rd/th" " day of " "January/February/.../December"
如果输入的日期不在合法范围内,则输出"Input error!\n"。
**输出格式要求:", 19%.2d.\n"



#include <stdio.h>
#include <stdbool.h>
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main() {
    int month, day, year;
    printf("Enter date (mm/dd/yy): ");
    if (scanf("%d/%d/%d", &month, &day, &year) != 3 || month < 1 || month > 12 || day < 1 || year < 0) {
        printf("Input error!\n");
        return 1;
    }

    // 校验日期是否合法
    int daysInMonth[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (day > daysInMonth[month - 1]) {
        printf("Input error!\n");
        return 1;
    }

    // 输出月份名称
    const char *months[] = {"January", "February", "March", "April", "May", "June",
                             "July", "August", "September", "October", "November", "December"};

    // 输出日期的后缀
    const char *suffixes[] = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
    const char *daySuffix;
    if (day % 10 == 1 && day % 100 != 11) {
        daySuffix = "st";
    } else if (day % 10 == 2 && day % 100 != 12) {
        daySuffix = "nd";
    } else if (day % 10 == 3 && day % 100 != 13) {
        daySuffix = "rd";
    } else {
        daySuffix = suffixes[day % 10];
    }

    // 格式化输出日期
    printf("Dated this %d%s day of %s, 19%.2d.\n", day, daySuffix, months[month - 1], year);

    return 0;
}



4、按如下函数原型,用指针作函数参数,编程统计数组a中奇数和偶数的个数,指针形参odd返回奇数的个数,指针形参even返回偶数的个数:
void f(int a[], int *odd, int *even);
在主函数中输入20个整数,调用函数f()统计奇数和偶数的个数并通过指针形参返回给主函数,在主函数中输出统计结果。
**输入提示信息:"input 20 numbers:"
**输入数据格式:"%d"
**输出数据格式:"Odd numbered=%d,Even numbered=%d\n"
请按如下框架编程,在“......”的位置添加缺失的语句,使程序完整。
#include <stdio.h>

功能:统计数组a中奇数和偶数的个数
参数:odd为指向奇数个数的指针
even指向偶数个数的指针
voidf(inta[], int*odd, int*even)
{
........................
}
intmain()
{
inta[20], i, odd = 0, even = 0;
printf("input 20 numbers:");
............
printf("Odd numbered=%d,Even numbered=%d\n", odd, even);
return0;
}

//统计数组a中奇数和偶数的个数,指针形参odd返回奇数的个数,指针形参even返回偶数的个数:
//在主函数中输入20个整数,调用函数f()统计奇数和偶数的个数并通过指针形参返回给主函数,在主函数中输出统计结果。

void f(int a[], int *odd, int *even)
{
    for(int i=0;i<20;i++)
    {
        if(a[i]%2==0)
            //错误地使用了*even++和*odd++,这会导致指针odd和even本身的值被递增
            (*even)++; //这里一定要加括号,先解引用even,然后递增其指向的值
        else
            (*odd)++;
    }
}
int main()
{
    int a[20], i, odd = 0, even = 0;
    printf("input 20 numbers:");
    for(i=0;i<20;i++)
    {
        scanf("%d",&a[i]);
    }
    f(a,&odd,&even);
    printf("Odd numbered=%d,Even numbered=%d\n", odd, even);
    return 0;
}



5、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数。
程序的运行示例如下:
共有多少个数?5
后移多少个?2
请以,号为间隔输入5个数。
1,2,3,4,5
移动后顺序为:
4,5,1,2,3


//做法应该是先将整个数组向后移动m个位置,然后再将最后m个元素复制到数组的前面。

#define N 20
int main()
{
    int n=0,m=0;//m为后移位数
    int num[N]={0};
    int temp[N]={0};

    printf("共有多少个数?");
    scanf("%d",&n);

    printf("后移多少个?");//2
    scanf("%d",&m);
    m%=n;//确保移动数量在有效范围内!!!

    printf("请以,号为间隔输入%d个数。\n",n);
    for(int i=0;i<n;i++)
    {
        scanf("%d,",&num[i]);
    }

    //手动移动数组【1,2,3,4,5】——m=2,n=5——》【4,5,1,2,3】
    //【先将整个数组向后移动m个位置】
    for(int i=0;i<n-m;i++)
    {
        temp[i]=num[i+m];//num数组往后移动m位,赋给temp
    }
    for(int i=0;i<m;i++)//【再将最后m个元素复制到数组的前面】
    {
        temp[n-m+i]=num[i];//num最后m位继续给temp
    }

    //如果有需要将temp数组复制回num数组
    for(int i=0;i<n;i++)
    {
        num[i]=temp[i];
    }


    printf("移动后的顺序为:\n");
    for(int j=0;j<n;j++)
    {
        printf("%d,",num[j]);
    }
    printf("\n");

    return 0;
}




6、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
**输入格式要求:"%d" 提示信息:"the total numbers is:" "back m:"
**输出格式要求:"%d," "%d"
程序运行示例1如下:
the total numbers is:5
back m:2
1 2 3 4 5
4,5,1,2,3
程序运行示例2如下:
the total numbers is:6
back m:3
1 2 3 4 5 6
4,5,6,1,2,3

#define N 20
int main()
{
    int n,m;//m是后移位数
    int num[N]={0},temp[N]={0};
    printf("the total numbers is:");
    scanf("%d",&n);
    printf("back m:");
    scanf("%d",&m);
    m%=n;//确保移动位数在有效范围内
    printf("输入%d个数:",n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
    }
    //其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
    //先将num数组的前(n-m)个元素后移m个位置,从temp[0]开始存入
    //1 2 3 4 5   m=2 n=5
    for(int i=0;i<n-m;i++)//先把num[m]到num[n-1]放到temp
    {
        temp[i]=num[i+m];//temp[0]=num[2]  temp[1]=num[3]  temp[2]=num[4]  temp[5]={3,4,5,0,0}
    }


    //将num数组的后m个,继续存入temp的末尾
    for(int i=0;i<m;i++)
    {
        temp[n-m+i]=num[i];//把num[0]到num[m-1]放到temp的末尾
        //temp[3]=num[0]
        //temp[4]=num[1]
        //temp[5]={3,4,5,1,2}
    }
    //如果有需要将temp数组复制回num数组
    for(int i=0;i<n;i++)
    {
        num[i]=temp[i];
    }
    printf("移动后的顺序为:\n");
    for(int j=0;j<n;j++)
    {
        if(j<n-1)
            printf("%d,",num[j]);
        else
            printf("%d",num[j]);//去掉最后一个逗号
    }
    printf("\n");

    return 0;
}















  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值