西安交通大学915考研编程笔记

这是915编程学习笔记,仅供自己复习使用,如果你有别的实现方式,欢迎留言。本人是菜鸡一枚,不喜轻喷。考研加油!

持续更新中…【完结,不再更新2019/12/5】
因为比较久没有写C++了,忘得差不多,所以写了点笔记回顾一下
1.向函数传入结构体数组的方式有两种:
利用struct info book[]
利用typedef给结构体再取一个名字book1,之后在用book1去定义数组
2.数组传值的时候直接写函数名即可

3.比较大小后作交换的是结构体整体book[i]

4.字符匹配 strcmp(bookname, book[i].name)==0 时表示匹配成功
注意应该i#nclude

5.回车结束字符输入
法一、
char str[100];
cin.getline(str,99); //添加库函数#include
法二、
char str[100];
gets(str); //添加库函数 #include

6.判断字符长度
int len=strlen(str); //调用库函数#include

7.int k=ch[i]-'0'; //强制类型char型字符转换成int类型,并赋值给整型变量k

8.str[i]-'A' //str[i]是char型数组,转换成数组下标,用来统计大写字母的个数

9.(char)(max+'A') //max为出现字母次数最大的下标,加上’A’后转换成ASSIC码,再强制转换成char型字符,用来输出出现次数最多的字符是什么

下面才是正文!

1.标题判断回文串,以回车结束

#include 
#include 
#include //c方式调用的头文件
using namespace std;

int main()
{
    char str[100];
    //cin.getline(str,99); //c++输入方式
    gets(str);
    int len=strlen(str);
    for(int i=0;i<len/2;i++)
    {
        if(str[i]!=str[len-i-1])
        {
            cout<<"F"<<endl;
            return 0;
        }
    }
    cout<<"T"<<endl;
    return 0;
}

2.课程管理系统

#include 

#define N 1

using namespace std;

typedef struct student
{
    char name[20];
    long num;
    int zc; //正常
    int cd; //迟到
    int qj; //请假
    int kk; //旷课
    float skl; //上课率
    float kkl; //旷课率
}stu;

void intit_student(stu student[])
{
    int sum;
    cout<<"请依次输入学生的姓名、学号、正常上课次数、迟到次数、请假次数、旷课次数"<<endl;
    for(int i=0; i<N; i++)
    {
        cin>>student[i].name;
        cin>>student[i].num;
        cin>>student[i].zc;
        cin>>student[i].cd;
        cin>>student[i].qj;
        cin>>student[i].kk;
        sum=student[i].zc+student[i].cd+student[i].qj+student[i].kk; //课程总数
        cout<<sum<<endl;
        student[i].skl=(float)(student[i].zc+student[i].cd+student[i].qj)/sum;  //上课率
        student[i].kkl=(float)student[i].kk/sum;                               //旷课绿
        cout<<student[i].name<<"的上课率为:"<<student[i].skl<<endl;
        cout<<student[i].name<<"的旷课率为:"<<student[i].kkl<<endl;
    }
}

void total_info(stu student[])
{
    int sum=0,sum_sk=0,sum_kk=0;  //sum为课程总数,sum_sk为总的上课次数,sum_kk为总的旷课次数
    float sum_skl,sum_kkl;  //分别是总的上课率、旷课率
    for(int i=0; i<N; i++)
    {
        sum+=student[i].zc+student[i].cd+student[i].qj+student[i].kk;
        sum_sk+=student[i].zc+student[i].cd+student[i].qj;
        sum_kk+=student[i].kk;
    }
    sum_skl=(float)sum_sk/sum;
    sum_kkl=(float)sum_kk/sum;
    cout<<"上课率为:"<<sum_skl<<endl;
    cout<<"旷课率为:"<<sum_kkl<<endl;
}

int main()
{
    stu student[N];
    intit_student(student);
    total_info(student);
    return 0;
}

3.图书管理系统

#include 
#include 
#define N 3
using namespace std;

struct info{
    char name[20];
    int num;
    float price;
    int sale;
};

