首页 > 编程语言 >谭浩强c程序设计例题+习题 第六章 利用数组处理批量数据

谭浩强c程序设计例题+习题 第六章 利用数组处理批量数据

时间:2024-08-23 22:21:50浏览次数:13  
标签:include int s1 ++ 谭浩强 数组 printf 习题 例题

第六章 利用数组处理批量数据

文章目录

例6.1 对10个数组元素依次赋值为0,1,2,3…,9并逆序输出
#include<stdio.h>
int main(){
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int i;
    for(int i=9;i>=0;i--){
        printf("%d ",a[i]);
    }
    return 0;
}

例6.2 用数组处理Fibonacci数列问题
#include<stdio.h>
int main(){
    int i;
    int f[20]={1,1};      //对f[]前两个数赋值f0和f1
    for(i=2;i<20;i++)
        f[i]=f[i-2]+f[i-1];
        for(i=0;i<20;i++){
            if(i%5==0) printf("\n"); //每五个数换行
            printf("%12d",f[i]);
        }
    return 0;
}
例6.3 有10个地区的面积,要求对它们按照从小到大顺序排序
#include<stdio.h>
int main(){
    int a[10];
    int i,j,t=0;
    printf("input 10 nums:\n");
    for(i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    printf("\n");
    for(j=0;j<9;j++){
        for(i=0;i<9-j;i++){
            if(a[i]>a[i+1])
                t=a[i],a[i]=a[i+1],a[i+1]=t;
        }
    }
    printf("the sorted nums:\n");
    for(i=0;i<10;i++){
        printf("%d ",a[i]);
    }
    return 0;
}
例6.4 将一个二维数组行和列互换存到零一个二维数组中

a=[1 2 3\n4 5 6] b=[1 4 \n 2 5 \n 3 6]

#include<stdio.h>
int main(){
	int m,n;	//行数列数
	scanf("%d,%d",&m,&n); 
    int a[m][n],b[n][m];
    int i,j,t;
    for(i=0;i<m;i++){
    	for(j=0;j<n;j++){
    		scanf("%d",&a[i][j]);
		}
	}
	 for(i=0;i<m;i++){
    	for(j=0;j<n;j++){
    		printf("%d ",a[i][j]);
    		b[j][i]=a[i][j];	//转置 
		}
		printf("\n");
	}
	for(i=0;i<n;i++) {
		for(j=0;j<m;j++){
			printf("%d ",b[i][j]);
		}
		printf("\n");
	}

    return 0;
}
例6.5 有一个3*4的矩阵,求最大值并求所在行列号

打擂台算法

#include<stdio.h>
int main(){
    int a[3][4];
    int i,j,max,m,n;
    for(i=0;i<3;i++){
    	for(j=0;j<4;j++){
    		scanf("%d",&a[i][j]);
		}
	}
	max=a[0][0];
	for(i=0;i<3;i++){
    	for(j=0;j<4;j++){
    		if(max<a[i][j])
    		{
    			max=a[i][j],m=i,n=j;	//记录数值和行列号 
			}
    			
		}
	}
	printf("max=a[%d][%d]=%d",m+1,n+1,max); 

    return 0;
}
例6.6 输出一个已知字符串
#include<stdio.h>
int main(){
    char c[15]={'1','9','3','6','s','x','y','s','h','z'};
    int i;
	for(i=0;i<15;i++){
		printf("%c ",c[i]); 
	}
    return 0;
}
例6.7 输出一个菱形图
#include<stdio.h>
int main(){
    char diam[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
    int i,j;
	for(i=0;i<15;i++){
		for(j=0;j<5;j++){
			printf("%c",diam[i][j]); 
		}
		printf("\n");
	}
    return 0;
}
例6.8 输入一行字符,统计其中有多少个单词,单词之间用空格隔开

问题的关键:如何确定“出现一个新单词”

从第一个字符开始逐个字符检查,判断是否是新单词的开头,如果是,就用num的值加一

#include<stdio.h>
int main(){
    char str[81];
    int i,num=0,word=0;
    char c;
    gets(str);
	for(i=0;(c=str[i])!='\0';i++)
		if(c==' ') word=0;	//如果是空格,置为0 
		else if(word==0){
			word=1;
			num++;
		}
	printf("%d",num);
    return 0;
}
例6.9 有三个字符找出最大者

解题思路:str[0]、str[1]、str[2]看做3个一维字符数组(各有20个元素),视为一维数组处理。用gets函数读入,赋给三个一维字符数组。经过三次两两比较,可得到最大者,然后把他放在string

#include<stdio.h>
#include<string.h>
int main(){
	char str[3][20];
	char string[20];
	int i;
	for(i=0;i<3;i++)
		gets(str[i]);
    if(strcmp(str[0],str[1])>0)
        strcpy(string,str[0]);
    else
        strcpy(string,str[1]);
    if(strcmp(str[2],string)>0)
        strcpy(string,str[2]);
    printf("\nthe largest string is:\n%s\n",string);
    return 0;
}
习题
1.筛选法求100以内的素数
#include <stdio.h>
#include <stdbool.h>

#define MAX 100

int main() {
    bool isPrime[MAX + 1];  // 用于标记是否为素数
    for (int i = 0; i <= MAX; i++) {
        isPrime[i] = true;  // 初始化数组,假设所有数都是素数
    }
    
    // 埃拉托斯特尼筛法
    for (int p = 2; p * p <= MAX; p++) {
        if (isPrime[p] == true) {  // 如果当前数是素数
            for (int i = p * p; i <= MAX; i += p) {
                isPrime[i] = false;  // 将所有p的倍数标记为非素数
            }
        }
    }
    
    // 打印所有素数
    printf("Prime numbers up to %d are:\n", MAX);
    for (int i = 2; i <= MAX; i++) {
        if (isPrime[i]) {
            printf("%d ", i);
        }
    }
    printf("\n");
    
    return 0;
}

2.选择法对10个整数进行排序
#include <stdio.h>

int main() {
    int arr[10] = {29, 10, 14, 37, 13, 40, 23, 34, 42, 31};  // 初始化数组
    int n = 10;  // 数组长度

    // 选择排序算法
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;  // 假设当前元素是最小值
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;  // 找到更小的值
            }
        }
        if (minIndex != i) {
            // 交换位置
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    // 打印排序后的数组
    printf("Sorted array:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

3.求3*3的整形矩阵对角线元素之和
#include <stdio.h>

int main() {
    int matrix[3][3] = {  // 初始化3x3矩阵
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int sum = 0;  // 用于存储对角线元素的和

    // 计算主对角线和副对角线的元素和
    for (int i = 0; i < 3; i++) {
        sum += matrix[i][i];        // 主对角线元素
        sum += matrix[i][2 - i];    // 副对角线元素
    }

    // 如果是3x3矩阵, 两条对角线交点的元素被加了两次, 需要减去重复加的那个元素
    sum -= matrix[1][1];  // 减去中间元素(它被加了两次)

    printf("Sum of diagonal elements: %d\n", sum);

    return 0;
}

4.有一个已排好序的数组,要求输入一个数后,按原来顺序的规律插入
#include <stdio.h>

int main() {
    int arr[11] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};  // 初始化已排好序的数组
    int n = 10;  // 数组中的元素数量
    int num;

    printf("Enter a number to insert: ");
    scanf("%d", &num);  // 输入要插入的数

    // 找到要插入的位置
    int i;
    for (i = n - 1; i >= 0 && arr[i] > num; i--) {
        arr[i + 1] = arr[i];  // 将元素向右移动
    }

    arr[i + 1] = num;  // 插入元素

    // 打印插入后的数组
    printf("Array after insertion:\n");
    for (int j = 0; j <= n; j++) {
        printf("%d ", arr[j]);
    }
    printf("\n");

    return 0;
}

5.将数组元素按逆序重新存放

例:原来顺序8,6,5,4,1 改为:1,4,5,6,8

#include <stdio.h>

int main() {
    int arr[5] = {8, 6, 5, 4, 1};  // 初始化数组
    int n = 5;

    // 交换数组元素,前后对调
    for (int i = 0; i < n / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[n - 1 - i];
        arr[n - 1 - i] = temp;
    }

    // 打印逆序后的数组
    printf("Reversed array:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}


6.输出杨辉三角形(10行)
#include <stdio.h>

int main() {
    int rows = 10;  // 杨辉三角的行数
    int triangle[10][10] = {0};  // 初始化三角形数组

    // 生成杨辉三角
    for (int i = 0; i < rows; i++) {
        triangle[i][0] = 1;  // 每行第一个元素为1
        triangle[i][i] = 1;  // 每行最后一个元素为1
        for (int j = 1; j < i; j++) {
            triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];  // 计算其他元素
        }
    }

    // 打印杨辉三角
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%d ", triangle[i][j]);
        }
        printf("\n");
    }

    return 0;
}

7.输出魔方阵

魔方阵:每一行每一列和对角线之和均相等

例如 8 1 6 \n 3 5 7 \n 4 9 2

#include <stdio.h>

int main() {
    int n = 3;  // 魔方阵的大小(n x n)
    int magic[3][3] = {0};  // 初始化魔方阵
    int i = 0, j = n / 2;  // 从第一行中间开始

    for (int num = 1; num <= n * n; num++) {
        magic[i][j] = num;  // 将数字放入当前位置
        i--;
        j++;

        if (num % n == 0) {  // 如果是n的倍数,向下移动
            i += 2;
            j--;
        } else {
            if (j == n) j = 0;  // 列超出范围
            else if (i < 0) i = n - 1;  // 行超出范围
        }
    }

    // 打印魔方阵
    printf("Magic Square:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%2d ", magic[i][j]);
        }
        printf("\n");
    }

    return 0;
}

