C和C++练习
要点:
1、数组
2、冒泡排序BubbleSort
3、带指针的结构体(malloc,free)
4、字符串操作(拷贝、逆序、比较)
5、格式化输出printf,sprintf
6、格式化输入,scanf,sscanf
7、文件操作fopen,feof,EOF,fputc,fgetc,fputs,fgets,stdin,stdout
8、数组传参(需要指定长度)、字符串传参(不需指定长度,\0结尾)
#define _CRT_SECURE_NO_WARNINGS //#pragma warning(diable:4996) #include <iostream> using namespace std; #include <vector> //遍历测试 void foreachTest() { vector<int> vec{ 1,3,5,6,7,5,3 }; for (auto a : vec) { cout << a << ","; } cout << endl; for (auto a : vec) { a *= 3; } for (auto a : vec) { cout << a << ","; } cout << endl; for (auto& a : vec) { a *= 3; } for (auto a : vec) { cout << a << ","; } cout << endl; // 1, 3, 5, 6, 7, 5, 3, // 1, 3, 5, 6, 7, 5, 3, // 3, 9, 15, 18, 21, 15, 9, // 请按任意键继续. . . } //拉姆达表达式测试 void lambdaTest() { int a = 1; int b = 2; auto f = [a, &b] { cout << "a= " << a << endl; cout << "b= " << b << endl; //a++;//表达式必须是可修改的左值 b++;//OK }; f(); f(); f(); cout << "final b= " << b << endl; } //a = 1 //b = 2 //a = 1 //b = 3 //a = 1 //b = 4 //final b = 5 //请按任意键继续. . . #include <functional> //拉姆达表达式作为返回值 function<int(int, int)> returnLambda() { return [](int x, int y) {return x + y; }; } //评分1 void scoreTest1() { int score; printf("请输入分数:"); scanf("%d", &score); if (score >= 90) { printf("优秀\n"); } else if (score >= 80) { printf("良好\n"); } else if (score >= 60) { printf("及格\n"); } else { printf("不及格\n"); } } //评分2 void scoreTest2() { int score2; printf("请输入分数:"); scanf("%d", &score2); switch (score2 / 10) { case(10): printf("优秀\n"); break; case(9): printf("优秀\n"); break; case(8): printf("良好\n"); break; case(7): printf("及格\n"); break; case(6): printf("及格\n"); break; default: printf("不及格\n"); break; } } //评分3 void scoreTest3() { int score; printf("请输入分数:"); scanf("%d", &score); switch (score / 10) { case(10): case(9): printf("优秀\n"); break; case(8): printf("良好\n"); break; case(7): case(6): printf("及格\n"); break; default: printf("不及格\n"); break; } } //三只小猪的游戏 void threePigs1() { int pig1, pig2, pig3; printf("请输入三只小猪的重量,以空格分隔:\n"); scanf("%d %d %d", &pig1, &pig2, &pig3); if (pig1 > pig2) { if (pig1 > pig3) { printf("第1只小猪最重:%d\n", pig1); } else { printf("第3只小猪最重:%d\n", pig3); } } else { if (pig2 > pig3) { printf("第2只小猪最重:%d\n", pig2); } else { printf("第3只小猪最重:%d\n", pig3); } } } void sevenGame() { int start = 1; while (start <= 100) { if (start % 7 == 0 || start % 10 == 7 || start / 10 == 7) { printf("拍桌子\n"); } else { printf("%d\n", start); } start++; } } //格式化打印 测试 void printTest1() { int n = 70000; printf("%%hd= %hd\n", n); printf("%%d= %d\n", n); printf("%%ld= %d\n", n); printf("%%x= %x\n", n); printf("%%X= %X\n", n); printf("%%#x= %#x\n", n); printf("%%#X= %#X\n", n); char str1[] = "hello world"; printf("%%s= %s\n", str1); printf("%%c= %c\n", str1); char str2[] = { 'h','e','l','l','o',' ','w','o','r','l','d' }; printf("%%s= %s\n", str2); printf("%%c= %c\n", str2); float f = 3.14; printf("%%f= %f\n", f); printf("%%lf= %lf\n", f); printf("%%e= %e\n", f); printf("%%le= %le\n", f); printf("%%E= %E\n", f); printf("%%LE= %LE\n", f); printf("%%g= %g\n", f); printf("%%lg= %lg\n", f); printf("%%G= %G\n", f); printf("%%LG= %LG\n", f); double d = 123.456789; printf("%%f= %f\n", d); printf("%%8.1f= %5.1f %5.1f\n", d, d); printf("%%8.2f= %5.2f %5.2f\n", d, d); printf("%%5.3f= %5.3f\n", d); printf("%%5.4f= %5.4f\n", d); int m = 5678; printf("%%d= %d\n", m); printf("%%1d= %1d\n", m); printf("%%2d= %2d\n", m); printf("%%3d= %3d\n", m); printf("%%4d= %4d\n", m); unsigned int u = 10; unsigned short uh = 20; unsigned long ul = 30; unsigned long long ull = 40; printf("%%u= %u\n", u); printf("%%hu= %hu\n", uh); printf("%%lu= %lu\n", ul); printf("%%llu= %llu\n", ull); } //% hd = 4464 //% d = 70000 //% ld = 70000 //% x = 11170 //% X = 11170 //% #x = 0x11170 //% #X = 0X11170 //% s = hello world //% c = //% s = hello world烫烫烫烫蘦ello world //% c = ? //% f = 3.140000 //% lf = 3.140000 //% e = 3.140000e+00 //% le = 3.140000e+00 //% E = 3.140000E+00 //% LE = 3.140000E+00 //% g = 3.14 //% lg = 3.14 //% G = 3.14 //% LG = 3.14 //% f = 123.456789 //% 8.1f = 123.5 123.5 //% 8.2f = 123.46 123.46 //% 5.3f = 123.457 //% 5.4f = 123.4568 //% d = 5678 //% 1d = 5678 //% 2d = 5678 //% 3d = 5678 //% 4d = 5678 //% u = 10 //% hu = 20 //% lu = 30 //% llu = 40 //请按任意键继续. . . //数组测试1 void arrTest1() { int arr1[5] = { 1,2,3 }; size_t len1 = sizeof(arr1) / sizeof(arr1[0]); printf("len of arr1= %d\n", len1); printf("arr1= %p\n", arr1); for (size_t i = 0; i < len1; i++) { printf("&arr1[%u]= %p , arr1[%u]= %p\n", i, &arr1[i], i, arr1[i]); } int arr2[10] = { };//全部初始化为0 size_t len2 = sizeof(arr2) / sizeof(arr2[0]); printf("len of arr2= %d\n", len2); for (size_t i = 0; i < len2; i++) { printf("arr2[%u]= %d\n", i, arr2[i]); } int arr3[] = { 3,4,5 }; size_t len3 = sizeof(arr3) / sizeof(arr3[0]); printf("len of arr3= %d\n", len3); for (size_t i = 0; i < len3; i++) { printf("arr3[%u]= %d\n", i, arr3[i]); } int arr4[6]; size_t len4 = sizeof(arr4) / sizeof(arr4[0]); printf("len of arr4= %d\n", len4); for (size_t i = 0; i < len4; i++) { printf("arr4[%u]= %d\n", i, arr4[i]); } } //len of arr1 = 5 //arr1 = 00CFF6D4 //& arr1[0] = 00CFF6D4, arr1[0] = 00000001 //& arr1[1] = 00CFF6D8, arr1[1] = 00000002 //& arr1[2] = 00CFF6DC, arr1[2] = 00000003 //& arr1[3] = 00CFF6E0, arr1[3] = 00000000 //& arr1[4] = 00CFF6E4, arr1[4] = 00000000 //len of arr2 = 10 //arr2[0] = 0 //arr2[1] = 0 //arr2[2] = 0 //arr2[3] = 0 //arr2[4] = 0 //arr2[5] = 0 //arr2[6] = 0 //arr2[7] = 0 //arr2[8] = 0 //arr2[9] = 0 //len of arr3 = 3 //arr3[0] = 3 //arr3[1] = 4 //arr3[2] = 5 //len of arr4 = 6 //arr4[0] = -858993460 //arr4[1] = -858993460 //arr4[2] = -858993460 //arr4[3] = -858993460 //arr4[4] = -858993460 //arr4[5] = -858993460 //数组测试2 void arrTest2() { int arr[] = { 1,2,3 }; int* p = arr; size_t len = sizeof(arr) / sizeof(arr[0]); for (size_t i = 0; i < len; i++) { printf("arr[%u]= %d\n", i, arr[i]); printf("*(arr+%u)= %d\n", i, *(arr + i)); printf("p[%u]= %d\n", i, p[i]); printf("*(p+%u)= %d\n", i, *(p + i)); printf("\n"); } } //arr[0] = 1 //* (arr + 0) = 1 //p[0] = 1 //* (p + 0) = 1 // //arr[1] = 2 //* (arr + 1) = 2 //p[1] = 2 //* (p + 1) = 2 // //arr[2] = 3 //* (arr + 2) = 3 //p[2] = 3 //* (p + 2) = 3 //冒泡排序 void BubbleSort(int* arr, size_t len, bool ascending = true) { int temp; for (size_t i = 0; i < len - 1; i++) { for (size_t j = 0; j < len - 1 - i; j++) { if (ascending ? arr[j] > arr[j + 1]:arr[j] < arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } //冒泡排序 测试 void SortTest1() { int arr[] = { 4,65,33,5,7,88,2,6,23 }; size_t len = sizeof(arr) / sizeof(arr[0]); BubbleSort(arr, len, false); for (size_t i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); } void printSize(int* arr) { printf("size of arr arg = %u\n", sizeof(arr)); } void sizeTest() { int arr[] = { 4,5,6,7,8 }; printf("size of arr = %u\n", sizeof(arr)); printSize(arr); } //size of arr = 20 //size of arr arg = 4 //请按任意键继续. . . //字符串比较1 int strCmp1(char* str1, char* str2) { int i = 0; while (str1[i] == str2[i]) { if (str1[i] == '\0') { return 0; } i++; } return str1[i] > str2[i] ? 1 : -1; } //字符串比较2 int strCmp2(char* str1, char* str2) { int i = 0; while (*(str1 + i) == *(str2 + i)) { if (*(str1 + i) == '\0') { return 0; } i++; } return (*(str1 + i)) > (*(str2 + i)) ? 1 : -1; } //字符串比较 测试 void strCmpTest() { char str1[] = "hello"; char str2[] = "hello"; int res = strCmp2(str1, str2); printf("str1= %s\n", str1); printf("str2= %s\n", str2); if (res == 0) { printf("str1==str2\n"); } else if (res == 1) { printf("str1>str2\n"); } else if (res == -1) { printf("str1<str2\n"); } } //str1 = hello //str2 = hello world //str1 < str2 //请按任意键继续. . . //str1 = hello //str2 = hella //str1 > str2 //请按任意键继续. . . //str1 = hello //str2 = hello //str1 == str2 //请按任意键继续. . . void strTest1() { char str1[] = "abc"; char str2[] = { 'a','b','c' }; //char* str3 = "abc";//错误 "const char *" 类型的值不能用于初始化 "char *" 类型的实体 //char* str4 = { 'a','b','c' }; //错误 初始值设定项值太多 printf("str1= %s\n", str1); printf("str2= %s\n", str2); str1[0] = 'R'; str2[0] = 'X'; printf("str1= %s\n", str1); printf("str2= %s\n", str2); } //str1 = abc //str2 = abc烫烫烫烫蘟bc //str1 = Rbc //str2 = Xbc烫烫烫烫蘎bc //请按任意键继续. . . //字符串拷贝1 void strCpy1(char* src, char* dst) { int i = 0; while (src[i] != '\0') { dst[i] = src[i]; i++; } dst[i] = '\0'; } //字符串拷贝2 void strCpy2(char* src, char* dst) { int i = 0; while (*(src + i) != '\0') { *(dst + i) = *(src + i); i++; } *(dst + i) = '\0'; } //字符串拷贝3 void strCpy3(char* src, char* dst) { while (*src != '\0') { *dst = *src; dst++; src++; } *dst = '\0'; } //移除空格1 void removeSpace1(char* src, char* dst) { int i = 0, j = 0; while (src[i] != '\0') { if (src[i] != ' ') { dst[j] = src[i]; j++; } i++; } dst[j] = '\0'; } //移除空格2 void removeSpace2(char* src, char* dst) { int i = 0, j = 0; while (*(src + i) != '\0') { if (*(src + i) != ' ') { *(dst + j) = *(src + i); j++; } i++; } *(dst + j) = '\0'; } //移除空格3 void removeSpace3(char* src, char* dst) { while (*src != '\0') { if (*src != ' ') { *dst = *src; dst++; } src++; } *dst = '\0'; } //字符串拷贝测试 void strCpyTest() { char src[] = "ni chou sha chou ni za di"; size_t len = sizeof(src); printf("len of src = %d\n", len); char dst1[sizeof(src)] = {}; strCpy1(src, dst1); char dst2[sizeof(src)] = {}; strCpy2(src, dst2); printf("src= %s\n", src); printf("copy dst1= %s\n", dst1); printf("copy dst2= %s\n", dst2); char dst3[sizeof(src)] = {}; char dst4[sizeof(src)] = {}; removeSpace1(src, dst3); removeSpace2(src, dst4); printf("remove space dst3= %s\n", dst3); printf("remove space dst4= %s\n", dst4); char dst5[sizeof(src)] = {}; strCpy3(src, dst5); printf("copy dst5= %s\n", dst5); char dst6[sizeof(src)] = {}; removeSpace3(src, dst6); printf("remove space dst6= %s\n", dst6); } //len of src = 26 //src = ni chou sha chou ni za di //copy dst1 = ni chou sha chou ni za di //copy dst2 = ni chou sha chou ni za di //remove space dst3 = nichoushachounizadi //remove space dst4 = nichoushachounizadi //copy dst5 = ni chou sha chou ni za di //remove space dst6 = nichoushachounizadi //请按任意键继续. . . //统计子串个数 int subCount(char* src, char* sub) { int count = 0; char* p = strstr(src, sub); while (p != NULL) { count++; p++; p = strstr(p, sub); } return count; } //子串个数测试 void subCountTest() { char src[] = "hello world,hello ladies hello gentleman"; char sub[] = "llo"; int ret = subCount(src, sub); printf("src= %s\n", src); printf("sub= %s\n", sub); printf("count= %d\n", ret); } //src = hello world, hello ladies hello gentleman //sub = llo //count = 3 //请按任意键继续. . . //字符串逆序1 void strReverse1(char* str) { char temp; size_t len = strlen(str); for (size_t i = 0; i < len - 1 - i; i++) { temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } } //字符串逆序2 void strReverse2(char* str) { char* start = str; char* end = str + strlen(str) - 1; char temp; while (start < end) { temp = *start; *start = *end; *end = temp; start++; end--; } } //字符串逆序测试 void strReverseTest() { char str[] = "hello"; printf("str= %s\n", str); strReverse1(str); printf("reverse= %s\n", str); strReverse2(str); printf("recovery= %s\n", str); } //str = hello //reverse = olleh //recovery = hello //请按任意键继续. . . //判断回文字符串 int str_aba(char* str) { char* start = str; char* end = str + strlen(str) - 1; while (start < end) { if (*start != *end) { return 0; } start++; end--; } return 1; } int strLen_noSpace(char* str) { int count = 0; while (*str) { if (*str != ' ') { count++; } str++; } return count; } //带一级指针的结构体 struct Person { char* name; int age; }; void allocPerson(Person*** pPersons, int len) { if (pPersons == NULL) { return; } *pPersons = (Person**)malloc(sizeof(Person*) * len); for (size_t i = 0; i < len; i++) { (*pPersons)[i] = (Person*)malloc(sizeof(struct Person)); (*pPersons)[i]->name = (char*)malloc(sizeof(char) * 64); sprintf((*pPersons)[i]->name, "person_%u", i + 1); (*pPersons)[i]->age = i + 20; } } void printPerson(Person** persons, int len) { for (size_t i = 0; i < len; i++) { printf("name=%s,age=%d\n", persons[i]->name, persons[i]->age); } } void freePerson(Person** persons, int len) { if (persons == NULL || len < 1) { return; } for (size_t i = 0; i < len; i++) { if (persons[i] != NULL) { if (persons[i]->name != NULL) { free(persons[i]->name); persons[i]->name = NULL; } free(persons[i]); persons[i] = NULL; } } free(persons); persons = NULL; } void personTest() { Person** persons = NULL; int len = 4; allocPerson(&persons, len); printPerson(persons, len); freePerson(persons, len); } //name = person_1, age = 20 //name = person_2, age = 21 //name = person_3, age = 22 //name = person_4, age = 23 //请按任意键继续. . . //带二级指针的结构体 struct Teacher { char* name; char** students; }; //分配堆空间 void allocTeacher(Teacher*** pTeachers, int lenTeacher, int lenStudent) { if (pTeachers==NULL) { return; } (*pTeachers) =(Teacher**) malloc(sizeof(Teacher*)*lenTeacher); for (size_t i = 0; i < lenTeacher; i++) { (*pTeachers)[i] =(Teacher*) malloc(sizeof(Teacher)); (*pTeachers)[i]->name = (char*)malloc(sizeof(char) * 64); sprintf((*pTeachers)[i]->name,"teacher_%d",i+1); (*pTeachers)[i]->students = (char**)malloc(sizeof(char*) * lenStudent); for (size_t j = 0; j < lenStudent; j++) { (*pTeachers)[i]->students[j] = (char*)malloc(sizeof(char) * 64); sprintf((*pTeachers)[i]->students[j], "teacher_%d_student_%d", i + 1, j + 1); } } } //打印数据 void printTeacher(Teacher** teachers, int lenTeacher, int lenStudent) { for (size_t i = 0; i <lenTeacher; i++) { printf("%s\n",teachers[i]->name); for (size_t j = 0; j < lenStudent; j++) { printf(" %s\n", teachers[i]->students[j]); } } } //释放堆空间 void freeTeacher(Teacher** teachers, int lenTeacher, int lenStudent) { if (teachers==NULL||lenTeacher<1) { return; } for (size_t i = 0; i < lenTeacher; i++) { if (teachers[i]!=NULL) { if (teachers[i]->name!=NULL) { free(teachers[i]->name); teachers[i]->name = NULL; } if (teachers[i]->students!=NULL&&lenStudent>0) { for (size_t j = 0; j < lenStudent; j++) { if (teachers[i]->students[j]!=NULL) { free(teachers[i]->students[j]); teachers[i]->students[j] = NULL; } } free(teachers[i]->students); teachers[i]->students = NULL; } free(teachers[i]); } } free(teachers); teachers = NULL; } //带二级指针的结构体 测试 void teacherTest() { Teacher** teachers = NULL; int lenTeacher = 3; int lenStudent = 4; allocTeacher(&teachers,lenTeacher,lenStudent); printTeacher(teachers,lenTeacher,lenStudent); freeTeacher(teachers,lenTeacher,lenStudent); } //teacher_1 //teacher_1_student_1 //teacher_1_student_2 //teacher_1_student_3 //teacher_1_student_4 //teacher_2 //teacher_2_student_1 //teacher_2_student_2 //teacher_2_student_3 //teacher_2_student_4 //teacher_3 //teacher_3_student_1 //teacher_3_student_2 //teacher_3_student_3 //teacher_3_student_4 //请按任意键继续. . . void fileTest1() { char file[] = "C:\\Users\\Dell\\Desktop\\test.txt"; FILE* pf = fopen(file,"w"); if (pf == NULL) { perror("file open failed"); return; } for (size_t i = 0; i < 26; i++) { putc('a'+i,pf); } fclose(pf); } void fileTest2() { char file[] = "C:\\Users\\Dell\\Desktop\\test.txt"; FILE* pf = fopen(file,"r"); if (pf==NULL) { perror("file open for read failed"); return; } char c; while (1) { c = getc(pf); if (c==EOF) { break; } printf("%c",c); } printf("\n"); fclose(pf); } //abcdefghijklmnopqrstuvwxyz void fileTest3() { char file[] = "C:\\Users\\Dell\\Desktop\\test.txt"; FILE* pf = fopen(file,"r"); char c; while (!feof(pf)) { c=getc(pf); printf("%c",c); } printf("\n"); fclose(pf); } //abcdefghijklmnopqrstuvwxyz void fgetsTest() { char buf[10]; printf("%s",fgets(buf,10,stdin)); } //hello //hello //请按任意键继续. . . //helloworld //helloworl请按任意键继续. . . //无论缓存长度是否足够,一定会添加\0, //如果长度不够,则会舍弃\n和结尾的其他字符,以_MaxCount为准 void fputsTest() { char str[] = "hello"; fputs(str,stdout); } //hello请按任意键继续. . . //写入的内容,不会添加\n //将控制台的输入内容写入文件 //以:q表示退出 //可以支持多行文本写入 void consoleToFile() { char buf[1024]; char file[] = "C:\\Users\\Dell\\Desktop\\console.txt"; FILE* fp = fopen(file,"w"); if (fp==NULL) { perror("fopen error"); return; } while (1) { fgets(buf, 1024, stdin); if (strcmp(buf,":q\n")==0) { break; } fputs(buf,fp); } fclose(fp); } //基于文件的计算器 void fileCalculate() { char file1[] = "C:\\Users\\Dell\\Desktop\\calculate1.txt"; char file2[] = "C:\\Users\\Dell\\Desktop\\calculate2.txt"; FILE* pf1 = fopen(file1,"r"); FILE* pf2 = fopen(file2,"w"); if (pf1==NULL|| pf2 == NULL) { perror("fopen error"); return; } char buf[1024]; int a, b, r=0; char c; while (!feof(pf1)) { fgets(buf,1024,pf1); sscanf(buf,"%d%c%d=\n",&a,&c,&b); switch (c) { case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': r = a / b; break; default: break; } sprintf(buf, "%d%c%d=%d\n",a,c,b,r); fputs(buf,pf2); } fclose(pf1); fclose(pf2); } //输入文件 //1 + 2 = //44 / 4 = //8 - 3 = //5 * 6 = //输出文件 //1 + 2 = 3 //44 / 4 = 11 //8 - 3 = 5 //5 * 6 = 30 void cinTest() { float f = 0.1f; cout << "请输入一个浮点数:" << endl; cin >> f; cout << "浮点数f= " << f << endl; bool b = false; cout << "请输入一个布尔值:" << endl; cin >> b; cout << "布尔值b= " << b << endl; } //请输入一个浮点数: //6.5 //浮点数f = 6.5 //请输入一个布尔值: //55 //布尔值b = 1 //请按任意键继续. . . //请输入一个浮点数: //4 //浮点数f = 4 //请输入一个布尔值: //true //布尔值b = 0 //请按任意键继续. . . //Main int main() { cinTest(); //fileCalculate(); //consoleToFile(); //fputsTest(); //fgetsTest(); //fileTest1(); //fileTest2(); //fileTest3(); //teacherTest(); //personTest(); //strReverseTest(); //subCountTest(); //strCpyTest(); //strTest1(); //strCmpTest(); //sizeTest(); //SortTest1(); //arrTest2(); //arrTest1(); //printTest1(); //sevenGame(); //threePigs1(); //scoreTest3(); //scoreTest2(); //scoreTest1(); //lambdaTest(); //foreachTest(); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了