//
// main.m
// C4-一维数组,字符数组
//
// Created by dllo on 15/10/8.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import <Foundation/Foundation.h>
//#define SIZE 10;
int f(float n){
float c = 0;
if (n == 1 || n == 0) {
c = 1;
}else {
c = f( n - 1) * n ;
}
return c;
}
int main(int argc, const char * argv[]) {
int n = 0;
float y = 0;
// int f(float n);
scanf("%d",&n );
y = f( n );
printf("%.0f",y);
}
int a = 0;
定义一个数组
数组终端而每个(成员/元素)的类型为int
数组的名字叫做arr
数组中的每个变量初值为0
注意:1,arr[常量] 2 数组中的变量都是相同类型的
int arr[5] = {0};
初值的几种不同形式
int arr[5] = {0};
int arr1[5] = {1,2,3,4,5};
int arr2[5] = {1,2,3};
注意!!! 定义数组的时候一定要指定好数组中的元素个数
这种初值形式,系统会自动根据初值个数取决定数组元素值
int arr3[] = {1,2,3,4,5};
float arr[7] = {1.0};
char brr[6] = {'v','c'};
访问数组中的元素
int arr[5] = {1,2,3,4,5};
给数组中的元素赋值
注意数组中的元素编号从0开始
2为编号,专业名称叫"下标"
arr[2] = 10;
打印第四个(下标为3)元素的值
printf("%d\n",arr[3]);
注意!!!!!!!越界问题!!!!!!!
数组下表从0开始,最大编号比定义少1
arr[5] = 11;
printf("%d",arr[5]);//也能打出来数但是没有超出定义范围,该数据不受保护,因为该储存地址有可能被其他程序所用,当被其他程序占用的时候,数据丢失
int i = 0;
int a[10] = {0};
for (i = 0; i <10; i++) {
a[i] = i + 1;
printf("%d ",i);
}
定义一个具有20个元素的整型数组,每个元素的取值范围在30-70之间,求数组元素的值
int arr[20] = {0};
int i = 0;
int sum = 0;
for(i = 0;i < 20;i++){
为每个元素赋值随机数
注意访问的时候,数组下标可以是变量
定义的时候,数组下标只能是常量
int ret = arc4random() % (70 - 30 + 1) + 30;
arr[i] = ret;
//元素求和
sum = sum + arr[i];
}
for(i = 0;i < 20;i++){
printf("%d ",arr[i]);
}
printf("\n ");
printf("%d ",sum);
生成2个数组,每个数组都有10个元素,元素取值范围在30-70之间,,将相对应的元素求和
int a[10] = {0};
int b[10] = {0};
int sum = 0;
for(int i = 0;i < 10;i++){
a[i] = arc4random() % (70 - 30 + 1) + 30;
b[i] = arc4random() % (70 - 30 + 1) + 30;
printf("i:%d a:%d b:%d ",i,a[i],b[i]);
sum = a[i] + b[i];
printf("sum:%d",sum);
printf("\n");
}
限时代码
int a = 0;
int max = 0;
for (int i = 0; i < 10 ; i++) {
a = arc4random() % (40 - 20 + 1) + 20;
printf("%d ",a );
if (a> max) {
max = a ;
}
}
printf("\n");
printf("%d",max);
冒泡排序(万能程序)
int arr[8] = {22,13,8,2,44,3,6,66};
i控制进行几轮比较 n个数就把3换成n-1就可以
for (int i = 0; i < 8 - 1; i++) {
j 控制每轮比较多少次 ,n个数就把 4换成 n - i - 1 就可以
for (int j = 0; j < 8 - i - 1; j++) {
若当前元素大于后面的元素,交换2个变量的值
if (arr[j] < arr[j + 1]) {
交换
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for(int i = 0;i < 8;i++){
printf("%d ",arr[i]);
}
定义一个20 个元素,为每个元素赋值20-70,并进行冒泡排序
int a[20] = {0};
for (int i = 0; i < 20 ; i++) {
a[i] = arc4random() % ( 70 - 20 + 1) + 20;
}
printf("先前数组为:");
for (int i = 0; i < 20 ; i++) {
printf("%d ",a[i]);
}
printf("\n");
for (int i = 0 ; i < 20 - 1; i++) {
for (int j = 0; j < 20 - i - 1 ; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp ;
}
}
}
printf("排序后的数组:");
for (int i = 0; i < 20 ; i++) {
printf("%d ",a[i]);
}
定义一个字符型的数组
char str[] = {'y','h','c','l','g','f'};
字符串-也是一维数组,系统会自动的在后面添加结束符'\0',但是仍需要多预留一个位置
char name[6] = "yuhao";
这种写法需要手动添加结束符'\0'
char name1[6] = {'y','u','h','a','o','\0'};
char name2[] = "李金明";
char name3[] = "wangqiong";
for (int i = 0; i < 6; i++) {
printf("%c",name[i]);
}
for (int i = 0; i < 6; i++) {
printf("%c",str[i]);
}
printf("\n");
printf("%s\n",name1);
printf("%s\n",name2);
printf("%s\n",name3);
printf("%s",str);//报错,因为没有找到\0,程序没有结束
字符串拷贝
strcpy(str1 ,str2)-功能将str2的内容拷贝到str1中
char name1[] = "yuhao";
char name2[20] = {0};
strcpy(name2, name1);
printf("%s",name2);
字符串长度
len = strlen(name1) - 功能:计算name1的长度(不算结束符),结果返回到len中
char name1[] = "yuhao";
char name2[20] = {0};
long len = strlen(name1);
printf("%ld\n",len);
字符串的拼接
strcat(name1,name2)-功能:将name2的内容拼接到name1上,并将拼好的字符串存到name1中
//注意name1要有足够的空间容下拼接后的字符串
char name1[20] = {0};
char name2[] = "yuhao";
strcat(name1,name2);
printf("%s",name1);
字符串的比较
int ret = strcmp(name1,name2)-功能比较name1和name2的大小(逐个比较ascii码值,遇到第一处不等的停止并返回值,若全部相等返回0)
char name1[] = "yuhao";
char name2[] = "lijinming";
int ret = strcmp(name1, name2 );
printf("%d\n",ret );
查找字符串中的空格数
int count = 0;
char a[] = "i love ios, i want an iphone6s";
for (int i = 0; i < strlen(a); i++) {
if (' '== a[i]) {
count ++;
}
}
printf("%d",count);
}
字符串倒转
例如 "yuhao"
转成oahuy 注意 是改变字符串本身,不是反向输出
注意循环条件为len / 2,即互换的次数为len / 2.
!!!1时刻记着字符串的\0不显示,但是仍然占着一位
char a[] = "yuhao";
long len = strlen(a);
for (int i = 0 ; i < len / 2; i++) {
将2个元素互换
int b = a[i];
a[i] = a[ len - i - 1];
a[ len - i - 1] = b;
}
printf("%s",a);
int i = 0;
***)找出下列整型数组中最大和最小值及其所在位置i。
14、(****)思考题:编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
比如:"ni hao world”,最长单词是world。
char a[]= "ni hao woddddsfrsdld";
int maxlength = 0;//最长长度
int currentlength = 0;//每个单词的长度
int i = 0;//下标
int index = 0;//最长单词的开始位置
while(a[i] != '\0'){
if (a[i] != ' ') {
currentlength++;
if (a[i + 1] == '\0') {
if (maxlength < currentlength) {
maxlength = currentlength;
index = i + 1 -maxlength;
}
}
} else{
if (maxlength < currentlength) {
maxlength = currentlength;
index = i - maxlength;
}
currentlength = 0;
}
i++;
}
for (int i = index; i < maxlength + index; i++) {
printf("%c",a[i]);
}
printf("%d\n",maxlength);
}
15、(*****)思考题: 约瑟夫环的数组实现
约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名将士在附近的一个洞穴中避难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签并且做为洞穴中两个幸存者之一生存下来。
约瑟夫环问题的具体描述是:设有编号为1,2,......,n的n(n>0)个人围成一个圈,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,......,如此下去,知道只剩下一人为止。当任意给定 n和 m后,设计算法求 n个人出圈的次序。
/int arr1 = 0;// 当前单词长度
int arr2 = 0;// 最大单词长度
int arr3 = 0;//下标
int i = 0;
char a[] ="ni hao woddddsfrsdld";
while (a[i] != '\0') {
if (a[i] != ' ') {
arr1 ++;
if (a[i + 1] == '\0') {
if(arr2 < arr1){
arr2 = arr1;
arr3 = i + 1 - arr2;
}
}else{
if(arr2 < arr1){
arr2 = arr1;
arr3 = i - arr2;
}
arr1 = 0;
}
i++;
}
for(int i = arr3; i < arr2 + arr3 ;i++ ){
printf("%c",a[i]);
}
printf("%d\n",arr2);
/*
1. (*)先调试,调试成功后抄写下列程序:
#include <stdio.h>
#define SIZE 10
int main(int argc, char *argv[])
{
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[10] = {0};
for (int i = 0; i < SIZE ; i++) {
a[i] = i + SIZE;
printf("a[%d]=%d ",i,a[ i]);
}
2. (*)将第一题中的数组a反向输出。
int a[10] = {0};
for (int i = 0; i < SIZE; i++) {
a[i] = i + SIZE;
}
for (int i = 9 ; i >= 0 ; i--) {
printf("a[%d]=%d \n",i,a[i]);
}
3. (*)对第一题中的数组进行求和操作,打印计算结果。
int a[10] = {0};
int sum = 0;
for (int i = 0; i < SIZE ; i++) {
a[i] = i + SIZE;
sum = sum + a [i];
printf("a[%d]=%d \n",i,a[i]);
}
printf("sum:%d",sum);
}
4. (**)计算第一题数组连减,打印计算结果。
int a[10] = {0};
int sum = 0;
for (int i = 0; i < SIZE; i++) {
a[i] = i + SIZE;
sum = sum - a [i];
printf("a[%d]=%d \n",i,a[i]);
}
printf("sum:%d",sum);
}
5. (**)随机产生20个10~50的正整数存放到数组中,并求数组中的多有元素最大值、最小值、平均值及各元素之和。
int a[20] = {0} ;
int sum = 0;
int max = 0;
int min = 51;
for (int i = 0 ; i < 20 ; i++) {
a[i]= arc4random() % (50 - 10 + 1) + 10;
if (a[i] > max) {
max = a[i];
}
if (a[i] < min) {
min = a[i];
}
sum = sum + a[i];
}
printf("max:%d ",max);
printf("min:%d ",min);
printf("sum:%d ",sum);
printf("平均值:%d",sum/20);
6. 编写一个程序,先将两个数组升序排序,然后将这两个数组合并成一个升序数组。
int a[5] = {0};
int b[5] = {0};
int c[10] = {0};
printf("请先输入5位数字:");
for(int i = 0;i < 5;i++){
scanf("%d",&a[i]);
}
printf("\n");
printf("再输入5位数字:");
for(int i = 0;i < 5;i++ ){
scanf("%d",&b[i]);
}
//对a,b数组分别进行冒泡排序
for(int i = 0;i < 5 - 1 ;i++){
for(int j = 0; j < 5 - i - 1;j++ ){
if(a[j] > a[j + 1]){
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp ;
}
if(b[j] > b[j + 1]){
int temp = b [j];
b[j] = b[j + 1];
b[j + 1] = temp ;
}
}
}
// 对排过顺序的数组输出
printf("a数组冒泡排序结果:");
for (int i = 0; i < 5; i++) {
printf("%d ",a[i]);
}
printf("\n");
printf("b数组冒泡排序结果:");
for (int i = 0; i < 5; i++) {
printf("%d ",b[i]);
}
printf("\n");
// 将2个数组的值给c数组
for (int i = 0; i < 10 ; i++) {
if (i < 5) {
c[i] = a[i];
} else {
c[i] = b[i - 5];
}
}
printf("c数组的结果:");
for (int i = 0; i < 10; i++) {
printf("%d ",c[i]);
}
printf("\n");
//将数组c进行排序
for(int i = 0;i < 10 - 1;i++){
for(int j = 0;j < 10 - i - 1;j++){
if (c[j] > c[j + 1]) {
int temp = c[j];
c[j] = c[j + 1];
c[j + 1] = temp;
}
}
}
printf("c数组的冒泡排序结果:");
for (int i = 0; i < 10; i++) {
printf("%d ",c[i]);
}
7. (***)给定某年某月某日,输出其为这一年的第几天。
int year = 0;
int month = 0;
int a[12] ={31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
//int sum = 0;
printf("请输入年月日,格式为年份月份日期(用空格隔开):\n");
scanf("%d%d%d",&year,&month,&day);
printf("日期为:%d-%d-%d\n",year,month,day);
// 能整除就是取余得0
if ((year % 400 == 0)|| ( (year % 4 == 0) && (year % 100 != 0))){
a[1] = 29;
}
int sum = 0;
for(int i= 0;i < month - 1;i++){
sum = sum + a[i];
}
sum = sum + day ;
printf("%d",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 i = 0 ; i < 10 - 1; i++) {
for (int j = 0; j < 10 - i - 1; j++) {
if (a[j] > a [j + 1]) {
int temp = a [j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("冒泡排序后的结果:");
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};
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 result[50]= {0};
char str1[] = "Lanou";
char str2[] = "23_class";
char str3[] = " is niu best!";
strcpy(result,str1);
printf("%s ",result);
strcpy(result, str2);
printf("%s",result);
strcpy(result, str3);
printf("%s",result);
11、(**)找出下面程序的错误:
int main(int argc, char *argv[])
{
char string[10], str1[10];
int i;
for(i = 0; i < 10; i++)
{
str1[i] = 'a';
}
strcpy(string, str1);
}
!!!!! i< 9 不是10
char string[10] , str1[10] ;
int i;
for(i = 0; i < 9; i++)
{
str1[i] = 'a';
}
strcpy(string,str1 );
printf("%s",string);
printf("\n");
printf("%s",str1);
12、(**)下面这个程序执行后会有什么错误或者效果:
int main(int argc, char *argv[])
{
unsigned char str[10], i;
for(i = 0; i < 256; i++)
str[i] = i;
}
unsigned char str[10], i;
for(i = 0; i < 10; i++)
str[i] = i;
13、(***)模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生),
若输入的不是A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。
int a[4] = {0};
char b[] = {'A','B','C','D'};
int n = 0;
printf("请输入参加选举的人数:");
scanf("%d",&n);
for (int i = 0;i < n; i++) {
int ret = arc4random() % (70 - 65 + 1) + 65;
if( ret < 69){
a[ret - 65]++;//起始值都是0,票有效就加1
}
}
for(int i = 0;i < 4 ;i++){
printf("%d ",a[i]);
}
// 对a[] b[]进行冒泡排序
for(int i = 0;i < 4 - 1;i++){
for(int j = 0;j < 4 - i - 1;j++){
if(a[j] < a[j + 1] ){
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
int r = b[j];
b[j] = b[j + 1];
b[j + 1] = r;
}
}
}
printf("\n");
for(int i = 0;i < 4; i++){
printf("%d ",a[i]);
}
printf("\n");
for(int i = 0;i < 4; i++){
printf("%c ",b[i]);
}
14、(****)思考题:编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
比如:"ni hao world”,最长单词是world。
char a[]= "ni hao woddddsfrsdld";
int maxlength = 0;//最长长度
int currentlength = 0;//每个单词的长度
int i = 0;//下标
int index = 0;//最长单词的开始位置
while(a[i] != '\0'){
if (a[i] != ' ') {
currentlength++;
if (a[i + 1] == '\0') {
if (maxlength < currentlength) {
maxlength = currentlength;
index = i + 1 -maxlength;
}
}
} else{
if (maxlength < currentlength) {
maxlength = currentlength;
index = i - maxlength;
}
currentlength = 0;
}
i++;
}
for (int i = index; i < maxlength; i++) {
printf("%c",a[i]);
}
printf("%d\n",maxlength);
}
15、(*****)思考题: 约瑟夫环的数组实现
约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名将士在附近的一个洞穴中避难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签并且做为洞穴中两个幸存者之一生存下来。
约瑟夫环问题的具体描述是:设有编号为1,2,......,n的n(n>0)个人围成一个圈,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,......,如此下去,知道只剩下一人为止。当任意给定 n和 m后,设计算法求 n个人出圈的次序。
*/