8.找出一个二维数组中的鞍点,即该位置上元素在该行最大,该行最小,也有可能没有鞍点
#include <stdio.h>

void find_saddle_point(int matrix[3][3], int rows, int cols) {
    int i, j;
    int saddle_point_exists = 0;

    // 遍历每一行
    for (i = 0; i < rows; i++) {
        int row_max = matrix[i][0];
        int col_index = 0;

        // 找到该行的最大值及其所在列
        for (j = 1; j < cols; j++) {
            if (matrix[i][j] > row_max) {
                row_max = matrix[i][j];
                col_index = j;
            }
        }

        // 检查该最大值是否是其所在列的最小值
        int is_saddle_point = 1;
        for (j = 0; j < rows; j++) {
            if (matrix[j][col_index] < row_max) {
                is_saddle_point = 0;
                break;
            }
        }

        // 如果找到鞍点,输出位置和值
        if (is_saddle_point) {
            printf("Saddle point found at row %d, column %d with value %d\n", i, col_index, row_max);
            saddle_point_exists = 1;
        }
    }

    if (!saddle_point_exists) {
        printf("No saddle point found.\n");
    }
}

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {3, 4, 6},
        {2, 5, 7}
    };
    find_saddle_point(matrix, 3, 3);
    return 0;
}