void CreatBook(struct info book[])
{
    for(int i=1; i<=N; i++)
    {
        cout<<"请输入第"<<i<<"本书的书名:";
        cin>>book[i].name;
        cout<<endl;
        cout<<"请输入第"<<i<<"本书的库存量:";
        cin>>book[i].num;
        cout<<endl;
        cout<<"请输入第"<<i<<"本书的单价:";
        cin>>book[i].price;
        cout<<endl;
        book[i].sale=0;
        cout<<endl;

    }
}
void Compare(struct info book[])
{
    char bookname[20];
    cout<<"请输入需要查询的书名:";
    cin>>bookname;
    for(int i=1; i<=N; i++)
    {
        if(strcmp(bookname, book[i].name)==0)
        {
            book[i].num--;
            book[i].sale++;
        }
    }


}
void Output(struct info book[])
{
    int maxsale;
    for(int i=1; i<=N-1; i++)
    {
        maxsale=i;
        for(int j=i+1; j<=N; j++)
        {
            if(book[j].sale > book[maxsale].sale)
                maxsale=j;
            if(maxsale!=i)
            {
                info temp=book[j];
                book[j]=book[maxsale];
                book[maxsale]=temp;
            }
        }
    }
    for(int i=1; i<=N; i++)
    {
        cout<<book[i].name<<":库存为"<<book[i].num<<"   售价为:"<<book[i].price<<"   销量为:"<<book[i].sale<<endl;
    }

}

int main()
{
    info book[N];
    CreatBook(book);
    cout<<endl;
    cout<<"售书"<<endl;
    Compare(book);
    cout<<"售书量从大到小排序"<<endl;
    Output(book);
    return 0;
}

4.成绩管理系统

#include 
#define N 3
using namespace std;
typedef struct student
{
    char name[20];
    int score;
}stu;

void info_student(stu student[], int flag)
{
    for(int i=0; i<N; i++)
    {
        cout<<"请输入第"<<i+1<<"个学生的姓名:";
        cin>>student[i].name;
        cout<<"请输入第"<<i+1<<"个学生的成绩:";
        cin>>student[i].score;
        cout<<endl;
    }
    for(int i=0; i<N-1; i++)
    {
        int min=i;
        for(int j=i+1; j<N; j++)
        {
            if(student[j].score<student[min].score)
                min=j;
        }
        stu temp=student[i];
        student[i]=student[min];
        student[min]=temp;
    }
    if(flag==1) //从小到大排序
    {
        for(int i=0; i<N; i++)
            cout<<student[i].name<<"的成绩为:"<<student[i].score<<endl;
    }
    else
    {
        for(int i=N-1; i>=0; i--)
            cout<<student[i].name<<"的成绩为:"<<student[i].score<<endl;
    }
}
int main()
{
    int flag;
    cout<<"按照从小到大排序输入1,否则输入0:";
    cin>>flag;
    stu student[N];
    info_student(student, flag);
    return 0;
}

5.投票管理系统

#include 
#include 
#define N 3
#define M 2
using namespace std;
typedef struct candidate{
    char name[20];
    int vote;
}people;

void intit_candidate(people man[])
{
    cout<<"请依次输入"<<N<<"个候选人姓名:";
    for(int i=0; i<N; i++)
    {
        cin>>man[i].name;
        man[i].vote=0;
    }
}
void StarVote(people man[])
{
    char Vname[20];
    for(int i=0; i<N; i++)
        cout<< man[i].name<<"  ";
    cout<<endl;
    cout<<"请根据以上候选人投票"<<endl;
    for(int i=0; i<M; i++)
    {
        cin>>Vname;
        for(int j=0; j<N; j++)
        {
            if(strcmp(Vname, man[j].name)==0)
                man[j].vote++;
        }
    }
    for(int i=0; i<N; i++)
        cout<<man[i].name<<"的得票为:"<<man[i].vote<<endl;
}

int main()
{
    people man[N];
    intit_candidate(man);
    StarVote(man);
    return 0;
}

6.十进制转换任意进制(建议和第20题一起看)

#include 
#include 
using namespace std;

int main()
{
    int x,y,temp,m=0,s[100]; //x为十进制数字、y为需要转换的进制
                             //temp是中间变量、m用来记数组下标、s[100]用来存结果
    cout<<"请输入一个十进制数字:";
    cin>>x;
    cout<<"请输入需要转换的进制:";
    cin>>y;
    cout<<"十进制x的"<<y<<"进制为:";

    while(x!=0)
    {
        temp=x%y;
        x=x/y;
        s[++m]=temp;  //将余数存入数组,0号位置不使用
    }

    for(int i=m; i>=1; i--)  //输出转换后的进制
    {
        if(s[i]>=10)         //将十六进制转换为对应的字母
            cout<<(char)(s[i]+55); //A的ASCII为65,所以加上55
        else
            cout<<s[i];
    }
    cout<<endl;
    return 0;
}

7.二维数组两条对角线元素之和

#include 
//#define row 3
//#define column 3
using namespace std;

