工大SSE(困难难度)

循环控制结构(困难已完结)

  1. 有这样一个小游戏,你可以按照下面的步骤一步一步地完成:

(1)你一般一个星期中哪一天最忙呢?如果是星期一,则选1,如果是星期二,则选2,依此类推,从1、2、3、4、5、6、7中选一个数字;

(2)将这个数字乘2;

(3)如果你是男生,则将得到的结果加4,如果你是女生,则将得到的结果加8;

(4)将得到的结果乘以50;

(5)如果你是在1~6月出生,则将得到的结果加2002,如果你是在7~12月出生,则将得到的结果加3002;

(6)将得到的结果减去你出生的年份(例如1988);

(7)取结果的后两位,得到一个两位数,将这个两位数加10。

你一定会感到惊奇,最后得到的结果竟然是你现在的年龄。请编程实现上述游戏的计算过程,并输出年龄的计算结果。(要求对不符合要求的输入提示"Invalid input." 并不再继续执行以下程序)

输入输出格式:

输出格式控制字符串:

"Please input your busiest day.\n"

"Please input your gender.\n"

"Please input your birthday.\n"

"Your age is:%d\n"

"Invalid input.\n"

输入格式控制字符串:

"%d"

" %c"

"%4d-%2d-%2d"

输入输出样例:

1)

输出:Please input your busiest day.

输入:1

输出:Please input your gender.

输入:f

输出:Please input your birthday.

输入:1988-01-01

输出:Your age is:24

2)

输出:Please input your busiest day.

输入:1

输出:Please input your gender.

输入:m

输出:Please input your birthday.

输入:1988-01-01

输出:Your age is:24

3)

输出:Please input your busiest day.

输入:8

输出:Invalid input.

4)

输出:Please input your busiest day.

输入:1

输出:Please input your gender.

输入:w

输出:Invalid input.

5)

输出:Please input your busiest day.

输入:1

输出:Please input your gender.

输入:m

输出:Please input your birthday.

输入:1987-02-29

输出:Invalid input.

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

int main()
{
    int b[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}};
    int day,year,month,date;
    char a;
    printf("Please input your busiest day.\n");
    scanf("%d",&day);
    if(day<1||day>7)
    {
        printf("Invalid input.\n");
        return 0;
    }
    day*=2;
    printf("Please input your gender.\n");
    getchar();
    scanf("%c",&a);
    if(a=='f')//如果是女孩子
        day+=8;
    else if(a=='m')
        day+=4;
    else
    {
        printf("Invalid input.\n");
        return 0;
    }
    day*=50;
    printf("Please input your birthday.\n");
    scanf("%4d-%2d-%2d",&year,&month,&date);
    if(year%4==0&&year%100!=0||year%400==0)//如果是闰年
    {
        if(month>=1&&month<=6)
        {
            if(date>b[1][month-1])
            {
                printf("Invalid input.\n");
                return 0;
            }
            day+=2002;
        }
        else if(month >=7&&month<=12)
        {
            if(date>b[1][month-1])
            {
                printf("Invalid input.\n");
                return 0;
            }
            day+=3002;
        }
        else if(month<1||month>12)
        {
            printf("Invalid input.\n");
            return 0;
        }
    }
    else
    {
        if(month>=1&&month<=6)
        {
            if(date>b[0][month-1])
            {
                printf("Invalid input.\n");
                return 0;
            }
            day+=2002;
        }
        else if(month >=7&&month<=12)
        {
            if(date>b[0][month-1])
            {
                printf("Invalid input.\n");
                return 0;
            }
            day+=3002;
        }
        else if(month<1||month>12)
        {
            printf("Invalid input.\n");
            return 0;
        }
    }
    day-=year;
    int a1=day%10;
    int day2=day/10;
    int a2=day2%10;
    int c=a2*10+a1;
    c+=10;
    printf("Your age is:%d\n",c);
    return 0;
}
  1. *对输入的行和字符进行计数。在计算机中,一行是以一个回车符\n作为行结束标记的,这样在程序中可以通过搜索\n对行进行计数。在UNIX操作系统中,一般有ctrl+d作为文件结束标记,其字符码为-1.当输入ctrl+d时表示文件输入结束,停止计数。在C语言中,以EOF(End Of File)作为文件结束标志