9.有15个数按从大到小存放到数组,输入一个数,折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出无此数
#include <stdio.h>

int binary_search(int arr[], int size, int target) {
    int left = 0, right = size - 1;

    while (left <= right) {
        int middle = (left + right) / 2;

        if (arr[middle] == target) {
            return middle + 1; // 返回元素在数组中的位置,从1开始计数
        }
        else if (arr[middle] > target) {
            left = middle + 1;
        }
        else {
            right = middle - 1;
        }
    }
    return -1; // 找不到元素
}

int main() {
    int arr[15] = {99, 88, 77, 66, 55, 44, 33, 22, 20, 18, 17, 16, 15, 10, 5};
    int target;

    printf("Enter the number you want to search for: ");
    scanf("%d", &target);

    int result = binary_search(arr, 15, target);

    if (result != -1) {
        printf("The number is at position %d.\n", result);
    } else {
        printf("Number not found.\n");
    }

    return 0;
}

10.有一篇文章,共有3行文字,每行80个字符,统计英文大小写字母、数组、空格和其他字符数
#include <stdio.h>
#include <ctype.h>

int main() {
    char text[3][81] = {
        "This is a line of text, containing letters A-Z, a-z, numbers 0-9, spaces and other characters!",
        "Another line with some TEXT and 12345 numbers, symbols like @#$% and spaces.",
        "Last line with a mix of everything: letters, NUMBERS, and symbols!"
    };

    int upper_case = 0, lower_case = 0, digits = 0, spaces = 0, others = 0;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 80; j++) {
            char ch = text[i][j];
            if (ch == '\0') break;

            if (isupper(ch)) {
                upper_case++;
            } else if (islower(ch)) {
                lower_case++;
            } else if (isdigit(ch)) {
                digits++;
            } else if (isspace(ch)) {
                spaces++;
            } else {
                others++;
            }
        }
    }

    printf("大写字母: %d\n", upper_case);
    printf("小写字母: %d\n", lower_case);
    printf("数字: %d\n", digits);
    printf("空格: %d\n", spaces);
    printf("其他字符: %d\n", others);

    return 0;
}