int main()
{
    int row;
    int column;
    int sum=0; //统计总和
    cout<<"请依次输入行、列:";
    cin>>row;
    cin>>column;
    cout<<"输入数组:";
    int a[row][column]; //建立二维数组
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<column; j++)
            cin>>a[i][j];
    }

    //这里是测试程序用的,方便自己看写的是什么二维数组
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<column; j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }

    if(row!=column)
    {
        cout<<"error"<<endl;
        return 0;
    }

    for(int k=0; k<row; k++)
    {
        sum+=a[k][k]+a[k][column-k-1]; //自己手动画一个四维数组验算,有规律
    }
    cout<<sum<<endl;
    return 0;
}

8.统计字符串中数字、字母和其他类型字符的个数

#include 

using namespace std;

void Judge_String(char str[])
{
    int num=0,letter=0,other=0;
    for(int i=0; str[i]!='\0'; i++)
    {
        if(str[i]>='0'&&str[i]<='9')
            num++;
        else if((str[i]>='A'&&str[i]<='Z') || (str[i]>='a'&&str[i]<='z'))
            letter++;
        else
            other++;
    }
    cout<<"数字:"<<num<<endl;
    cout<<"字母:"<<letter<<endl;
    cout<<"其他:"<<other<<endl;

}
int main()
{
    char str[100];
    cout<<"请输入字符数组:";
    cin>>str;
    Judge_String(str);
    return 0;
}

9.去除字符串中所有数字字符,保留其余字符,并存回原来的空间

#include 

using namespace std;

void Delete_Digital(char str[])
{
    int i=0,j=0; //设置两个指证=针遍历,i在前面,j在后面
    while (str[i]!='\0')
    {
        if(str[i]>='0'&&str[i]<='9')
            i++;        //遇到数字只需要i前进
        else
        {
            str[j]=str[i];
            i++;
            j++;
        }
    }
    str[j]='\0';
    cout<<str<<endl;
}

int main()
{
    char str[100];
    cin>>str;
    Delete_Digital(str);
    return 0;
}

10.从一个整数m中,统计其各位上等于n的数字数目

#include 

using namespace std;

int main()
{
    int m,n,temp,counter=0; //temp用来存储余数,counter是计数器
    cout<<"青依次输入m、n:";
    cin>>m;
    cin>>n;
    if(n<0 || n>9)
    {
        cout<<"n越界"<<endl;
        return -1;
    }
    while(m!=0)
    {
        temp=m%10;
        if(temp==n)
            counter++;
        m=m/10;
    }
    cout<<"等于n的位数有"<<counter<<"个"<<endl;
    return 0;
}

11.最大相容子集合

不会做,贴一份博客上来
活动安排,贪心算法

12.输入几行字符串,字符串以*#*结束,判断输入字符里0-9的数字各有几个

#include 

using namespace std;

void Counter(char ch[],int a[],int n)
{
    int i=0;
    while(ch[i]!='\0')
    {
        if(ch[i]=='*' && ch[i+1]=='#' && ch[i+2]=='*')
            break;
        if(ch[i]>='0'&&ch[i]<='9')
        {
            int k=ch[i]-'0';   //强制类型转换成int类型的方式
            a[k]++;
        }
        i++;
    }
}

int main()
{
    int a[10]; //用来计数
    char ch[100];
    for(int i=0; i<10; i++)
        a[i]=0;
    cout<<"请输入字符串数组:";
    cin>>ch;
    Counter(ch,a,10);
    for(int i=0; i<10; i++)
        cout<<"数字"<<i<<":"<<a[i]<<"个"<<endl;
    return 0;
}

13.日期是该年第几天,例如输入日期20170812

#include 

using namespace std;

int main()
{
    int day,month,year,sum,leap;
    cout<<"请依次输入年、月、日:";
    cin>>year>>month>>day;
    switch(month)
    {
        case 1:sum=0; break;
        case 2:sum=31; break;
        case 3:sum=59; break;
        case 4:sum=90; break;
        case 5:sum=120; break;
        case 6:sum=151; break;
        case 7:sum=181; break;
        case 8:sum=212; break;
        case 9:sum=243; break;
        case 10:sum=273; break;
        case 11:sum=304; break;
        case 12:sum=334; break;
        default:cout<<"error,please input again!"<<endl; break;
    }
    sum+=day;
    if(year%400==0 || (year%4==0)&&(year%100!=0)) //400年肯定是闰年;
        leap=1;                                   //每4四年是一个闰年,并且这年不能是100的整数倍
    else                                          //也就是四年一闰,百年不闰;四百年再闰
        leap=0;
    if(leap==1&&month>2)
    {
        sum++;
    }
    cout<<"第"<<sum<<"天";
    return 0;
}

你也可以是数组存起来,用数组下标表示月份。