**输出格式要求:"chars=%d, lines=%d\n"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char a;
    int lines=0,sum=0;
    while((a=getchar())!=EOF)
    {
        if(a=='\n')
            lines++;
        sum++;
    }
    printf("chars=%d, lines=%d\n",sum,lines);
    return 0;
}
  1. 程序改错-3

从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。

#include <stdio.h>

intmain()

{

intx1, x2;

do

{

printf("Input x1, x2:");

scanf("%d,%d", &x1, &x2);

}

while(x1 * x2 > 0);

printf("x1=%d,x2=%d\n", x1, x2);

return0;

}

程序正确的运行结果示例:

Input x1, x2:

a,s

Input x1, x2:

a,1

Input x1, x2:

2,s

Input x1, x2:

1,2

Input x1, x2:

-1,-2

Input x1, x2:

0,3

Input x1, x2:

1.2,3.4

Input x1, x2:

1.2,5

Input x1, x2:

-1,3

x1=-1,x2=3

输入格式: "%d,%d"

输入提示信息:"Input x1, x2:\n"

输出格式:"x1=%d,x2=%d\n"

#include <stdio.h>
int main()
{
    int x1, x2,x,n;
    do
    {
        printf("Input x1, x2:\n");
        n=scanf("%d,%d", &x1, &x2);
        while(getchar()!='\n');
    }
    while (n!=2||x1*x2>=0);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
}
  1. 某人三天打渔两天晒网,假设他从1990年1月1日开始打渔三天,然后晒网两天,请编程回答任意的一天他在打渔还是晒网。

A boy works for 3 days while has a 2 days off. If he is working on 1st, Jan, 1990, then for a date entered from the keyboard, please write a program to determine what the boy is doing, working or resting?

Examples of input and output:

1)Input:

1990-01-05

Output:

He is having a rest.

2)Input:

1990-01-07

Output:

He is working.

3)Input:

1990-01-33

Output:

Invalid input.

***输入数据格式***:"%4d-%2d-%2d"

***输出数据格式***:"Invalid input."或"He is having a rest." 或"He is working."

#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;
    scanf("%d-%d-%d",&date.year,&date.month,&date.day);
    if(date.month>12||date.month<1||date.day>31||date.day<1||date.year<1990)//判断日期不合法
    {
        printf("Invalid input.");
        return 0;
    }
    else
    {
        if(date.year%4==0&&date.year%100!=0||date.year%400==0)
        {
            if(date.day>a[1][date.month-1])
            {
                printf("Invalid input.");
                return 0;
            }
        }
        else
        {
            if(date.day>a[0][date.month-1])
            {
                printf("Invalid input.");
                return 0;
            }
        }
    }
    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)
    {
            case 1:
            case 2:
            case 3:
                {
                    printf("He is working.\n");
                    break;
                }
            default :
                {
                    printf("He is having a rest.\n");
                    break;
                }
    }
    return 0;
}
  1. 从键盘输入1行字符串(每行最多输入80个字符),统计字符串中所包含的各个英文小写字符及其对应的数量。

**输入格式要求:不要有任何提示信息,直接输入1行字符。

**输出格式要求:按字母顺序输出统计结果,"%c=%d\n"

每行输出一个字母的统计信息。

如果某个字母没有出现,则不输出该字母的统计信息。

如:输入字符串:

abc2ed a7bcdcd

则输出:

a=2

b=2

c=3

d=3

