华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1052|回复: 8
打印 上一主题 下一主题

D 1

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2023-7-1 11:38:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.        深度分析数据的类型
数的表示  二进制 原码反码补码 所占空间和范围
char, short int,  int ,long long
unsinged
位操作  cout<<(3^2); (以后专门讲)
bitset
结构体
指针 p=* int
字符串与字符数组
Play  safety

        int l;
        string s="SJF NIU";
        l=s.size();
        cout<<(l>-3)<<endl;
        cout<<(s.size()>-3)<<endl;
2.        输入输出的技术

初学c++一般建议用cin和cout进行输入输出,不用考虑太多的格式,基本够用,比如输入一个整数 int x;cin>>x;
输出一个字符串   cout<<s;
输出实数保留两位小数   cout<<fixed<<setpricision(2)<<x;(注意iomanip库)
输出一个整数占4个格子 cout<<setw(4)<<x; (注意iomanip库)
输出一个整数占4个格子,不足4位前面补0  cout<<setw(4)<<setfill(“0’)<<x;
输出数字对应的字符   cout<<char(x)
输出一个整数的16进制(8进制)cout<<hex<<uppercase<<x; (uppercase表示大写)
输出特殊字符 \ “ 等  \\ \t
关掉同步,读写缓冲   ios::sync_with_stdio(false);
改变键盘屏幕读写到文件读写  freopen(“1.in”,”r”,stdin); freopen(“1.out”,”w”,stdout);这样后面的都写全部换向到文件,信息学奥赛有人这样写:
#define file(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout) 也很有意思的。
经过了一段时间的学习,可以考虑使用scanf和printf进行输入输出,他们是为了兼容早期的C语言 而留下来的,最主要的特点是速度快。


考试的时候用文件进行输入输出,这就要在main函数里,cincout前加上文件关联语句,写成如下,还得在头文件里面包含cstdio

读到文件尾会产生一个错误码,
cin不能读入带空格的字符串,要换用 geiline(cin,s)

格式化输入语句scanf和格式化输出语句scanf在考试里面常常被用到,实验表明,在大量数据的读入时scanf耗时远小于cin,所以一般情况下高手都用scanf,更有高高手使用快读技术,核心是getchar和putchar,据说更快。

printf可以按照所需的格式输出数据,比如保留两位小数,输出16进制数等。
例子:x=1.0/6;printf(%.2f,x); 输出x保留两位小数。
printf(“%X”,x) 按十六进制输出一个数。
printf(“%O”,x) 按八进制输出一个数。
while(scanf(“%d”,&a)!=-1) {} 连续不断的读到文件尾
手动测试时ctrl+z或者F6表示输入结束

看看如下几个题目对应的读法
输入N和N个正整数,求他们的和 cin>>n;while (n--) {cin>>x;s+=x;}
输入若干正整数,以-1结尾,求他们的和,-1不包含在内cin>>x;while (x!=-1) {s+=x;cin>>x;}
in文件里面有若干正整数,求他们的和  while(cin>>x) s+=x;cout<<s; 注意中断这个要用F5或者ctrl_z
快读快写技术()

快读即快速读入,因为getchar比scanf要快,所以可以用getchar()代替scanf。
利用getchar()将输入的数字挨个判断,第一个while判断符号正负;第二个while判断数字并进行该数字的运算,每读入一个数字就将之前的数乘以十加上这个新的数字;两个while都不符合就说明该数输入完毕,返回该数的总值即绝对值*符号位。
inline int read(){
    register int x = 0, t = 1;
    register char ch=getchar(); // 读入单个字符到寄存器
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            t=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);  // 移位与异或
              // 第十行可以换成 x = x * 10 + ch - '0'
        ch=getchar();
    }
    return x*t;
}
快写  
inline void write(int x)
{
    if(x<0){
            putchar('-');
                x=-x;
        }
    if(x>9)
                write(x/10);
    putchar(x%10+'0');
}

格式化读入 13:23:54 cin>>ch;
混读很可怕! 123DEF linux 下的回车!
3.        几个常用的函数
floor(x)  ceil(x)  round
int(-2.3)  floor(-2.3)
pow(x,y)  x的y次方,返回是实数,可以用于大略估算,比如开方,三次根等。
log(x)= ln(x)
log10(x)  log2(x)
swap(x,y)
min(x,y)
isalpha() / isdigit() / isalnum() / islower() / isupper()
tolower/toupper
memset和memcpy(注意结合)
4.        常用的字符串函数
geiline整行读入数据,一般的cin或者scanf的读入是以空格为分隔的,要是读入含有空格的数据,比如外国人的姓名,cin和scanf就很麻烦,可以考虑使用geiline或者gets,但要注意最好全程getline,用了getline再混用cin和sacnf不是件好事。
假设字符串为s,重载了 + < >  等
s.size()和s.length()都是表示它的长度,但是注意他们的类型。
s[i]和s.at(i)表示它的第i位,
s.substr(i,j) 是截取s串从第i位开始的连续j个,得到一个新的字符串;
s.erase(i,j) 是删除从s串从第i位开始的连续j个,注意不是第i到第j位;
s.find(t,i)是在s串第i位开始的地方开始查找t串,输出t串的起始位置,未找到就输出-1;
s.insert(t,i) 是把t串插到s串第i位开始的地方,后面的顺移;