14.n个小球,m个盒子,每个盒子可以为空,也可以装任意数量的球,一共有多少种装法(球本身可以视作相同,比如123和321视为一种情况)

考试肯定不会,看宝典吧,估计不会再考这种了吧。。。。

15.输入若干点的坐标(x,y),x和y都是整数。当输入(0,0)时表示输入结束。现在要求输入完毕后,输出一个长方形左下角和右下角的坐标。要求长方形区域覆盖所有输入点坐标(若只输入了一个点的坐标,则可以只输出一个点)

我的想法比较粗糙,直接放进一个数组里面去,下标为奇数的存列,下标为偶数的存行,再遍历一遍,分别找出奇数和偶数序列中最大和最小的四个点,那这就是我们想要的。

#include 
#define maxsize 100
using namespace std;

int main()
{
    int x,y,len=0;  //(0,0)表示退出
    int a[maxsize];
    int i=0,j=1;
    int left,right,bottom,top;
    cout<<"依次输入(x,y)"<<endl;
    while(1)
    {
        cin>>x;
        cin>>y;
        if(x==0 && y==0)
            break;
        if(j>=maxsize)
        {
            cout<<"溢出"<<endl;
            return -1;
        }
        a[i]=x;
        a[j]=y;
        cout<<a[i]<<","<<a[j]<<endl;
        i=i+2;
        j=j+2;
        len=len+2;
        cout<<len<<endl;
    }
    left=right=a[1];  //left,right左边最低列和右边最高列
    bottom=top=a[0];    //bottom、top 最低的行和最高的行
    for(int m=0,n=1; n<=len-1; m=m+2,n=n+2)   //m扫描行,n扫描列
    {
        if(a[m]<bottom)
            bottom=a[m];

        if(a[m]>top)
            top=a[m];

        if(a[n]<left)
            left=a[n];

        if(a[n]>right)
            right=a[n];
        cout<<bottom<<" ";
        cout<<top<<" ";
        cout<<left<<" ";
        cout<<right<<" "<<endl;
    }
    //查看上下左右顶点怎么变化
    cout<<"第一个顶点为:("<<bottom<<","<<left<<")"<<endl;
    cout<<"第二个顶点为:("<<bottom<<","<<right<<")"<<endl;
    cout<<"第三个顶点为:("<<top<<","<<left<<")"<<endl;
    cout<<"第四个顶点为:("<<top<<","<<right<<")"<<endl;
    return 0;
}

上面的都是考过的,下面的是宝典后面未考过的几道重点题。实在太简单的就没写了。

16.判断含有空格的回文串

包括递归和非递归两种方式

#include 
#include 
#include 
using namespace std;

void DeleteSpace(char str[])   //空格去除
{
    int j=0;
    for(int i=0; str[i]!='\0';)
    {
        while(str[i]==' ')
            i++;
        str[j++]=str[i++];
    }
    str[j]='\0';
    cout<<"字符串为:"<<str<<endl;
}

bool JudgeString_1(char str[],int low,int high)  //利用高低指针递归方式判断是否是回文串
{
    if(low>high)
        return true;
    if(str[low]==str[high])
        return JudgeString_1(str,low+1,high-1);
    else
        return false;
}

bool JudgeString_2(char str[])  //利用栈实现
{
    stack<char> stk;
    int i=0,j=0;
    while(str[i]!='\0')
    {
        stk.push(str[i]);
        i++;
    }
    while(str[j]!='\0')
    {
        if(stk.top()!=str[j])
        {
            cout<<"F"<<endl;
            return false;
        }
        j++;
        stk.pop();
    }
    cout<<"T"<<endl;
    cout<<"输出栈的长度"<<stk.size()<<endl;
    while(!stk.empty())
    {
        cout<<stk.top()<<" "<<endl;
    }
    return true;
}


int main()
{
    char str[100];
    cout<<"输入字符串:";
    cin.getline(str,99);
    DeleteSpace(str);
    int len=strlen(str);
    cout<<len;
    cout<<"第一种方式:";
    if(JudgeString_1(str,0,len-1))
        cout<<"T"<<endl;
    else
        cout<<"F"<<endl;
    cout<<"第二种方式:";
    JudgeString_2(str);
    return 0;
}

17.给定一个整型数字,统计逆序对个数

//统计逆序对
#include 
#define N 3
using namespace std;

int main()
{
    int a[N];
    int count=0;
    cout<<"输入"<<N<<"个数:";
    for(int i=0; i<N; i++)
        cin>>a[i];
    for(int i=0; i<N-1; i++)
    {
        for(int j=1; j<N; j++)
        {
            if(a[i]>a[j])
                count++;
        }
    }
    cout<<"逆序对有:"<<count<<"个"<<endl;
    return 0;
}