e=1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char a[81];
    int b[26]={0};
    gets(a);
    int l=strlen(a);
    char c='a';
    for(int i=0;i<l;i++)
    {
        for(int j=0;j<26;j++)
        {
            if(a[i]==c+j)
            {
                b[j]++;
                break;
            }
        }
    }
    for(int i=0;i<26;i++)
    {
        if(b[i]!=0)
        {
            printf("%c=%d\n",c+i,b[i]);
        }
    }
    return 0;
}

最值计算(困难已完结)

  1. 输入2个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程;(4)求出各同学的平均分方差:

(1/n)(∑xi2) - ((∑xi)/ n)2

输入格式和提示信息:

"\n输入学生%4d的5个成绩:\n"

"%f"

输出格式和提示信息:

"\n 序号 课程1 2 3 4 5 平均分\n"

"\n NO%2d"

"%8.2f"

"\n课平均"

"%8.2f"

"\n\n最高分%8.2f是%d号学生的第%d门课\n"

"\n方差 %8.2f"

#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
    long num;
    float b[5];//五门课程
    float avg;
}std;
void averagestu(std a[])
{
    for(int i=0;i<2;i++)
    {
        float sum=0;
        for(int j=0;j<5;j++)
        {
            sum+=a[i].b[j];
        }
        a[i].avg=sum/5;
    }
}
void averagecourse(std a[],int n)
{
    float average=0;
    for(int i=0;i<2;i++)
    {
        average+=a[i].b[n];
    }
    printf("%8.2f",average/2);
}
void Max(std a[])
{
    float max=-1;
    int course=-1,number=0;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<5;j++)
        {
            if(max<a[i].b[j])
            {
                max=a[i].b[j];
                course=j;
                number=i;
            }
        }
    }
    printf("\n\n最高分%8.2f是%d号学生的第%d门课\n",max,number+1,course+1);
}
void Square(std a[])
{
    float sum1=0,sum2=0;
    for(int i=0;i<2;i++)
    {
        sum1+=a[i].avg*a[i].avg;
        sum2+=a[i].avg;
    }
    printf("\n方差 %8.2f",sum1/2-(sum2/2)*(sum2/2));
}
int main()
{
    std a[2];
    a[0].num=1;
    a[1].num=2;
    for(int i=0;i<2;i++)
    {
        printf("\n输入学生%4d的5个成绩:\n",a[i].num);
        for(int j=0;j<5;j++)
        {
            scanf("%f",&a[i].b[j]);
        }
    }
    averagestu(a);
    printf("\n 序号     课程1     2     3     4     5     平均分\n");
    for(int i=0;i<2;i++)
    {
        printf("\n NO%2d",a[i].num);
        for(int j=0;j<5;j++)
        {
            printf("%8.2f",a[i].b[j]);
        }
        printf("%8.2f",a[i].avg);
    }
    printf("\n课平均");
    for(int i=0;i<5;i++)
    {
        averagecourse(a,i);
    }
    Max(a);
    Square(a);
    return 0;
}
  1. 从键盘输入n个整数,用函数编程实现最大值和最小值的交换,并打印结果。

**输入格式要求:"%d"

提示信息:"Input n(n<=10):" "Input %d numbers:"

**输出结果格式要求:"%5d"

提示信息:"Exchange results:"

