本子君

C++期末作业习题记录

习题一

遍历含有学生提交作业的文件夹,并找出相应学生(预先输入该学生的学号)的有效文件(当天作业当天提交的次数,程序文件以当天布置作业的时间命名)

void listFiles(const char * dir);

定义遍历文件夹的函数 listFiles

void listFiles(const char * dir)
{
    char dirNew[200];
    strcpy(dirNew, dir);
    strcat(dirNew, "\\*.*");    

    intptr_t handle;
    _finddata_t findData;

    handle = _findfirst(dirNew, &findData);
    if (handle == -1)        
        return;

    do
    {
        if (findData.attrib & _A_SUBDIR)//.attrib表示文件的属性 
        {
            if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
                continue;

            
            strcpy(dirNew, dir);
            strcat(dirNew, "\\");
            strcat(dirNew, findData.name);

            listFiles(dirNew);
        }
        else
        {
            if(strstr(findData.name, number))
            {
                char strTime[100] = {0};
                unixTime2Str(findData.time_write, strTime, sizeof(strTime));
                if(strstr(findData.name,strTime))
                {
                    m[findData.name]++;
                }
            }
        } 
    } while (_findnext(handle, &findData) == 0);

    _findclose(handle);    
}

遍历文件夹的函数使用#include <io.h>头文件下的_finddata_t结构体来获取文件的属性.attrib,若文件属性为_A_SUBDIR(目录directory)则继续向下打开文件夹查找,直到文件的属性不为_A_SUBDIR为止

匹配所查找的学生与其对应的.cpp文件所用的时strstr()函数,通过在文件名中查找学号的子串来确定所找的文件,查找时间也是通过同样的方法,只不过.time_write返回的最后修改时间用得时unix时间戳,

需要函数将其转化为标准时间

 

完整代码

#include <bits/stdc++.h>     
#include <io.h>
using namespace std;
int sum=0;
map<string,int> m;
map<string,int>::iterator it;

void listFiles(const char * dir, char * number);//遍历目录 
void unixTime2Str(int n, char strTime[], int bufLen);//将unix时间戳转化为标准时间 

int main()
{
    int n;
    char dir[200];
    cout<<"Enter total number of students: ";
    cin>>n;//输入查找的人数 
    cin.ignore();//删除流中的\n 
    cout<<"Enter a directory: ";
    cin.getline(dir, 200);//输入目录 
    while(n--)
    {
        sum=0;
        char number[20];
        cout<<"Enter student number: ";
        cin.getline(number, 20);
        listFiles(dir,number);
    
        for(it=m.begin();it!=m.end();it++)
        {
            if(it->second>=1)//迭代排除同一天所交的相同作业 
                sum++;
        }
        m.clear();//清空map 
        cout<<"Valid assignments submitted on the day: ";
        cout<<sum<<endl;
    }
    return 0;
}

void listFiles(const char * dir, char * number)
{
    char dirNew[200];
    strcpy(dirNew, dir);
    strcat(dirNew, "\\*.*");    

    intptr_t handle;
    _finddata_t findData;

    handle = _findfirst(dirNew, &findData);
    if (handle == -1)        
        return;

    do
    {
        if (findData.attrib & _A_SUBDIR)//.attrib表示文件的属性 
        {
            if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
                continue;

            
            strcpy(dirNew, dir);
            strcat(dirNew, "\\");
            strcat(dirNew, findData.name);

            listFiles(dirNew,number);
        }
        else
        {
            if(strstr(findData.name, number))
            {
                char strTime[100] = {0};
                unixTime2Str(findData.time_write, strTime, sizeof(strTime));
                if(strstr(findData.name,strTime))
                {
                    m[findData.name]++;
                }
            }
        } 
    } while (_findnext(handle, &findData) == 0);

    _findclose(handle);    
}

void unixTime2Str(int n, char strTime[], int bufLen)
{
    struct tm tm = *localtime((time_t *)&n);
    strftime(strTime, bufLen - 1, "_%m%d_", &tm);
    strTime[bufLen - 1] = '\0';
}

 

 

习题二

控制一个字符可以上下左右移动遇到相应的字符扣除相应的体力值,体力值扣完输入结束,并且记录运行的时间,预先规定运行的时间,当程序运行达到规定的时间是,停止输入