18.统计字符串中子串出现的次数

//计算字符串中子串出现的次数
#include 

using namespace std;

int main()
{
    char *p1,*p2,s1[20],s2[20];
    int counter=0;
    cin.getline(s1,19);
    cin.getline(s2,19);
    p1=s1;
    p2=s2;
    while(*p1!='\0')
    {
        if(*p1==*p2 && *p2!='\0')
        {
            p1++;
            p2++;
        }
        else
            p1++;
        if(*p2=='\0')
        {
            counter++;
            p2=s2;
        }
    }
    cout<<"匹配的字符有:"<<counter<<endl;
    return 0;
}

19.编写input和output函数,输入输出5个学生的数据记录

#include 
#define N 5
#define M 5
using namespace std;
typedef struct student
{
    char name[20];
    char num[20];
    float score[M];
}stu;

void input(stu student[])
{
    for(int i=0; i<N; i++)
    {
        cout<<"请输入第"<<i+1<<"个学生的姓名:";
        cin>>student[i].name;
        cout<<"请输入第"<<i+1<<"个学生的学号:";
        cin>>student[i].num;
        for(int j=0; j<M; j++)
        {
            cout<<"请输入第"<<i+1<<"个学生的第"<<j+1<<"门成绩:";
            cin>>student[i].score[j];
        }
        cout<<endl;
    }
}

void output(stu student[])
{
    for(int i=0; i<N; i++)
    {
        cout<<student[i].name<<"的学号为:"<<student[i].num<<endl;;
        for(int j=0; j<M; j++)
        {
            cout<<"第"<<j+1<<"门成绩为:"<<student[i].score[j];
            cout<<endl;
        }
        cout<<endl;
    }
}
int main()
{
    stu student[N];
    input(student);
    output(student);
    return 0;
}

20.八进制转十进制(建议和第6题一起看)

//八进制转十进制
#include 
#define N 20
using namespace std;

int main()
{
    char *p, s[N];
    p=s;
    cout<<"请输入要转换的八进制数字:";
    cin.getline(p,10);
    int n=0;
    while(*(p)!= '\0')
    {
        n=n*8+(*p-'0');
        p++;
    }
    cout<<"十进制为:"<<n;
    return 0;
}

21.求一个数字是几位数,并将其逆序打印(不多于5位数),并判断这个数字是不是回文数

//求一个数字是几位数,并将其逆序打印(不多于5位数)
//判断这个数字是不是回文数
#include 

using namespace std;

int main()
{
    int a,b,c,d,e,f;//分别代表个、十、百、千、万
    long x;     //未知数
    cin>>x;
    a=x%10;     //个
    b=(x/10)%10; //十
    c=(x/100)%10; //百
    d=(x/1000)%10; //千
    e=(x/10000)%10; //万
    f=(x/100000)%10; //十万
    if(f!=0)
        cout<<"error"<<endl;
    else if(e!=0)
    {
        cout<<"5位数,逆序为:"<<a<<b<<c<<d<<e<<" ";
        if(a==e&&b==d)
            cout<<"是回文数"<<endl;
        else
            cout<<"不是回文数"<<endl;
    }

    else if(d!=0)
    {
        cout<<"4位数,逆序为:"<<a<<b<<c<<d<<" ";
        if(a==d&&b==c)
            cout<<"是回文数"<<endl;
        else
            cout<<"不是回文数"<<endl;
    }

    else if(c!=0)
    {
        cout<<"3位数,逆序为:"<<a<<b<<c<<" ";
        if(a==c)
            cout<<"是回文数"<<endl;
        else
            cout<<"不是回文数"<<endl;
    }
    else if(b!=0)
    {
        cout<<"2位数,逆序为:"<<a<<b<<" ";
        if(a==b)
            cout<<"是回文数"<<endl;
        else
            cout<<"不是回文数"<<endl;
    }

    else if(a!=0)
    {
        cout<<"1位数,逆序为:"<<a<<" ";
        cout<<"是回文数"<<endl;
    }
    return 0;
}

22.用递归的方式逆序输出字符数组

//用递归的方式逆序输出字符数组
#include 
using namespace std;

void fun(char *ch, int k)
{
    if(ch[k]!='\0')
        fun(ch, k+1);
    cout<<ch[k-1];  //因为多递归了一次,所以k是指向结束字符的
}

int main()
{
    char ch[20];
    cin.getline(ch, 19);
    fun(ch, 0);
    return 0;
}

23.递归求5!(当然可以用来求n!)

//递归求5!
#include 