#include <stdio.h>
#include <stdlib.h>
void Exchange(int a[],int n)
{
    int max=a[0],min=a[0],maxpos=0,minpos=0;
    for(int i=1;i<n;i++)
    {
        if(max<a[i])
        {
            max=a[i];
            maxpos=i;
        }
        if(min>a[i])
        {
            min=a[i];
            minpos=i;
        }
    }
    a[maxpos]=min;
    a[minpos]=max;
}
int main()
{
    int n;
    int a[10];
    printf("Input n(n<=10):");
    scanf("%d",&n);
    printf("Input %d numbers:",n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        Exchange(a,n);
    printf("Exchange results:");
    for(int i=0;i<n;i++)
    {
        printf("%5d",a[i]);
    }
    return 0;
}
  1. 用指针编程实现3X4的二维数组的元素读入以及求此二维数组的最大值及最大值下标

请用以下函数实现:

void Input(int *p,int m, int n); /*数组元素读入函数*/

int FindMax(int *p, int m, int n, int *pRow, int *pCol); /*求最大值及下标函数*/

若存在若干个相同最大元素,则按照第一次出现的最大值的下标输出。

***输入提示信息:"Please input your data:\n"

***输入格式要求:无格式要求

***输出格式要求:"The maximum is %d, which is in row %d, colum %d\n"

样例:

Please input your data:

**输入样例:

3 5 2 7 1 6 12 11 4 10 8 9

**输出样例:

The maximum is 12, which is in row 1, colum 2

#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 4
void Input(int (*p)[N],int m,int n)
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",p[i]+j);
        }
    }
}
int Findmax(int (*p)[N],int m,int n,int *pRow,int *pCol)
{
    int max=*p[0];
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(max<*(p[i]+j))
            {
                max=*(p[i]+j);
                *pRow=i;
                *pCol=j;
            }
        }
    }
    return max;
}
int main()
{
    int a[M][N],max,maxposR,maxposC;
    printf("Please input your data:\n");
    Input(a,M,N);
    max=Findmax(a,M,N,&maxposR,&maxposC);
    printf("The maximum is %d, which is in row %d, colum %d\n",max,maxposR,maxposC);
    return 0;
}

一维数组(困难已完结)

  1. 英雄卡。小明非常迷恋收集各种干脆面里面的英雄卡,为此他曾经连续一个月都只吃干脆面这一种零食,但是有些稀有英雄卡真的是太难收集到了。后来某商场搞了一次英雄卡兑换活动,只要你有三张编号连续的英雄卡,你就可以换任意编号的英雄卡。小明想知道他最多可以换到几张英雄卡(新换来的英雄卡不可以再次兑换)

输入提示信息:"Input n:", "Input card numbers:"

输入数据格式:"%d"

输出数据格式:"%d"

程序运行结果示例:

Input n:6

Input card numbers:3 1 2 4 4 5

Exchanged:1

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

int main()
{
    int a[100]={0};
    printf("Input n:");
    int n;
    scanf("%d",&n);
    printf("Input card numbers:");
    int b,max=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b);
        a[b-1]++;
        if(max<b)
            max=b;
    }
    int flag=0;
    for(int i=0;i<max-2;i++)
    {
        while(a[i]>0&&a[i+1]>0&&a[i+2]>0)
        {
            a[i]--;
            a[i+1]--;
            a[i+2]--;
            flag++;
        }
    }
    printf("Exchanged:%d\n",flag);
    return 0;
}
  1. 从键盘输入每小时登录网络的用户数到一个有24个整型元素的数组中。写一个程序以如下格式显示一个报告:

时间 登录人数 所占比例

0:00 – 1:00 1 0.3

1:00 – 2:00 2 0.7

10:00 - 11:00 27 9.0

11:00 - 12:00 28 9.3

23:00 - 24:00 8 2.7

最大登录人数28发生在11:00到12:00之间

最小登录人数 1发生在 0:00到 1:00之间(两个时间段登录人数相同时,取排在前面的时间)

注意:比例后面的%省略,无需输出%,只输出%前面的数即可。

**输入格式要求:"%d" 提示信息:"请输入在%d:00和%d:00之间登录的用户数:"

**输出格式要求:

" 时间 登录人数 所占比例\n"

"%2d:00 - %2d:00 %15d %25.1f\n"

"最大登录人数%d发生在%2d:00到%2d:00之间\n"

"最小登录人数%d发生在%2d:00到%2d:00之间\n"