使用#include <conio.h>头文件里的getch()函数,读取一个字符而不再屏幕上显示,输入字符后判断字符的ASCII码来确定所控制字符的移动方向(用二维字符数组确定),每次变化

后使用system("cls");清屏,并再次输出新的二维数组。时间记录使用了#include <time.h>头文件下的clock()函数,定义两个clock_t型start和finish变量,在程序开始时获取时间并赋值给

start,在每次循环输入的结尾处获取时间并赋值给finish,利用double(finish-start)/CLOCKS_PER_SEC将程序执行时间转化为秒,之后再while里判断时间,时间超了break;出去

 

完整代码

#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
using namespace std;


int main()
{
    clock_t start,finish;
    start = clock();
    char c;
    char a[10][10]={{'#','M','#','#','#','#','#','#','#','#'},{'#',':','G',':',':',':','*',':','*','#'},{'#',':',':',':',':',':','G',':',':','#'},{'#','G','G','G','G','G','G','G','G','#'},{'#',':',':',':',':',':',':',':',':','#'},{'#','*','*','*','*','*','*','*','*','#'},{'#','*',':','*',':','*',':','*','*','#'},{'#',':',':',':',':',':',':',':',':','#'},{'#',':',':',':',':',':',':',':',':','#'},{'#','#','#','#','#','#','#','#','#','#'}};
    int x,y,sum,tempx,tempy;
    sum=100;
    cout<<"* is stone"<<endl<<"G is gold"<<endl<<": is soil"<<endl; 
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            cout<<a[i][j];
        }
        cout<<endl;
    }
    cout<<endl<<endl;
    cout<<"Current energy level: "<<sum<<endl;
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            if(a[i][j]=='M')
            {
                x=i;
                y=j;        
            }    
        }
    }
    while(sum>0)
    {
        tempx=x;
        tempy=y;
        c=getch();
        switch(c)
        {
            case 119://
            {
                if(x-1>0 || x==1 && y==1)
                {
                    x=x-1;
                    if(a[x][y]=='*')
                    {
                        sum=sum-2;
                    }
                    else if(a[x][y]=='G')
                    {
                        sum=sum-3;    
                    }
                    else if(a[x][y]==':')
                    {
                        sum--;
                    }    
                }
                break;    
            }
               case 97: //
            {
                if(y-1>0)
                {
                    y=y-1;
                    if(a[x][y]=='*')
                    {
                        sum=sum-2;
                    }
                    else if(a[x][y]=='G')
                    {
                        sum=sum-3;    
                    }
                    else if(a[x][y]==':')
                    {
                        sum--;
                    }        
                }
                break;    
            }
            case 100: //
            {
                if(y+1<9)
                {
                    if(x==0 && y==1)
                        continue;
                    y=y+1;
                    if(a[x][y]=='*')
                    {
                        sum=sum-2;
                    }
                    else if(a[x][y]=='G')
                    {
                        sum=sum-3;    
                    }
                    else if(a[x][y]==':')
                    {
                        sum--;
                    }    
                }
                break;    
            }
            case 115: //
            {
                if(x+1<9)
                {
                    x=x+1;
                    if(a[x][y]=='*')
                    {
                        sum=sum-2;
                    }
                    else if(a[x][y]=='G')
                    {
                        sum=sum-3;    
                    }
                    else if(a[x][y]==':')
                    {
                        sum--;
                    }    
                }
                break;
            }
            default: 
                break;
        }
        a[tempx][tempy]='.';
        a[x][y]='M';
        system("cls");//清屏
        cout<<"* is stone"<<endl<<"G is gold"<<endl<<": is soil"<<endl; 
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<10;j++)
            {
                cout<<a[i][j];
            }
            cout<<endl;
        }
        cout<<endl<<endl;
        cout<<"Current energy level: "<<sum<<endl;
        finish = clock();
        if(double(finish-start)/CLOCKS_PER_SEC>=10)
            break;
        cout<<"time = "<<double(finish-start)/CLOCKS_PER_SEC<<"s"<<endl;
    }
    return 0;
}

 

posted on 2019-06-24 23:18  本子君  阅读(304)  评论(0编辑  收藏  举报

导航