using namespace std;

int fun(int n)
{
    if(n==1)
        return 1;
    return n*fun(n-1);
}

int main()
{
    int n=5;
    int value=fun(n);
    cout<<value<<endl;
    return 0;
}

24.求字符串的长度

//求字符串长度
#include 
#include 
using namespace std;
int length(char *str);
int main()
{
    char str[100];
    cin.getline(str,99);
//    int j=strlen(str);
//    cout<
    int len=length(str);
    cout<<"字符串长度为:"<<len<<endl;
    return 0;
}

int length(char *str)
{
    char *p=str;
    int len=0;
    while(*p!='\0')
    {
        p++;
        len++;
    }
    return len;
}

25.将字符从小到大排序

//将字符串从小到大排序
#include 
#include 
using namespace std;
void SwapString(char *s1,char *s2)
{
    char temp[20];
    strcpy(temp, s1);  //strcpy()用来复制字符串
    strcpy(s1, s2);
    strcpy(s2, temp);
}
int main()
{
    char s1[20], s2[20], s3[20];
    cin.getline(s1, 19);
    cin.getline(s2, 19);
    cin.getline(s3, 19);
    //从小到大排序
    if(strcmp(s1, s2)>0) SwapString(s1,s2);
    if(strcmp(s1, s3)>0) SwapString(s1,s3);
    if(strcmp(s2, s3)>0) SwapString(s2,s3);
    cout<<s1<<endl;
    cout<<s2<<endl;
    cout<<s3<<endl;
    return 0;
}

下面的是梁力程序设计里的几道自己总结的重点题

26.找出1~99中能被3整除并且至少有一位数字是5的所有整数、求解水仙花数

//找出1~99中能被3整除并且至少有一位数字是5的所有整数
//水仙花数
#include 

using namespace std;

int main()
{
    int counter1=0;
    int a,b,c;
    for(int i=1; i<1000; i++)
    {
        if(i%3==0)
        {
            a=i%10; //个位
            b=(i/10)%10;  //十位
            c=i/100;  //百位
            if(a==5 || b==5 || c==5)
            {
                cout<<i<<" ";
                counter1++;
                if(counter1%5==0)
                    cout<<endl;
            }

        }
    }

    cout<<endl;
    cout<<"水仙花数"<<endl;
    for(int i=100; i<1000; i++)
    {
        int d=i%10; //个位
        int e=(i/10)%10; //十位
        int f=i/100; //百位
        if((d*d*d+e*e*e+f*f*f)==i)
            cout<<i<<" ";
    }
    return 0;
}

27.任给一个自然数将其因式分解

//任给一个自然数将其因式分解
#include 

using namespace std;

int main()
{
    int x;
    int temp=2;
    cin>>x;
    if(x<1)
        cout<<"error"<<endl;
    cout<<x<<"=1";
    while(1)
    {
        if(x%temp==0)
        {
            cout<<"*"<<temp;
            x=x/temp;
        }
        else
            temp++;
        if(x==1)
            break;
    }
    return 0;
}

28.输入一串字符串,以$结束。分别统计数字字符、大写字母出现的次数,并按照大写字母出现的次数从多到少依次输出,不出现的字母不输出

//输入一串字符串,以$结束。分别统计数字字符、大写字母出现的次数,并按照大写字母出现的
//次数从多到少依次输出,不出现的字母不输出
#include 
#include 
using namespace std;

int main()
{
    char str[100];
    int c1[10],c2[26];  //c1统计数字出现的次数c2统计大写字母出现的次数
    int num=10,letter=0;
//    初始化两个数组
    for(int i=0;i<10;i++)
        c1[i]=0;
    for(int i=0;i<26;i++)
        c2[i]=0;
//        字符输入
    cout<<"输入字符并且以$结束:";
    cin.getline(str,99);
//        数字和字母统计
    for(int i=0;str[i]!='$';i++)
    {
        //统计数字个数
        if(str[i]>='0'&&str[i]<='9')
        {
            num++;
            c1[str[i]-'0']++;  //强制类型转换成int型一定要会
        }
        //统计字母个数
        if(str[i]>='A'&&str[i]<='Z')
        {
            letter++;
            c2[str[i]-'A']++;   //转换成数组下标
        }
    }
//    数字出现个数
    for(int i=0;i<10;i++)
        cout<<i<<"出现:"<<c1[i]<<endl;
    cout<<endl;

//      字母出现个数
    for(int i=1;i<26;i++)
    {
        int max=0;
        for(int j=1;j<26;j++)
        {
            if(c2[j]>c2[max])
                max=j;
        }
        if(c2[max]!=0)
        {
            cout<<(char)(max+'A')<<"出现:"<<c2[max]<<endl;  //注意强制类型转换方式
            c2[max]=0;
        }
        else
            break;
    }
    return 0;
}