#include <stdio.h>
#include <stdlib.h>
#define N 24
int main()
{
    int a[N],i;
    float sum=0;
    int max=0,maxpos=0,min=1000,minpos=0;
    for(i=0;i<N;i++)
    {
        printf("请输入在%d:00和%d:00之间登录的用户数:",i,i+1);
        scanf("%d",&a[i]);
        sum+=a[i];
        if(max<a[i])
        {
            max=a[i];
            maxpos=i;
        }
        if(min>a[i])
        {
            min=a[i];
            minpos=i;
        }
    }

    printf("   时间                 登录人数                 所占比例\n");
    for(i=0;i<N;i++)
    {
        float ans=(a[i]/sum)*100;
        printf("%2d:00 - %2d:00 %15d %25.1f\n",i,i+1,a[i],ans);
    }
    printf("最大登录人数%d发生在%2d:00到%2d:00之间\n",max,maxpos,maxpos+1);
    printf("最小登录人数%d发生在%2d:00到%2d:00之间\n",min,minpos,minpos+1);
    return 0;
}
  1. 满足特异条件的数列。输入m和n(20≥m≥n≥0),求出满足以下方程式的正整数数列i1,i2,…,in,使得i1+i2+…+in=m,且i1≥i2≥…≥in。例如:

当n=4,m=8时,将得到如下5个数列:

5 1 1 1 4 2 1 1 3 3 1 1 3 2 2 1 2 2 2 2

**输入格式要求:"%d" 提示信息:"Please enter requried terms (<=10):"

" their sum:"

**输出格式要求:"There are following possible series:\n" "[%d]:" "%d"

程序运行示例1:

Please enter requried terms (<=10): 4 8

their sum:There are following possible series:

[1]:5111

[2]:4211

[3]:3311

[4]:3221

[5]:2222

程序运行示例2:

Please enter requried terms (<=10):4 10

their sum:There are following possible series:

[1]:7 1 1 1

[2]:6 2 1 1

[3]:5 3 1 1

[4]:4 4 1 1

[5]:5 2 2 1

[6]:4 3 2 1

[7]:3 3 3 1

[8]:4 2 2 2

[9]:3 3 2 2

#include<stdio.h>
#define NUM 10
int i[NUM];
int main()
{
    int sum,n,total,k,flag,count=0;
    printf("Please enter requried terms (<=10):");
    scanf("%d",&n);
    printf("                             their sum:");
    scanf("%d",&total);
    sum=0;
    k=n;
    i[n]=1;
    printf("There are following possible series:\n");
    while(1)
    {
        if(sum+i[k]<total)
        {
            if(k<=1)
            {
                i[1]=total-sum;
                flag=1;
            }
            else
            {
                sum+=i[k--];
                i[k]=i[k+1];
                continue;
            }
        }
        else if(sum+i[k]>total||k!=1)
        {
            sum-=i[++k];
            flag=0;
        }
        else
            flag=1;
        if(flag)
        {
            printf("[%d]:",++count);
            for(flag=1;flag<=n;++flag)
                printf("%d",i[flag]);
            printf("\n");
        }
        if(++k>n)
            break;
        sum-=i[k];
        i[k]++;
    }
    return 0;
}

二维数据处理(困难已完结)

  1. 某班期终考试科目为高等数学MT,英语EN和物理PH,有5人参加考试。为评定奖学金,要求统计并输出一个表格,表格内容包括学号、各科分数、总分和平均分,并标出三门课均在90分以上者(该栏标志输出“Y”,否则输出“N”),表格形式如下:

NO MT EN PH SUM V >90

------------------------------------------------------

1 88 87 83 258 86 N

2 69 90 88 247 82 N

3 77 70 79 226 75 N

4 96 99 98 293 97 Y

5 77 88 90 255 85 N

**输入格式要求:"%d" 提示信息:"Enter No. and score as: MT EN PH\n"

**输出格式要求:

"NO\tMT\tEN\tPH\tSUM\tV\t>90\n"

"------------------------------------------------------\n"

"%d\t%d\t%d\t%d\t%d\t%d\t%c\n"

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

