
C语言第六章作业
AI-摘要
YouduAI GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
1 、筛选法求100以内的素数
#include<bits/stdc++.h>
#define MAX 100
void sieve_of_eratosthenes(bool prime[], int max) {
// 初始化所有数为素数
for (int i = 2; i <= max; i++) {
prime[i] = true;
}
// 开始筛选
for (int p = 2; p * p <= max; p++) {
// 如果prime[p]未被标记为合数,则它是素数
if (prime[p]) {
// 标记所有p的倍数为合数
for (int i = p * p; i <= max; i += p) {
prime[i] = false;
}
}
}
}
int main() {
bool prime[MAX + 1];
sieve_of_eratosthenes(prime, MAX);
printf("100以内的素数有:\n");
for (int i = 2; i <= MAX; i++) {
if (prime[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
2、用选择法对100以内的数进行排序
#include<bits/stdc++.h>
void selectionSort(int arr[], int n) {
int i, j, minIdx, temp;
for (i = 0; i < n - 1; i++) {
// 找到未排序部分的最小值
minIdx = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
// 将最小值与当前未排序部分的第一个元素交换
temp = arr[minIdx];
arr[minIdx] = arr[i];
arr[i] = temp;
}
}
int main() {
int arr[10] = { 34, 7, 23, 32, 5, 62, 32, 8, 19, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
int i;
printf("排序前的数组:\n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
selectionSort(arr, n);
printf("排序后的数组:\n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
3、求一个3X3的整数矩阵对角线之和
#include<bits/stdc++.h>
int main() {
// 直接给定一个3x3的整数矩阵
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int i;
int sum = 0;
// 计算主对角线和副对角线的和
for (i = 0; i < 3; i++) {
sum += matrix[i][i]; // 主对角线元素
sum += matrix[i][2 - i]; // 副对角线元素
}
// 因为主对角线和副对角线在中心点重复计算了一次,所以需要减去这个重复的点
sum -= matrix[1][1];
printf("对角线之和为: %d\n", sum);
system("pause");
return 0;
}
4、将一个数插入一个有序数组,插入完成之后数组仍然有序
#include<bits/stdc++.h>
void insertAndSort(int arr[], int n, int num) {
int i;
// 找到插入位置
for (i = n - 1; (i >= 0 && arr[i] > num); i--) {
arr[i + 1] = arr[i]; // 向后移动元素
}
arr[i + 1] = num; // 插入新元素
}
int main() {
int arr[6] = { 1, 3, 5, 7, 9 }; // 假设数组已经有序,并且有空间容纳一个新元素
int n = 5; // 当前数组的元素个数
int num = 6; // 要插入的数
printf("原数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
insertAndSort(arr, n, num);
printf("插入后的数组: ");
for (int i = 0; i < n + 1; i++) {
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
5、将一个有序数组的值按照逆序重新存放
例: 8, 6, 5, 4, 1 -> 1, 4, 5, 6, 8
#include<bits/stdc++.h>
void reverseArray(int arr[], int n) {
int start = 0;
int end = n - 1;
while (start < end) {
// 交换元素
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// 移动指针
start++;
end--;
}
}
int main() {
int arr[] = { 8, 6, 5, 4, 1 }; // 假设数组已经有序
int n = sizeof(arr) / sizeof(arr[0]);
printf("原数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
reverseArray(arr, n);
printf("逆序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
6、输出10行杨辉三角
#include<bits/stdc++.h>
#define ROWS 10
void generatePascalsTriangle(int arr[ROWS][ROWS]) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
arr[i][j] = 1; // 每行的第一个和最后一个元素为1
}
else {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; // 其他元素为上两元素之和
}
}
}
}
void printPascalsTriangle(int arr[ROWS][ROWS]) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
int pascalsTriangle[ROWS][ROWS] = { 0 }; // 初始化二维数组
generatePascalsTriangle(pascalsTriangle); // 生成杨辉三角
printPascalsTriangle(pascalsTriangle); // 输出杨辉三角
system("pause");
return 0;
}
7、输出魔方阵
#include<bits/stdc++.h>
// 定义魔方阵的阶数
#define ROW 5
#define COL ROW
void generateMagicSquare() {
int arr[ROW][COL] = { 0 };
int currow = 0;
int curcol = COL / 2;
arr[0][curcol] = 1;//将1放于第一行中间
for (int i = 2; i <= ROW * COL; i++)
{
//判断上一行下一列是否存在元素
if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] != 0)
{
//存在元素,将位置挪位现位置的底下
currow = (currow + 1) % ROW;
}
else
{
//不存在元素,挪位至现位置上一行下一列
currow = (currow - 1 + ROW) % ROW;
curcol = (curcol + 1) % COL;
}
arr[currow][curcol] = i;//为确定的位置赋值
}
//输出
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%-4d", arr[i][j]);
}
printf("\n");
}
}
int main() {
generateMagicSquare();
system("pause");
return 0;
}
8、判断一个二维数组是否有鞍点,有的话输出
#include<bits/stdc++.h>
#define ROWS 5
#define COLS 5
void findSaddlePoint(int arr[ROWS][COLS]) {
int i, j, k;
int isSaddlePoint = 0; // 标记是否找到鞍点
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
// 检查当前元素是否是其所在行的最大值
int maxInRow = 1;
for (k = 0; k < COLS; k++) {
if (arr[i][k] > arr[i][j]) {
maxInRow = 0;
break;
}
}
// 检查当前元素是否是其所在列的最小值
int minInCol = 1;
for (k = 0; k < ROWS; k++) {
if (arr[k][j] < arr[i][j]) {
minInCol = 0;
break;
}
}
// 如果两个条件都满足,则该元素是鞍点
if (maxInRow && minInCol) {
printf("鞍点位于位置 (%d, %d),值为 %d\n", i, j, arr[i][j]);
isSaddlePoint = 1;
}
}
}
if (!isSaddlePoint) {
printf("数组中没有找到鞍点。\n");
}
}
int main() {
int arr[ROWS][COLS] = {
{12, 7, 9, 66, 15},
{8, 13, 6, 99, 10},
{16, 17, 18, 77, 20},
{21, 22, 23, 88, 25},
{26, 27, 28, 99, 30}
};
findSaddlePoint(arr);
system("pause");
return 0;
}
9. 通过二分查找,在一个15个元素的数组中找出输入的数,如果没有则输出无此数
#include<bits/stdc++.h>
int binarySearch(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid + 1; // 返回第几个数,从1开始计数
}
else if (arr[mid] > target) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1; // 表示未找到
}
int main() {
int arr[15] = { 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2 };
int size = sizeof(arr) / sizeof(arr[0]);
int target;
printf("请输入一个整数: ");
scanf_s("%d", &target);
int result = binarySearch(arr, size, target);
if (result != -1) {
printf("该数是数组中的第 %d 个数\n", result);
}
else {
printf("无此数\n");
}
system("pause");
return 0;
}
10、统计文件字符种类 3行80列
#include<bits/stdc++.h>
int main() {
FILE* file;
char article[3][81]; // 每行最多80个字符,外加一个'\0'
int uppercase = 0, lowercase = 0, digits = 0, spaces = 0, others = 0;
// 打开文件
file = fopen("article.txt", "r");
if (file == NULL) {
printf("无法打开文件。\n");
return 1;
}
// 读取文章
for (int i = 0; i < 3; i++) {
if (fgets(article[i], sizeof(article[i]), file) == NULL) {
break;
}
}
// 关闭文件
fclose(file);
// 遍历文章并统计各类字符
for (int i = 0; i < 3; i++) {
for (int j = 0; article[i][j] != '\0'; j++) {
if (isupper(article[i][j])) {
uppercase++;
}
else if (islower(article[i][j])) {
lowercase++;
}
else if (isdigit(article[i][j])) {
digits++;
}
else if (isspace(article[i][j])) {
spaces++;
}
else {
others++;
}
}
}
// 输出结果
printf("大写字母: %d\n", uppercase);
printf("小写字母: %d\n", lowercase);
printf("数字: %d\n", digits);
printf("空格: %d\n", spaces);
printf("其他字符: %d\n", others);
system("pause");
return 0;
}
12、电文加密
加密方法:第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变,下载需要编写解密算法,将密文解密成原文,输出密码和原文
#include<bits/stdc++.h>
void encrypt(char* plaintext, char* ciphertext) {
int i;
for (i = 0; plaintext[i] != '\0'; i++) {
if (isalpha(plaintext[i])) {
if (isupper(plaintext[i])) {
ciphertext[i] = 'Z' - (plaintext[i] - 'A');
}
else if (islower(plaintext[i])) {
ciphertext[i] = 'z' - (plaintext[i] - 'a');
}
}
else {
ciphertext[i] = plaintext[i];
}
}
ciphertext[i] = '\0'; // 确保字符串以空字符结尾
}
// 解密函数
void decrypt(char* ciphertext, char* plaintext) {
int i;
for (i = 0; ciphertext[i] != '\0'; i++) {
if (isalpha(ciphertext[i])) {
if (isupper(ciphertext[i])) {
plaintext[i] = 'Z' - (ciphertext[i] - 'A');
}
else if (islower(ciphertext[i])) {
plaintext[i] = 'z' - (ciphertext[i] - 'a');
}
}
else {
plaintext[i] = ciphertext[i];
}
}
plaintext[i] = '\0'; // 确保字符串以空字符结尾
}
int main() {
char plaintext[100];
char ciphertext[100];
char decryptedText[100];
printf("请输入原文: ");
fgets(plaintext, sizeof(plaintext), stdin);
// 去掉换行符
plaintext[strcspn(plaintext, "\n")] = '\0';
encrypt(plaintext, ciphertext);
printf("加密后的密文: %s\n", ciphertext);
decrypt(ciphertext, decryptedText);
printf("解密后的原文: %s\n", decryptedText);
system("pause");
return 0;
}
11、 13、 14、 15 都在下面 (课堂上写的)
#include<stdio.h>
#include<string.h>
void myStrCat(char* str1, char* str2) { // 自定义字符串连接函数
for (int i = 0, j = strlen(str1); i < strlen(str2); i++, j++) { str1[j] = str2[i]; }
}
void myStrCopy(char* str1, char* str2) { // 自定义字符串复制函数
for (int i = 0; i < strlen(str2) + 1; i++) { str1[i] = str2[i]; }
}
int myStrCmp(char* str1, char* str2) { // 自定义字符串比较函数
int strSum = 0;
for (int i = 0; str1[i] != '\0 '&& str2[i] != '\0'; i++) {
if (str1[i] != str2[i]) strSum += (str1[i] - str2[i]);
else continue;
}
return strSum;
}
void findMaxStr() { // 自定义寻找最大字符串函数
char strs[3][10] = { "hello","world","imwxy" };
char maxStr[20];
myStrCopy(maxStr, strs[0]);
for (int i = 0; i < 3; i++) {
if (myStrCmp(maxStr, strs[i]) < 0) {
myStrCopy(maxStr, strs[i]);
}
}
puts(maxStr);
}
void myprint() { // 打印符号作业
char xx[] = "*****";
for (int i = 0; i < 5; i++) {
for (int j = 0; j < i; j++) {
printf(" ");
}
printf("%s\n", xx);
}
}
int main() {
char str1[200] = "hellooooo";
char str2[] = "world";
//findMaxStr();
myprint();
system("pause");
return 0;
}
找出二维数组额鞍点 (课堂上写的,上面是课后写的)
#include<stdio.h>
#include<stdlib.h>
/*
2,6,8,7,5
4,3,1,5,2 <-- 例如次数组的 第二行第四列的5是该行最大值,该列最小值,满足鞍点定义
4,8,9,6,1
9,5,7,8,6
5,9,2,9,7
*/
int main(){
int arr[5][5] = {2,6,8,7,5, 4,3,1,5,2, 4,8,9,6,1, 9,5,7,8,6, 5,9,2,9,7};
int m = 5,n = 5;
int flag2 = 0; // 判断全局是否有鞍点,默认没有,初始值为0
for(int i = 0;i<5;i++){
int flag1 = 1; // 只判断本行最大值是否为鞍点,每一行都有最大值,所以初始值为1
int maxj = 0;
for(int j = 0;j < 5;j++){
int max = arr[i][maxj];
if(arr[i][j] > max){
max = arr[i][j];
maxj = j;
}
}
int k; // k 为第maxj列的所有行
for(k = 0;k < 5;k++){
if(arr[k][maxj] < arr[i][maxj]){ // 此时列都是定值
flag1 = 0; // 本行最大值不是鞍点
}
}
if(flag1){
flag2 = 1; // 本行最大值是鞍点,所以全局有鞍点
printf("第%d行,第%d列的%d是鞍点\n",i+1,maxj+1,arr[i][maxj]);
}
}
if(!flag2){
printf("没有鞍点\n");
}
system("pause");
return 0;
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果