29.数组A和B相同元素存储在数组C中

//数组A和B相同元素存储在数组C中
//思想:分别对数组A和数组B进行快速排序,在对其进行遍历
//时间复杂度为O(nlogn)
#include 

using namespace std;

//对区间[left,right]进行划分
int Partition(int A[],int left, int right)
{
    int temp =A[left]; //存放到临时变量temp

    while(left < right) //只要left与right不相遇
    {
        while(left < right && A[right] > temp)
            right--;//反复左移
        A[left] = A[right];

        while(left < right && A[left] <= temp)
            left++;//反复右移
        A[right] = A[left];
    }

    A[left] = temp;    //把temp放到right与left相遇的地方
    return left;    //返回相遇下标
}
//快速排序,left与right初值为序列下标(例如 1 与 n)
void quicksort(int A[], int left, int right)
{
    if(left < right) // 当前区间的长度超过1
    {
        int pos = Partition(A,left,right);
        quicksort(A, left, pos-1);  //对左子区间递归进行快速排序
        quicksort(A, pos+1, right); //对右子区间递归进行快速排序
    }
}

int main()
{
    int A[100],B[100],C[200];
//  相同元素存储在C
    int len_A,len_B,len_C=0;
    int m=0,n=0;
//    初始化
    cout<<"依次输入数组A、B的长度:";
    cin>>len_A>>len_B;
    cout<<len_A<<"个元素:";
    for(int i=0;i<len_A;i++)
        cin>>A[i];
    cout<<len_B<<"个元素:";
    for(int i=0;i<len_B;i++)
        cin>>B[i];

//    快速排序
    quicksort(A,0,len_A-1);
    quicksort(B,0,len_B-1);
//    求相同元素
    while(m<len_A&&n<len_B)
    {
        if(A[m]==B[n])
        {
            C[len_C]=A[m];
            len_C++;
            m++;
            n++;
        }
        else if(A[m]>B[n])
            n++;
        else
            m++;
    }

    if(len_C>0)
    {
        cout<<"数组C的元素:";
        for(int i=0;i<len_C;i++)
            cout<<C[i]<<" ";
        cout<<endl;
    }
    else
        cout<<"两个数组无公共元素"<<endl;
    return 0;
}

31.数组A与数组B相同元素存到数组C,数组A特有元素存到数组D,数组B特有元素存到数组E

//数组A与数组B相同元素存到数组C
//数组A特有元素存到数组D
//数组B特有元素存到数组E
#include 

using namespace std;

int main()
{
    int A[100],B[100],C[100],D[100],E[100];
    int len_A,len_B,len_C=0,len_D=0,len_E=0;
//    初始化
    cout<<"依次输入数组A、B的长度:";
    cin>>len_A>>len_B;
    cout<<len_A<<"个元素:";
    for(int i=0;i<len_A;i++)
        cin>>A[i];
    cout<<len_B<<"个元素:";
    for(int i=0;i<len_B;i++)
        cin>>B[i];

    for(int i=0; i<len_A;i++)
    {
        int flag=0;
        for(int j=0; j<len_B; j++)
        {
            if(A[i]==B[j])
            {
                flag=1;
                C[len_C++]=A[i];
                break;
            }
        }
        //A跟B不同的元素存到D中
        if(!flag)
            D[len_D++]=A[i];
    }

    for(int i=0; i<len_B;i++)
    {
        int flag=0;
        for(int j=0; j<len_C; j++)
        {
            if(B[i]==C[j])
            {
                flag=1;
                break;
            }
        }
        //A跟B不同的元素存到D中
        if(!flag)
            E[len_E++]=B[i];
    }

    if(len_C>0)
    {
        cout<<"数组C中元素有:";
        for(int i=0; i<len_C; i++)
            cout<<C[i]<<" ";
        cout<<endl;
    }
    else
        cout<<"数组C长度为0"<<endl;

    if(len_D>0)
    {
        cout<<"数组D中元素有:";
        for(int i=0; i<len_D; i++)
            cout<<D[i]<<" ";
        cout<<endl;
    }
    else
        cout<<"数组D长度为0"<<endl;

    if(len_E>0)
    {
        cout<<"数组E中元素有:";
        for(int i=0; i<len_E; i++)
            cout<<E[i]<<" ";
        cout<<endl;
    }
    else
        cout<<"数组E长度为0"<<endl;
    return 0;
}

32.约瑟夫环,M个人围成一圈,数到第n个人的时候除圈

