Day5_c语言_一维数组练习

本文涵盖C语言中数组的基本操作,包括数组的初始化、排序、求和等,并深入探讨字符串处理技巧,如字符串合并、反转及空格计数。
//
// main.m
// Day5_一位数组
//
// Created by 王佳兴 on 14-10-18.
// Copyright (c) 2014年 lanou3g.com 蓝鸥科技. All rights reserved.
//
#include<string.h>
#import <Foundation/Foundation.h>
#define SIZE 10
int main(int argc, const char * argv[]) {
1. (*)先调试,调试成功后抄写下列程序:
int a[SIZE] = {0},i = 0;
for(i = 0; i < SIZE; i++){
a[i] = i+10;
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
int a[SIZE] = {0};
int i = 0;
for(i = 0; i < SIZE; i++){
a[i] = i + 10;
printf("a[%d] = %d\n", i, a[i]);
}
2. (*)将第一题中的数组 a 反向输出
int a[SIZE] = {0};
int i = 0;
for(i = SIZE - 1; i > 0; i--){
a[i] = i + 10;
printf("a[%d] = %d\n", i, a[i]);
}
3. (*)对第一题中的数组进行求和操作,打印计算结果。
int a[SIZE] = {0};
int i = 0;
int sum = 0;
//循环累加
for(i = 0; i < SIZE; i++){
a[i] = i + 10;
sum += a[i];
}
printf("%d\n", sum);
4. (**)计算第一题数组连减,打印计算结果
int a[SIZE] = {0};
int i = 0;
int b = 0;
int c = 0;
//循环累减
for(i = 0; i < SIZE; i++){
a[i] = i + 10;
b = b - a[i];
}
c = b + a[0];
printf("%d\n", c);
5. (**)随机产生20个10~50的正整数存放到数组中,并求数组中的多有 元素最大值、最小值、平均值及各元素之和
//第一种:
//定义整型数组
int a[20] = {0};
//对最大值,最小值,各元素之和以及平均值初始化
int max = 0, min = 50, sum = 0, avg = 0;
//循环求得最大值,最小值,以及各元素之和
for (int i = 0; i < 20; i++) {
a[i] = arc4random() % (50 - 10 + 1) + 10;
printf("%d ", a[i]);
if (a[i] > max) {
max = a[i];
}
if (a[i] < min) {
min = a[i];
}
sum += a[i];
}
//各元素之和除以元素个数为平均值
avg = sum / 20;
//打印所求结果
printf("最大值:%d\n最小值:%d\n各元素之和:%d\n平均数:%d\n", max, min, sum, avg);
//第二种:
//定义数组
int array[20] = {0};
//定义最大值和最小值下标,初始化和与平均值
int max = 0, min = 0;
float sum = 0, avg = 0;
//通过循环得到最大值,最小值,累加器
for (int i = 0; i < 20; i++) {
//通过随机数得到数组各元素
array[i] = arc4random() % (50 - 10 + 1) + 10;
//打印数组,检验以下正确性
printf("%d ",array[i]);
//判断求得最大值
if (array[i] > array[max]) {
max = i;
}
//判断求得最小值
if (array[i] < array[min]) {
min = i;
}
//累加得到各元素之和
sum += array[i];
}
//平均值
avg = sum / 20;
//美观
printf("\n");
//打印结果
printf("max : %d\nmin : %d\nsum : %.2f\navg = %.2f\n", array[max], array[min], sum, avg);
6. 编写一个程序,输入两个包含5个元素的数组,先将两个数组升序排序,然 后将这两个数组合并成一个升序数组
//定义两个数组
int a[5] = {3, 5, 1, 9, 7};
int b[5] = {8, 6, 2, 0, 4};
//初始化循环变量
int i, j, temp;
//循环将两个整型数组分别排序(冒泡排序)
for(j = 0; j < 5; j++){
for (i = 0; i < 5 - 1 - j; i++) {
if (a[i] > a[i + 1]) {
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
if (b[i] > b[i + 1]) {
temp = b[i];
b[i] = b[i + 1];
b[i + 1] = temp;
}
}
}
//分别打印排序后的两个数组
printf("a[5]:");
for (i = 0; i < 5; i++) {
printf("%d ", a[i]);
}
printf("\n");
printf("b[5]:");
for (i = 0; i < 5; i++) {
printf("%d ", b[i]);
}
printf("\n");
//定义第三个数组,将排序之后的两个数组拼接到第三个数组上
int c[10] = {0};
for (int i = 0; i < 10; i++) {
if (i < 5) {
c[i] = a[i];
}else {
c[i] = b[i-5];
}
}
//冒泡排序法为所得数组排序
int temp1;
for (j = 0; j < 10; j++) {
for (i = 0; i < 10 - 1 - j; i++) {
if (c[i] > c[i + 1]) {
temp1 = c[i];
c[i] = c[i + 1];
c[i + 1] = temp1;
}
}
}
//打印所得数组
printf("c[10]:");
for (i = 0; i < 10; i++) {
printf("%d ", c[i]);
}
printf("\n");
7. (***)给定某年某月某日,输出其为这一年的第几天
//定义整型数组,元素为各个月份的天数,第一个元素为程序运行方便设置成0
int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//提示输入日期
printf("请输入日期:");
//定义循环变量以及 年 月 日 和累加器sum
int i, year, month, day, sum = 0;
//输入日期
scanf("%d %d %d", &year, &month, &day);
//判断输入日期是否为闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
a[2] = 29;
}
//循环式累加器累加判断所输入的月份的天数
for(i = 0; i < month; i++){
sum += a[i];
}
//所输入的月份的天数,加上之前月份的天数即为这一年的多少天
sum += day;
//打印天数
printf("%d\n", sum);
8. (**)编写整型值数组排序程序(冒泡排序--升序)
//int a[] = {3,-9,32,77,63,-24,14,0,21,45};
//定义数组
int a[] = {3, -9, 32, 77, 63, -24, 14, 0, 21, 45};
//冒泡排序法为数组排序
for (int j = 0; j < 10; j++) {
for (int i = 0; i < 10 - 1 - j; i++) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
//打印排序后的数组
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
9.(***)找出下列整型数组中最大和最小值及其所在位置 i。
//int a[] = {5,-9,32,77,64,-24,14,0,21,45};
//定义是个元素的数组
int a[] = {5, -9, 32, 77, 64, -24, 14, 0, 21, 45};
//初始化最大值以及最小值
int max = -24, min = 77;
//循环取得最大值和最小值
for (int i = 0; i < 10; i++) {
//判断取最大值
if (a[i] > max) {
max = a[i];
}
//判断取最小值
if (a[i] < min) {
min = a[i];
}
}
//打印最大值和最小值
printf("最大值:%d ", max);
printf("最小值:%d\n", min);
//循环判断取得最大值和最小值的下标
for (int i = 0; i < 10; i++) {
if (a[i] == max) {
printf("最大值下标:%d ", i);
}
if (a[i] == min) {
printf("最小值下标:%d\n", i);
}
}
//定义数组
int a[] = {5, -9, 32, 77, 64, -24, 14, 0, 21, 45};
//初始化最大值和最小值的下标
int max = 0, min = 0;
//循环取得最大值和最小值下标
for (int i = 0; i < 10; i++) {
//判断取得最大值下标
if (a[i] > a[max]) {
max = i;
}
//判断取得最小值下标
if (a[i] < a[min]) {
min = i;
}
}
//打印结果
printf("max:%d\nmin:%d\nmaxid:%d\nminid:%d\n", a[max], a[min], max, min);
10、(*)把 str1, str2, str3 合并到 result 数组中。
char result[50] = {0};
char str1[] = "Lanou "; char str2[] = "23_class "; char str3[] = " is niu best!";
结果:“Lanou 23_class is niu best!”
//定义数组
char str1[]="lanou ";
char str2[]="23_class ";
char str3[]="is niu best!\n";
//拼接数组
strcat(str1, str2);
strcat(str1, str3);
//打印数组
printf("%s",str1);
11、(**)找出下面程序的错误:
char string[10], str1[10];
int i;
for(i = 0; i < 10; i++){
str1[i] = 'a';
}
strcpy(string, str1);
没预留\0位
12、(**)下面这个程序执行后会有什么错误或者效果:
int main(int argc, char *argv[]) {
unsigned char str[10], i;
for(i = 0; i < 256; i++)
str[i] = i;
}
数组长度不够!
13、(***)模拟 n 个人参加选举的过程,并输出选举结果:假设候选人有
四人,分别用 A、B、C、D 表示,当选某候选人时,直接输入其编号(编号由计
算机随机产生),
若输入的不是 A、B、C、D 则视为无效票,选举结束后按得票数从高到低输出 候选人编号和 所得票数
printf("请输入参加选举的人数:");
//n为投票的人数, number判断随机选的是哪个人
int n,number;
//输入投票人数
scanf("%d", &n);
//存储每个编码对应的票数
int personNum[4] = {0};
//定义存储代表候选人字母的字符串数组
char person[4] = {'A', 'B', 'C', 'D'};
for (int i = 0; i < n; i++) {
number = arc4random() % 4;
personNum[number]++;
}
for (int i = 0; i < 4; i++) {
printf("%c:", person[i]);
printf("%d\n", personNum[i]);
}
printf("排名如下:\n");
for (int j = 0; j < 4 - 1; j++) {
for (int i = 0; i < 4 - 1 - j; i++) {
if(personNum[i] < personNum[i + 1]){
int temp = personNum[i];
personNum[i] = personNum[i + 1];
personNum[i + 1] = temp;
char tempC = person[i];
person[i] = person[i + 1];
person[i] = tempC;
}
}
}
for (int i = 0; i < 4; i++) {
printf("%c : %d\n", person[i], personNum[i]);
}
//提示用户输入投票人数
printf("请输入人数:");
//创建任命数组
char person[4] = {'B', 'J', 'R', 'L'};
//创建票数数组
int score[4] = {0};
//定义整型变量用来存数参加选举的人数
int n = 0;
//通过控制台给n赋值
scanf("%d", &n);
//投票过程
for (int i = 0; i < n; i++) {
//创建一个0~3的随机数
int r = arc4random() % 4;
//用随机值给被选举人投票
score[r]++;
}
//拍戏过程
for (int i = 0; i < 4 - 1; i++) {
for (int j = 0; j < 4 - 1 - i; j++) {
//判断条件是根据票数而定
if (score[j] < score[j + 1]) {
//交换票数
int temp = score[j];
score[j] = score[j + 1];
score[j + 1] = temp;
//不要忘记,交换票数的同时需要交换人的位置
char tempChr = person[j];
person[j] = person[j + 1];
person[j + 1] = tempChr;
}
}
}
printf("排名如下:\n");
for (int i = 0; i < 4; i++) {
printf("%c:%2d\n", person[i], score[i]);
}
14、(****)思考题:编程在一个已知的字符串中找最长单词,假定字符
串中只含字母和空格,空格用来分隔不同单词。 比如:"ni hao world”,最长单词是 world
15、(*****)思考题: 约瑟夫环的数组实现 约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了
公元 66-70 年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达 伯特城达 47 天之久,在城市沦陷之后,他和 40 名将士在附近的一个洞穴中避
难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个
人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了
最后一签并且做为洞穴中两个幸存者之一生存下来。
约瑟夫环问题的具体描述是:设有编号为 1,2,......,n 的 n(n>0)个人围成一 个圈,从第一个人开始报数,报到 m 时停止报数,报 m 的人出圈,再从他的 下一个人起重新报数,报到 m 时停止报数,报 m 的出圈,......,如此下去,知 道只剩下一人为止。当任意给定 n 和 m 后,设计算法求 n 个人出圈的次序。
16、(*****)拓展题:调查学习冒泡排序以外的排序算法,并用 C 语言 实现
练习3.查找字符中的空格数: 例如:“I love iOS, i want an iPhone5s” 6个空格
//定义数组
char str[] = "I love iOS, i want an iPhone5s";
//定义累加器
int sum = 0;
//循环累加出空格的个数
for (int i = 0; i < 30; i++) {
if (strcmp(str + i, str + 30) == 32) {
sum++;
}
}
//打印空格的个数
printf("空格个数为:%d\n", sum);
练习4.将字符串倒转: 例如:“afjnpue” 转变成字符串“eupnjfa” (注:是改变字符串本⾝身,不是反向输出)
定义字符串
char str[12] = "WangJiaxing";
//循环使字符串最前与最后调换,依次向内执行
for (int i = 0; i < 11 / 2; i++) {
char temp = str[i];
str[i] = str[10 - i];
str[10 - i] = temp;
}
//打印倒转后的字符串
printf("%s", str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值