int main()
{
    int a[5][6]={0};
    int sum;
    for(int i=0;i<5;i++)
    {
        printf("Enter No. and score as: MT EN PH\n");
        sum=0;
        scanf("%d",&a[i][0]);
        for(int j=1;j<4;j++)
        {
            scanf("%d",&a[i][j]);
            sum+=a[i][j];
        }
        a[i][4]=sum;
        a[i][5]=sum/3;
    }
    printf("NO\tMT\tEN\tPH\tSUM\tV\t>90\n");
    printf("------------------------------------------------------\n");
    for(int i=0;i<5;i++)
    {
        int flag=1;
        for(int j=0;j<6;j++)
        {
            if(a[i][j]<90&&j>=1&&j<=3)
                flag=0;
            printf("%d\t",a[i][j]);
        }
        if(flag==1)
            printf("%c\n",'Y');
        else
            printf("%c\n",'N');
    }
    return 0;
}

日期转换(困难已完结)

  1. 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):

/* 函数功能: 对给定的某年某月某日,计算它是这一年的第几天

函数参数: 整型变量year、month、day,分别代表年、月、日

函数返回值:这一年的第几天 */

int DayofYear(int year, int month, int day);

/* 函数功能: 对给定的某一年的第几天,计算它是这一年的第几月第几日

函数入口参数:整型变量year,存储年

整型变量yearDay,存储这一年的第几天

函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量

整型指针pDay,指向存储第几日的整型变量

函数返回值: 无 */

void MonthDay(int year, int yearDay, int *pMonth, int *pDay);

输出如下菜单,用switch语句实现根据用户输入的选择执行相应的操作。

1. year/month/day -> yearDay

2. yearDay -> year/month/day

3. Exit

Please enter your choice:

输入提示信息:

"Please enter year, month, day:"

"Please enter year, yearDay:"

输入格式:

"%d,%d,%d"

"%d,%d"

输出提示信息和格式:

"yearDay = %d\n"

"month = %d,day = %d\n"

#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}};
int  DayofYear(int year, int month, int day)
{
    if(year%4==0&&year%100!=0||year%400==0)//如果是闰年
    {
        for(int i=0;i<month-1;i++)
            {
                day+=a[1][i];
            }
    }
    else
    {
        for(int i=0;i<month-1;i++)
        {
            day+=a[0][i];
        }
    }
    return day;
}
void  MonthDay(int year, int yearDay, int *pMonth, int *pDay)
{
    if(year%4==0&&year%100!=0||year%400==0)//如果是闰年
    {
        int i=0;
        while(yearDay>a[1][i])
            {
                yearDay-=a[1][i];
                i++;
            }
            *pMonth=i+1;
            *pDay=yearDay;
    }
    else
    {
        int i=0;
        while(yearDay>a[0][i])
            {
                yearDay-=a[0][i];
                i++;
            }
            *pMonth=i+1;
            *pDay=yearDay;
    }
}
int main()
{
    printf("1. year/month/day -> yearDay\n");
    printf("2. yearDay -> year/month/day\n");
    printf("3. Exit\n");
    printf("Please enter your choice:");
    int n,year,month,day;
    int yearday;
    scanf("%d",&n);
    switch(n%3)
    {
    case 1:
        printf("Please enter year, month, day:");
        scanf("%d,%d,%d",&year,&month,&day);
        yearday=DayofYear(year,month,day);
        printf("yearDay = %d\n",yearday);
        break;
    case 2:
        printf("Please enter year, yearDay:");
        scanf("%d,%d",&year,&yearday);
        MonthDay(year,yearday,&month,&day);
        printf("month = %d,day = %d\n",month,day);
    default:
        break;
    }
    return 0;
}

数组(困难已完结)

  1. 某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过40人参加考试。请编程计算:(1)每个学生的总分和平均分;(2)每门课程的总分和平均分。

**输入格式要求:"%d" "%ld"(学号) 提示信息:"Input the total number of the students(n<40):" "Input student’s ID and score as: MT EN PH:\n"