11.输出图案

在这里插入图片描述

#include <stdio.h>

int main() {
    int n = 5;
    int t;
    for (int i = 1; i <= n; i++) {
    	t=i;
    	while(t--)
    	printf(" ");
        for (int j = 1; j <= n; j++) {
            printf("* ");
        }
        printf("\n");
    }

    return 0;
}

12.电文加密

A->Z a->z

B->Y b->y

C->X c->x

第一个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母字符不变,要求编程序译回原文,并输出密码和原文

#include <stdio.h>
#include <ctype.h>

void encrypt_decrypt(char str[]) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (isalpha(str[i])) {
            if (isupper(str[i])) {
                str[i] = 'Z' - (str[i] - 'A');
            } else if (islower(str[i])) {
                str[i] = 'z' - (str[i] - 'a');
            }
        }
    }
}

int main() {
    char text[] = "Hello World!";
    printf("原文: %s\n", text);

    encrypt_decrypt(text);
    printf("编码: %s\n", text);

    encrypt_decrypt(text);
    printf("解码: %s\n", text);

    return 0;
}

13连接两个字符串,不用strcat
#include <stdio.h>

void string_concat(char s1[], char s2[]) {
    int i = 0, j = 0;

    // 找到s1的末尾
    while (s1[i] != '\0') {
        i++;
    }

    // 连接s2到s1
    while (s2[j] != '\0') {
        s1[i] = s2[j];
        i++;
        j++;
    }

    s1[i] = '\0'; // 添加结束符
}

int main() {
    char s1[100] = "Hello, ";
    char s2[] = "World!";

    string_concat(s1, s2);
    printf("连接后字符: %s\n", s1);

    return 0;
}

14 比较两字符串s1、s2,s1>s2输出一个正数;相等输出0;s1<s2输出负数

不要用strcpy函数,输入用gets读入,输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码差值

例:A和C相比,因为A<C所以应输出负数,AC的ASCII码差值为2,应输出-2

And和Aid 相比 第二个字符n比i大,应输出5

#include <stdio.h>

int compare_strings(char s1[], char s2[]) {
    int i = 0;

    while (s1[i] != '\0' && s2[i] != '\0') {
        if (s1[i] != s2[i]) {
            return s1[i] - s2[i];
        }
        i++;
    }

    // 比较长度不同的情况
    return s1[i] - s2[i];
}