//约瑟夫环,M个人围成一圈,数到第n个人的时候除圈
#include 
#define M 8
using namespace std;
int main()
{
    int a[M],i,j,k;
    int n;
    cout<<"输入n的值:";
    cin>>n;
    for(i=0; i<M; i++)
        a[i]=i+1;
    i=0;
    for(j=M; j>0; j--)
    {
        i=(i+n-1)%j; //出圈的编号
        cout<<"出圈的编号为:"<<a[i]<<endl;
        for(k=i; k<j-1; k++)
            a[k]=a[k+1];
    }
    cout<<endl;
    return 0;
}

33.写一个squeeze(s1,s2)函数,它删除字符串s1中与s2中的任意字符相匹配的字符

//写一个squeeze(s1,s2)函数,它删除字符串s1中与s2中的任意字符相匹配的字符
#include 
#include 
using namespace std;

int squeeze(char s1[], char s2[])
{
    char *p1=s1, *p2=s2;
    int len=0;
    for(int i=0; s1[i]!='\0'; i++)
    {
        int j=0;
        while(p2[j]!='\0')
        {
            if(p1[i]!=p2[j])
                j++;
            else
                break;
        }
        if(p2[j]=='\0')
            p1[len++]=p1[i];
    }
    p1[len]='\0';
    return len;
}

int main()
{
    char s1[100],s2[100];
    cout<<"依次输入字符串数组s1、s2"<<endl;
    cin>>s1;
    cin>>s2;
    int len=squeeze(s1,s2);
    if(len>0)
        cout<<s1<<endl;
    return 0;
}

34.函数seekint(s)是实现在字符串中寻找整数的功能,s是由数字字符和非数字字符组成的字符串…

//函数seekint(s)是实现在字符串中寻找整数的功能,s是由数字字符和非数字字符组成的字符串...

#include 

using namespace std;

void SeekInt(char *s)
{
    char *p=s;
    int num[100],len=0;
    for(int i=0;i<100;i++)
        num[i]=0;
    while(*p!='\0')
    {
        if(*p>='0' && *p<='9')
        {
            char *q=p+1;
            while(1)
            {
                if(*q>='0' && *q<='9')
                    q++;
                else
                    break;
            }

            int sum=0;
            while(p!=q)
            {
                sum=sum*10+(int)((*p)-48);  //数字字符0的assic码为48
                p++;
            }
            num[len++]=sum;
            p++;
        }
        else
            p++;
    }

    cout<<"数字字符是:";
    for(int i=0;i<len;i++)
        cout<<num[i]<<" ";
    cout<<endl;
}
int main()
{
    char str[100];
    cout<<"输入字符串:";
    cin.getline(str,99);
    SeekInt(str);
    return 0;
}

35.利用结构体数组存放学生的学号、姓名、性别和三门单科成绩,输出总分最高的学生和有一科或者一科以上不及格的学生的各项数据

#include 
#define N 2
#define M 2
using namespace std;

typedef struct student
{
    long stu_no;
    char name[20];
    char sex;
    float score[M];
}stu;

int main()
{
    stu student[N];
//    初始化
    cout<<"输入学生的信息:"<<endl;
    for(int i=0; i<N; i++)
    {
        cout<<"输入第"<<i+1<<"个学生的学号:";
        cin>>student[i].stu_no;
        cout<<"输入第"<<i+1<<"个学生的姓名:";
        cin>>student[i].name;
        cout<<"输入第"<<i+1<<"个学生的性别:";
        cin>>student[i].sex;
        for(int j=0;j<M;j++)
        {
            cout<<"输入第"<<i+1<<"个学生的第"<<j+1<<"门成绩:";
            cin>>student[i].score[j];
        }
    }

    int maxscore=0,maxnum,failnum[N];  //maxnum,failnum[N]分别为最高分和不及格学生的学号
    int k=0;
    for(int i=0;i<N;i++)
    {
        int sum=0;
        for(int j=0;j<M;j++)
        {
            sum+=student[i].score[j];
            if(student[i].score[j]<60)
                failnum[k++]=i;
        }
        if(maxscore<sum)
        {
            maxscore=sum;  //总分最高的学生成绩
            maxnum=i;      //总分最高的学生学号
        }
    }
    cout<<"总分最高的学生为:"<<student[maxnum].name<<endl;
    for(int i=0; i<k; i++)
        cout<< "不及格的学生为:" << student[failnum[i]].name <<" "<<endl;
    return 0;
}

完结!大家考研加油!

你可能感兴趣的:(西安交通大学915试卷编程题,C++编程,字符串,数组,结构体)