**输出格式要求:"Counting Result:\n" "Student’s ID\t MT \t EN \t PH \t SUM \t AVER\n" "%12ld\t"(打印学号) "%4d\t"(打印每门课成绩)"%4d\t%5.1f\n"(打印总分和平均分) "SumofCourse \t" "%4d\t"(打印每门课的总分) "\nAverofCourse\t" "%4.1f\t"(每门课的平均分)

程序的运行示例如下:

Input the total number of the students(n<=40):4

Input student’s ID and score as: MT EN PH:

070310122 97 87 92

070310123 92 91 90

070310124 90 81 82

070310125 73 65 80

Counting Result:

Student’s ID MT EN PH SUM AVER

070310122 97 87 92 276 92.0

070310123 92 91 90 273 91.0

070310124 90 81 82 253 84.3

070310125 73 65 80 218 72.7

SumofCourse 352 324 344

AverofCourse 88.0 81.0 86.0

#include <stdio.h>
#include <stdlib.h>
#define N 40
#define M 4
int main()
{
    int a[N][M];
    long num[N];
    float aver[N]={0};//学生平均分
    int sumcourse[3]={0};//课程总分
    float avg[3]={0};//课程平均分
    printf("Input the total number of the students(n<40):");
    int n;
    scanf("%d",&n);
    printf("Input student’s ID and score as: MT  EN  PH:\n");
    for(int i=0;i<n;i++)
    {
        float sum=0;
        scanf("%ld",&num[i]);
        for(int j=0;j<M-1;j++)
        {
            scanf("%d",&a[i][j]);
            sum+=a[i][j];
        }
        a[i][M-1]=sum;
        aver[i]=sum/3;
    }
    printf("Counting Result:\n");
    printf("Student’s ID\t  MT \t  EN \t  PH \t SUM \t AVER\n");
    for(int i=0;i<n;i++)
    {
        printf("%12ld\t",num[i]);
        for(int j=0;j<M;j++)
        {
            printf("%4d\t",a[i][j]);
        }
        printf("%5.1f\n",aver[i]);
    }
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<n;j++)
        {
            sumcourse[i]+=a[j][i];
        }
        avg[i]=sumcourse[i]/n;
    }
    printf("SumofCourse \t");
    for(int i=0;i<3;i++)
    {
        printf("%4d\t",sumcourse[i]);
    }
    printf("\nAverofCourse\t");
    for(int i=0;i<3;i++)
    {
        printf("%4.1f\t",avg[i]);
    }
    return 0;
}

改错题(困难已完结)

  1. 创建动态链表并打印链表内容。要求通过键盘读入学生的学号和分数,当输入的学号为0时表示链表创建结束,并将读入的学生学号和成绩打印输出。下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。改错时不能改变程序原有的意图。

注意:将修改后的完整的源程序写在答题区内。

#include <stdio.h>

#define SIZE sizeof(struct node)

structnode

{

longnum;

floatscore;

structnode *next;

}

intmain()

{

intn = 0;

structnode *head = NULL, *p1, *p2;

p1 = p2 = (structnode*)malloc(SIZE);

printf("Input %d node data:\n", n + 1);

scanf("%d%f", &p1->num, &p1->score);

while(p1->num != 0)

{

if(++n == 1)

head = p1;

else

p2->next = p1;

p1 = p2;

p1 = (structnode*)malloc(SIZE);

printf("Input %d node data:\n", n + 1);

scanf("%d%f", &p1->num, &p1->score);

}

free(p1);

printf("Prit list:\n");

p2->next = NULL;

if(head != NULL)

{

p2=head;

while(p1 != NULL)

{

printf("num:%d\tscore:%.2f\n", p1->num, p1->score);

p1 = p1->next;

}

}

return0;

}