int main() {
    char s1[100], s2[100];
    printf("输入第一个字符串: ");
    gets(s1);
    printf("输入第二个字符串: ");
    gets(s2);

    int result = compare_strings(s1, s2);

    if (result > 0) {
        printf("s1 > s2, difference: %d\n", result);
    } else if (result < 0) {
        printf("s1 < s2, difference: %d\n", result);
    } else {
        printf("s1 == s2\n");
    }

    return 0;
}

15.将字符数组s2中的全部字符复制到s1中

不用strcpy函数,复制时’\0’也要复制过去,'\0’后的字符不复制

#include <stdio.h>

void string_copy(char s1[], char s2[]) {
    int i = 0;

    // 复制字符,直到'\0'
    while ((s1[i] = s2[i]) != '\0') {
        i++;
    }
}

int main() {
    char s1[100];
    char s2[] = "Hello, World!";

    string_copy(s1, s2);
    printf("复制后字符: %s\n", s1);

    return 0;
}

标签:include,int,s1,++,谭浩强,数组,printf,习题,例题
From: https://blog.csdn.net/m0_62328922/article/details/141475863

相关文章

  • 【C++ Primer Plus习题】3.6
    问题:解答:#include<iostream>usingnamespacestd;intmain(){ floatmiles=0; floatgallons=0; floatgallon=0; cout<<"请输入驱车里程(单位为英里):"; cin>>miles; cout<<"请输入使用的汽油量(单位为加仑):"; cin>>g......
  • 线段树(2)——懒惰标记Lazy Tag(单运算)及例题
    上一篇文章我们讲了线段树的最基本的操作。如果有一种操作叫做区间加法呢?这个时候显然可以依次单点修改,但是时间复杂度太高了。所以可以考虑优化,由于思考过程可能很长,此处直接引入懒惰标记。懒惰标记就是在对一颗树的所有节点进行某种统一操作时,只对根节点做一个标记表示它的子树......
  • 软考-软件设计师(程序设计语言习题)
       ......
  • Python程序设计现代方法1课后习题1Python 开发概述
    Python程序设计现代方法1课后习题1Python开发概述1.整数求和。输入整数n,计算1~n之和。defsum_of_integers(n):returnsum(range(1,n+1))n=int(input("请输入整数n:"))print(f"1~{n}的和为:{sum_of_integers(n)}")2.整数排序。输入三个整数,把这三个数由......
  • Python 正则表达式详解 带例题演示
    Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志......
  • C语言典型例题46
    《C程序设计教程(第四版)——谭浩强》题目:习题3.6企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;                   利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于1000......
  • 软考-软件设计师(信息安全习题)
       ......
  • 牛客网习题——通过C++实现
    一、目标实现下面4道练习题增强C++代码能力。1.求1+2+3+...+n_牛客题霸_牛客网(nowcoder.com)2.计算日期到天数转换_牛客题霸_牛客网(nowcoder.com)3.日期差值_牛客题霸_牛客网(nowcoder.com)4.打印日期_牛客题霸_牛客网(nowcoder.com)二、对目标的实现 1.求1+2+3+......
  • C语言典型例题45
    《C程序设计教程(第四版)——谭浩强》习题3.5给一个不多于5位的正整数,要求:     1.求出它是几位数;     2.分别输出每一位数字;     3.按逆序输出各位数字,例如:原数为321,输出为123代码://《C程序设计教程(第四版)——谭浩强》//习题3.5给一......
  • 【数据结构】详细剖析链表,带你实现单链表,双向链表,附链表编程练习题
    目录一.链表1.链表的概念及结构2.单链表的实现2.1单链表节点结构2.2动态申请一个节点2.3单链表打印2.4单链表尾插2.5单链表头插2.6单链表尾删2.7单链表头删2.8单链表查找 2.9单链表在pos后一位插入x2.10单链表删除pos后一位的值2.11单链表销毁 ......