5.        位操作
Xor的妙用
求不超过x的最大2的幂次方   100 输出64  200 输出128

6.        控制语句
  ;和,
  a=b是有值的
  i++与++i
  if,for,while, do while,
break,continue,return

回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2023-7-1 14:54:48 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int x,k,w;const int mx=110;
  4. int a[mx];
  5. int main()
  6. {
  7.         cin>>x;
  8.         int i=0;
  9.         while (x>0)
  10.         {
  11.                 k=x%2;
  12.                 a[i]=k;
  13.                 x=x/2;
  14.                 i++;
  15.          }
  16.          for (i--;i>=0;i--) cout<<a[i];
  17.         return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2023-7-1 14:58:49 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int x,k,w;
  4. const int mx=110;
  5. string s;
  6. int main()
  7. {
  8.         cin>>x;
  9.         while (x>0)
  10.                 {
  11.                         k=x%2;
  12.                         x=x/2;
  13.                         s=char ('0'+k)+s;
  14.                 }
  15.         cout<<s;
  16.         return 0;
  17. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
地板
 楼主| 发表于 2023-7-1 15:07:20 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int x,k,w;
  4. string s;
  5. int main()
  6. {
  7.         cin>>s;
  8.         int l=s.size();
  9.         x=0;
  10.         for (int i=0; i<=l-1; i++)
  11.                 {
  12.                         k=s[i]-'0';
  13.                         x=2*x+k;
  14.                 }
  15.         cout<<x;
  16.         return 0;
  17. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
5#
 楼主| 发表于 2023-7-1 15:13:15 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int x,k,w;
  4. string s;
  5. int main()
  6. {
  7.         cin>>x;
  8.         cout<<oct<<x;
  9.         return 0;
  10. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
6#
 楼主| 发表于 2023-7-1 15:20:16 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.         char x;
  6.         cin>>x;
  7.         int y=0;
  8.         if (x>='a' && x<='z') y=1;
  9.         if (x>='A' && x<='Z') y=1;
  10.         cout<<"NY"[y];
  11.         return 0;
  12. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
7#
 楼主| 发表于 2023-7-1 15:31:36 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int x;
  4. string s;
  5. int main()
  6. {
  7.         cin>>x;
  8.         s="";
  9.         do
  10.                 {
  11.                         int k=x%2;
  12.                         x=x/2;
  13.                         s=char('0'+k)+s;
  14.                 }
  15.         while (x>0);
  16.         cout<<s;
  17.         return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
8#
 楼主| 发表于 2023-7-1 17:11:00 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int sa,sb;
  4. int main()
  5. {
  6.         char ch;
  7.         string s;
  8.         cin>>ch;
  9.         while (ch!='E')
  10.                 {
  11.                         if (ch=='W' || ch=='L')s=s+ch;
  12.                         cin>>ch;
  13.                 }
  14.         cout<<s;
  15.         int l=s.size();
  16.         sa=sb=0;
  17.         for (int i=0; i<=l-1; i++)
  18.                 {
  19.                         if (s[i]=='W') sa++;
  20.                         if (s[i]=='L') sb++;
  21.                         bool b1=(sa>=11||sb>=11);
  22.                         bool b2=abs(sa-sb)>=2;
  23.                         if (b1&& b2)
  24.                                 {
  25.                                         cout<<sa<<':'<<sb<<endl;
  26.                                         sa=sb=0;
  27.                                 }
  28.                 }
  29.         cout<<sa<<':'<<sb<<endl;
  30.         return 0;
  31. }
  32. /*
  33. WWWWWWWWWWXWWYWWWWWWWWXX
  34. WWLWE
  35. */
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
9#
 楼主| 发表于 2023-7-1 17:27:34 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int sum,mx;
  4. int main()
  5. {
  6.         int N;cin>>N;
  7.         sum=0;
  8.         int mxmoney=-1;
  9.         string sname,mxname;
  10.         int pjf,bjf;
  11.         char gb,xb;
  12.         int lw;
  13.         while (N--)
  14.                 {
  15.                         int money=0;
  16.                         cin>>sname>>pjf>>bjf>>gb>>xb>>lw;
  17.                         if (pjf>80 && lw>=1) money+=8000;
  18.                         if (pjf>85 && bjf>80) money+=4000;
  19.                         if (pjf>90) money+=2000;
  20.                         if (pjf>85 && xb=='Y') money+=1000;
  21.                         if (bjf>80 && gb=='Y') money+=850;
  22.                         sum+=money;
  23.                         if (money>mxmoney)
  24.                                 {
  25.                                         mxname=sname;
  26.                                         mxmoney=money;
  27.                                 }
  28.                 }
  29.         cout<<mxname<<endl;
  30.         cout<<mxmoney<<endl;
  31.         cout<<sum<<endl;
  32.         return 0;
  33. }
  34. /*
  35. 4
  36. YaoLin 87 82 Y N 0
  37. ChenRuiyi 88 78 N Y 1
  38. LiXin 92 88 N N 0
  39. ZhangQin 83 87 Y N 1

  40. */
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-1 22:33 , Processed in 0.104484 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表