#include <stdio.h>
#include<stdlib.h>
#define SIZE sizeof(struct node)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
struct node
{
    long num;
    float score;
    struct node* next;
};//结构体的声明以;号作为结束
int main()
{
    int n = 0;
    struct node* head = NULL, * p1, * p2;
    p1 = p2 = (struct node*)malloc(SIZE);
    printf("Input %d node data:\n", n + 1);
    scanf("%ld,%f", &p1->num, &p1->score);//注意要用取地址符,因为p1->num指的是结构体成员变量的值
    while (p1->num != 0)
    {
        if (++n == 1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;//p2指向p1的位置
        p1 = (struct node*)malloc(SIZE);//重新向p1中输入数据
        printf("Input %d node data:\n", n + 1);
        scanf("%d,%f", &p1->num, &p1->score);//输入的时候以逗号作为分隔
    }
    free(p1);
    printf("Prit list:\n");
    p2->next = NULL;//指针的结尾变为NULL
    if (head != NULL)
    {
        p2 = head;//p2指向头指针来遍历整个链表,p1已经被free不能再使用
        while (p2 != NULL)
        {
            printf("num:%d\tscore:%.2f\n", p2->num, p2->score);
            p2 = p2->next;
        }
    }
    free(p2);//别忘记malloc的p2 也要free
    return 0;
}

简单指针变量(困难已完结)

  1. 利用指针能直接操作内存的特点来编程输出字符串中每个字符在内存中的存储编码(字符串中可以包含英文数字和汉字)。

程序的运行示例1如下:

请输入一个字符串,长度小于等于100:abcABC012中国人

该字符串的内存编码为: 61 62 63 41 42 43 30 31 32 d6 d0 b9 fa c8 cb

程序的运行示例2如下:

请输入一个字符串,长度小于等于100:12345上山打老虎

该字符串的内存编码为: 31 32 33 34 35 c9 cf c9 bd b4 f2 c0 cf bb a2

提示:

输出格式用"%x "

提示:为了不输出多余的ffff,

请用printf("%x ", (unsigned char)str[i] & 0xff);

或者

if (str[i] > 0xffffff00) printf("%x ", str[i] -0xffffff00);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char str[100];
    printf("请输入一个字符串,长度小于等于100:");
    gets(str);
    int l=strlen(str);
    printf("该字符串的内存编码为: ");
    for(int i=0;i<l;i++)
    {
        printf("%x ", (unsigned char)str[i] & 0xff);
    }
    return 0;
}

矩阵运算

  1. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小。也可能没有鞍点。

**输入数据格式:

"\n输入行数:"

"%d"

"\n输入列数:"

"%d"

"第%d行?\n"

"%d"

**输出格式要求:

"%5d"

"\n第%d行,第%d列的%d是鞍点\n"

"\n矩阵中无鞍点!\n"

程序的运行示例1如下:

输入行数:3

输入列数:3

第0行?

1 2 3

第1行?

4 5 6

第2行?

7 8 9

1 2 3

4 5 6

7 8 9

第0行,第2列的3是鞍点

程序的运行示例2如下:

输入行数:2

输入列数:2

第0行?

1 2

第1行?

4 1

1 2

4 1

矩阵中无鞍点!

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

int main()
{
    int a[10][10];
    int n,m;//m行n列
    printf("\n输入行数:");
    scanf("%d",&m);
    printf("\n输入列数:");
    scanf("%d",&n);
    for(int i=0;i<m;i++)
    {
        printf("第%d行?\n",i);
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    int flag;
    int sum=0;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
            printf("%5d",a[i][j]);
        printf("\n");
    }
    for(int i=0;i<m;i++)
    {
        int max=a[i][0];
        int maxposi=0;
        int maxposj=0;
        flag=1;
        for(int j=0;j<n;j++)
            if(max<a[i][j])
            {
                max=a[i][j];
                maxposi=i;
                maxposj=j;
            }
            for(int k=0;k<m;k++)
            {
                if(max>a[k][maxposj])
                {
                    flag=0;
                    continue;
                }
            }
            if(flag)
            {
                printf("\n第%d行,第%d列的%d是鞍点\n",maxposi,maxposj,a[maxposi][maxposj]);
                break;
            }
    }
    if(flag==0)
        printf("\n矩阵中无鞍点!\n");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值