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; }